F12 — Hero-component spine is a templating anti-pattern. The first
atelier proof (alexandria-fire) leaned on a single candle as scaffolding
under every scene with different text below — same hero, different
caption — which is exactly the "branded slides" pattern atelier was
supposed to break. The signature device is meant to appear in ONE or
at most two beats (typically the climactic moment), not as the visual
scaffolding of every scene. Each scene must earn its own composition:
a different primary visual subject, a different scale, a different motion
register. Doctrine added as step 1.5 in skills/meta/bespoke-composition.md
("Plan each scene as its own composition") plus a reviewer
scene_distinctness gate enforced at compose stage — the reviewer samples
one representative frame per scene and refuses to pass if two or more
scenes share their primary visual subject.
F9 — Captions/on-screen-text dedup. When a SerifLine reads the script
verbatim AND auto-captions emit the same text, the piece looks amateurish
even when the rest is beautiful. Rule added under engine mechanics: decide
once per piece whether captions add meaning (numbers, names, translations,
attributions) or are accessibility subtitles echoing narration — never
both for the same content. Reviewer gate at compose stage compares active
caption text against on-screen text in the same time window.
Both gates are CRITICAL; the publish-stage check was updated to expect
six (was four) resolved atelier findings.
Self-audit of alexandria-fire under the new rules: 4 of 5 scenes share
the candle as their primary visual subject — would now flag CRITICAL
scene_distinctness and require re-planning. (Re-author the piece in a
follow-up; the doctrine is the deliverable here.)
24 KiB
Reviewer — Meta Skill
When to Use
After completing any pipeline stage's work — before checkpointing. You are the quality gate between "work done" and "work accepted." This skill replaces the Python reviewer class with an instruction-driven self-review protocol.
Every stage gets reviewed. No exceptions. The review quality determines whether the final video is worth watching.
Critique Quality (CHAI Rules)
Findings ≠ critiques. A finding identifies a problem; a critique tells the next stage how to fix it. The CMU/Harvard CHAI study ("Building a Precise Video Language with Human-AI Oversight", arXiv 2604.21718v2) showed that critique quality, measured on three axes, directly governs downstream output quality. Apply all three to every reviewer pass.
Accurate. Every finding must reference a concrete artifact field, line number, or visible asset frame. Forbid hallucinated criticism — if you cannot point to where the problem is, you are guessing.
Complete. A reviewer pass that catches one mistake while missing a second is worse than scoring "needs another pass" and continuing. If you find one critical issue, scan for the rest of the same class before returning. Pattern-match: where else in this artifact could the same mistake be hiding?
Constructive. Every "critical" finding MUST propose a concrete fix, not just identify the problem. "Caption is wrong" → "Caption says 'man on the right'; the man is on the left of the frame. Replace with 'the man on the left of the frame.'" If you cannot propose a fix, label the finding as "investigation" not "critical."
Removing any of these three properties measurably hurts pipeline output. The reviewer is the choke point — be rigorous.
Protocol
Step 1: Load Review Context
Before reviewing, gather:
- Review focus items from the pipeline manifest for this stage (
review_focusfield) - Success criteria from the manifest for this stage (
success_criteriafield) - Active playbook quality rules
- The artifact produced by the stage
Step 2: Schema Validation
First, the non-negotiable check:
- Validate the artifact against its JSON schema (
schemas/artifacts/<name>.schema.json) - If schema validation fails, this is a critical finding — fix immediately, do not proceed
Step 3: Review Against Focus Items
For each review_focus item from the manifest:
- Evaluate the artifact against this specific criterion
- Assign a severity:
- critical — Must fix before proceeding. The artifact is broken, incomplete, or dangerously wrong. Per CHAI rules, every critical finding MUST carry a
proposed_fix(concrete replacement text, exact field value, or specific corrective action). A critical finding without a proposed fix is downgraded toinvestigation. - suggestion — Should fix. Improves quality significantly but doesn't block progress. Suggestions MUST carry a
proposed_changedescribing how to improve. - nitpick — Could fix. Minor polish that's nice-to-have. May stand alone without a proposed change.
- investigation — A real concern but you cannot pinpoint the fix. Surface it for the next round; do not block on it.
- critical — Must fix before proceeding. The artifact is broken, incomplete, or dangerously wrong. Per CHAI rules, every critical finding MUST carry a
- Write a specific, actionable finding (not vague)
Good finding: "Section 3 narration is 180 words for a 10-second window — that's 1080 wpm, impossible to speak. Cut to 25 words." Bad finding: "Script might be too long."
Step 4: Cross-Check Against Playbook
If a style playbook is active, verify:
- Color references match playbook palette
- Transition types are in the playbook's allowed set
- Pacing rules are respected (min/max durations)
- Asset descriptions include playbook style cues
- Quality rules are not violated
Each violation is a suggestion severity finding.
Step 5: Evaluate Success Criteria
For each success_criteria item from the manifest:
- Is the criterion met? (yes/no/partial)
- If not met, create a critical finding
Step 6: Make a Decision
Count findings by severity:
| Scenario | Action |
|---|---|
| 0 critical, any suggestions/nitpicks | Pass — proceed to checkpoint. Note suggestions for the record. |
| 1+ critical findings | Revise — fix all critical findings, then re-review (max 2 rounds). |
| After 2 revision rounds, still critical | Pass with warnings — proceed anyway, note unresolved issues. Never block indefinitely. |
Step 7: Record Review
Structure your review as:
## Review: [stage_name] — Round [N]
**Decision:** PASS / REVISE / PASS_WITH_WARNINGS
### Findings
1. [CRITICAL] Title of finding
- Description: What's wrong
- Action: What to fix
- Status: pending / fixed / accepted / deferred
2. [SUGGESTION] Title of finding
- Description: What could be better
- Action: How to improve
- Status: pending / accepted / deferred
### Summary
- Critical: N (N fixed)
- Suggestions: N
- Nitpicks: N
- Playbook violations: N
- Success criteria met: N/M
Key Principles
-
Be specific, not vague. "The hook is weak" is useless. "The hook asks a question but doesn't create urgency — try leading with the surprising stat from key_point #2" is actionable.
-
Critical means critical. Don't inflate severity. A missing schema field is critical. A slightly wordy paragraph is a suggestion. A comma splice is a nitpick.
-
Two rounds max. The goal is shipping, not perfection. After two revision rounds, pass with warnings and move on. Perfectionism kills pipelines.
-
Review the artifact, not the process. You're checking the output, not how it was produced. If the brief is compelling, it doesn't matter if the agent used an unusual approach.
-
Playbook is law. If the playbook says "no more than 3 colors on screen," that's not a suggestion — it's a constraint. Violations are always flagged.
Stage-Specific Review Guidance
| Stage | What matters most |
|---|---|
| research | Source diversity, claim verifiability, visual reference quality |
| proposal | Delivery promise clarity, renderer family AND render runtime selection, music/voice plan, decision log started |
| idea | Hook uniqueness, research depth, angle diversity |
| script | Timing accuracy, narrative arc, enhancement cue density |
| scene_plan | Full coverage, visual variety, asset feasibility, slideshow risk score |
| assets | File existence, style consistency, budget adherence |
| edit | Timeline coverage, audio sync, subtitle presence, delivery promise compliance |
| compose | Playability, duration accuracy, audio quality, pre-compose validation pass |
| publish | SEO quality, metadata completeness, export packaging |
Reference Alignment Review
Run at every stage when a VideoAnalysisBrief exists (reference-driven production).
Checks:
-
Grounding check: Does the output reference specific findings from the VideoAnalysisBrief, or is it making things up about the reference?
- Proposal mentions "fast pacing" but reference pacing_style is "slow_contemplative" → CRITICAL
- Script claims reference has narration but VideoAnalysisBrief shows no narration → CRITICAL
-
Differentiation check: Does each concept/scene have a clear creative difference from the reference, or is it a copy?
- Proposal is a carbon copy of the reference (same topic, same structure, same treatment) → CRITICAL
- At least one element per concept MUST differ from the reference → SUGGESTION if weak
- Creative differentiation seeds from the brief should be reflected in proposals
-
Promise preservation: Are the elements the user said they loved about the reference still present in the output?
- User said "I love the pacing" but scene_plan has 2x longer scenes → SUGGESTION
- User said "keep the hook style" but script uses a different hook → SUGGESTION
-
Cost alignment: Is the cost estimate still accurate, or has scope crept?
- If actual spend exceeds estimate by >30% without user re-approval → CRITICAL
- If new assets were added beyond the approved proposal → SUGGESTION
Severity:
- Factual errors about the reference video: CRITICAL
- Carbon copy with no differentiation: CRITICAL
- Weak differentiation (surface-level changes only): SUGGESTION
- User preference not honored: SUGGESTION
- Cost drift >30%: CRITICAL
Slideshow Risk Review
Run at scene_plan and edit stages. Use lib/slideshow_risk.py to compute the score.
At scene_plan stage:
- Compute
score_slideshow_risk(scenes, renderer_family=renderer_family) - If verdict is "fail" (average ≥ 4.0): CRITICAL — scene plan must be revised before proceeding
- If verdict is "revise" (average ≥ 3.0): SUGGESTION — flag specific dimensions scoring ≥ 3.5
- If verdict is "strong" or "acceptable": note in review summary, no finding needed
At edit stage:
- Recompute with full edit_decisions:
score_slideshow_risk(scenes, edit_decisions, renderer_family) - Same thresholds apply — if the edit stage made things worse (higher score than scene_plan), flag it
What to flag per dimension:
| Dimension | What to say when score ≥ 3.0 |
|---|---|
| repetition | "X scenes use the same layout/shot size — vary the visual grammar" |
| decorative_visuals | "X scenes have no stated purpose (no information_role or shot_intent)" |
| weak_motion | "Camera movement exists but lacks narrative justification" |
| weak_shot_intent | "X scenes are missing shot_intent — why does this frame exist?" |
| typography_overreliance | "X% of scenes are text/stat cards — video feels like animated slides" |
| unsupported_cinematic_claims | "Claiming cinematic but missing hero moments / lighting / movement" |
Decision Log Review
Run at every stage after proposal. The decision log (schemas/artifacts/decision_log.schema.json) is a cumulative audit trail.
Checks:
- Existence: Does the checkpoint reference a
decision_log_ref? If not after proposal stage, flag as SUGGESTION. - Coverage: Does every major choice have an entry? Key decisions that MUST be logged:
- Provider selection (which image/video/audio tool and why)
- Style/playbook selection
- Music track selection
- Voice selection
- Renderer family selection
- Any fallback or downgrade (e.g., motion → still)
- Quality: Each decision should have:
- At least 2
options_considered(not just the one picked) - A
reasonthat isn't boilerplate ("best option" is not a reason) - Correct
confidence(0.0–1.0) — flag if everything is 1.0 (unrealistic)
- At least 2
- User visibility: Decisions marked
user_visible: trueshould be ones the user would actually care about (not internal routing)
Severity:
- Missing decision log after proposal: SUGGESTION (first time), CRITICAL (if still missing at edit stage)
- Decision with only 1 option considered: SUGGESTION — "Log rejected alternatives for auditability"
- All decisions at confidence 1.0: SUGGESTION — "Unrealistic confidence — at least provider selection involves tradeoffs"
Creative Differentiation Review
Run at scene_plan and edit stages. Prevents the "every video looks the same" failure mode.
Checks:
-
Variation check (scene_plan only): Use
lib/variation_checker.py→check_scene_variation(scenes).- If verdict is "poor" (score ≤ 2): CRITICAL — "Scene plan lacks variety: [list violations]"
- If verdict is "fair" (score ≤ 3): SUGGESTION — note specific suggestions from the checker
-
Playbook alignment: Is the active playbook appropriate for this content?
- Cinematic trailer using "clean-professional" theme → flag mismatch
- Educational explainer using "anime-ghibli" theme without user request → flag
-
Shot language completeness (scene_plan):
- Every scene should have at least
shot_sizeandshot_intent - Hero moments should have full shot_language (all 6 fields)
- Flag scenes with empty shot_language as SUGGESTION
- Every scene should have at least
-
Renderer family match (edit stage):
- Does
renderer_familyin edit_decisions match what was set at proposal? - If changed without documented reason in decision log → CRITICAL
- Does
-
Render runtime match (edit and compose stages):
render_runtimein edit_decisions must match proposal_packet.production_plan.render_runtime- If changed without a
render_runtime_selectiondecision logged in decision_log → CRITICAL - At compose stage,
final_review.checks.promise_preservation.runtime_swap_detectedmust befalse. Iftruewithout an approvedrender_runtime_selectiondecision → CRITICAL - Runtime unavailable at compose time is not an excuse for silent swap — the correct behavior is to escalate, get approval, log a decision, then run.
-
Runtime selection presented both options (proposal stage, MANDATORY):
- Query
video_compose.get_info()["render_engines"]. If bothremotionandhyperframesshowTrue, therender_runtime_selectiondecision indecision_logMUST have BOTH runtimes inoptions_considered. - A
render_runtime_selectionwith only one runtime inoptions_consideredwhen both were available on the machine → CRITICAL. The agent silently defaulted; the user was not presented the alternative. Re-open the proposal stage and present both. - If only one runtime was available,
options_consideredmust still list the unavailable one withrejected_because: "runtime not available on this machine"— otherwise the audit trail loses the fact that the choice was constrained, not discretionary. - Per AGENT_GUIDE.md > "Present Both Composition Runtimes (HARD RULE)": the pipeline's suggested "default" runtime is NOT a license to skip the conversation with the user.
- Query
Delivery Promise Review
Run at edit and compose stages. Uses lib/delivery_promise.py.
At edit stage:
- Extract delivery promise from proposal packet or edit_decisions metadata
- Run
promise.validate_cuts(cuts)against the resolved cut list - If
validis False: CRITICAL — "Delivery promise violation: [violations]" - Check
motion_ratio: if a motion-led promise has < 50% motion cuts, flag even if technically valid
At compose stage:
- The
_pre_compose_validation()in video_compose.py enforces this automatically - Review should verify the validation was not bypassed (check render report for warnings)
- If render succeeded despite low motion ratio on a motion-led promise, flag as SUGGESTION
Source Understanding Review
Run at research and proposal stages when user-supplied media files exist.
Checks:
- Existence: If user-supplied files were provided to the project, does a
source_media_reviewartifact exist?- If user media exists but no
source_media_review: CRITICAL — "User supplied media but the agent did not inspect it before planning. Runlib/source_media_review.review_source_media()before proceeding."
- If user media exists but no
- Actual inspection: Does every file entry have
reviewed: trueand a non-emptytechnical_probe?- If
reviewedis missing ortechnical_probeis empty: CRITICAL — "The source_media_review claims review but contains no probe data. The file was not actually inspected."
- If
- Planning reflection: Do the
planning_implicationsappear in the proposal's production plan?- If quality risks were identified (e.g. low resolution, mono audio) but the proposal doesn't mention them: SUGGESTION — "Source media has quality risks that the proposal does not address."
- Content accuracy: Does the plan rely on content that the source media does not actually contain?
- E.g. plan assumes interview dialogue but transcript_summary shows no speech: CRITICAL — "Plan assumes dialogue but source media contains no speech."
- No hallucinated content: The agent must not infer unsupported content from filenames alone. If
content_summarysays "interview footage" but the probe only shows 3s of silent video, flag as CRITICAL.
Severity:
- Missing
source_media_reviewwhen user files exist: CRITICAL at proposal stage - Unreviewed files (no probe): CRITICAL
- Plan doesn't reflect quality risks: SUGGESTION
- Plan assumes content not in source: CRITICAL
Final Self-Review Review
Run at compose and publish stages. Ensures the agent reviewed the actual rendered output.
At compose stage:
- Existence: Does a
final_reviewartifact exist alongside therender_report?- If missing: CRITICAL — "Compose produced a render_report but no final_review. The agent must inspect the rendered output before presenting it."
- Status check: What is
final_review.status?pass→ OK, proceedrevise→ The agent should have fixed issues before presenting. If the pipeline continued anyway: CRITICAL — "Self-review found revise-worthy issues but the agent presented anyway."fail→ The pipeline MUST NOT proceed. If it did: CRITICAL
- Check completeness: All 5 required checks must have data:
technical_probemust show a valid container with plausible duration/resolutionvisual_spotcheckmust haveframes_sampled >= 4audio_spotcheckmust report narration/music presencepromise_preservationmust confirmdelivery_promise_honoredsubtitle_checkmust report presence/absence- Any check with missing data: SUGGESTION — "Self-review check [X] has incomplete data"
- Promise preservation: If
promise_preservation.silent_downgrade_detectedis true: CRITICAL — "Self-review detected silent downgrade from motion-led to still-led."
At publish stage:
- Verify that
final_reviewwas passed through as a required artifact - If
final_review.statusis notpass: CRITICAL — "Cannot publish with a non-passing self-review" - If
final_review.issues_foundis non-empty andrecommended_actionis notpresent_to_user: SUGGESTION — "Self-review found issues; verify they were resolved before publishing"
Composition Authoring Mode Review
The templated→atelier inversion (AGENT_GUIDE.md → "Composition Authoring Mode" + skills/meta/bespoke-composition.md) is governance, not a suggestion. The reviewer is the enforcement point: without these checks, the next agent quietly defaults back to the stock cut-schema and every video starts looking the same again.
At proposal stage:
decision_logmust contain acomposition_modedecision withoptions_considered: ["templated","atelier"]and aselectedvalue with a real reason tied to the brief.- Missing
composition_modedecision entirely: CRITICAL — "Proposal missing composition_mode choice. Atelier vs templated is a mandatory presented decision (see AGENT_GUIDE.md → Composition Authoring Mode)." - Decision logged with only one option considered: CRITICAL — "composition_mode decision logged without presenting both templated and atelier alternatives."
- Missing
- For hero work (brief tagged marketing / launch / brand piece / explainer-with-quality-bar / any single-deliverable where quality is the point) where
selected == "templated": CRITICAL — "Hero brief locked composition_mode='templated'. Default is atelier per doctrine; templated requires an explicit reason indecision_log.<entry>.reason(e.g. localization variant, batch, time-boxed draft)." Only suppress if the reason field names a sanctioned exception. - If
composition_mode == "atelier"andproposal_packetlacks anart_directiondeclaration (palette, type, motion, signature device): CRITICAL — "Atelier proposal missing art-direction commitment. Perskills/meta/bespoke-composition.mdstep 1, art direction must be written down before authoring scenes."
At scene_plan / edit stage (when composition_mode == "atelier"):
edit_decisions.composition_modemust equal"atelier"andedit_decisions.bespoke.{entry, composition_id, art_direction}must all be set.- Missing any of
entry/composition_id: CRITICAL — "Atelier compose contract incomplete; render will be rejected by_render_via_atelier." - Missing
art_direction: CRITICAL — "Atelier without an art-direction declaration; reviewer cannot evaluate distinctness."
- Missing any of
- Any presence of stock
cut.typescene-types (text_card,stat_card,bar_chart,kpi_grid,callout,comparison,hero_title,terminal_scene,anime_scene,progress_bar,pie_chart,line_chart) inedit_decisions.cuts: CRITICAL — "Atelier piece reaches for stock cut.type {name}. Hand-author the scene; the stock registry is a mechanics codex, not a parts bin (skills/meta/bespoke-composition.md)."
At compose stage (when composition_mode == "atelier"):
- The compose stage's
final_review.checks.atelierblock must exist. If absent: CRITICAL — "Atelier render skipped doctrine checks —_render_via_atelierreturned withoutatelierchecks; investigate tool wiring." - If
final_review.checks.atelier.stock_reuse_detected == true: CRITICAL — "Stock-registry import inside bespoke project ({offending_imports[0].file} → {offending_imports[0].import}). Hand-author the scene; do not import from the stock src/." - If
final_review.checks.atelier.art_direction_declared == false: CRITICAL — "Atelier render with no art-direction declaration. Setedit_decisions.bespoke.art_directionbefore re-render." - Scene distinctness — no hero-component spine (mandatory record). Sample one representative frame per scene (e.g. mid-window of each
props.sections[i]) and answer in the review record:- Does each scene have a distinct primary visual subject? If two or more scenes share their primary visual (same hero element merely re-captioned — the candle that never leaves, the browser frame on every beat, the score ring as scaffolding): CRITICAL — "Hero-component spine detected: scenes {ids} share their primary visual subject. Per
skills/meta/bespoke-composition.mdstep 1.5, each scene must earn its own composition; the signature device belongs to one climactic beat, not as scaffolding. Re-plan the affected scenes." - Is the signature device named in
art_directionactually present in at least one beat? (no ⇒ CRITICAL, re-author or update the declaration to match what was actually built) - Is the signature device present in most beats? (yes ⇒ CRITICAL — see hero-component-spine above; signature is meant to be scarce) This check cannot be skipped silently; absence of a recorded scene-by-scene inventory is itself CRITICAL ("scene_distinctness inventory not recorded").
- Does each scene have a distinct primary visual subject? If two or more scenes share their primary visual (same hero element merely re-captioned — the candle that never leaves, the browser frame on every beat, the score ring as scaffolding): CRITICAL — "Hero-component spine detected: scenes {ids} share their primary visual subject. Per
- Captions / on-screen text dedup (mandatory check). Compare the active caption text to any on-screen text rendered in the same time window:
- If they are the same content (caption echoes the scene's title/headline that the narration is already reading aloud): CRITICAL — "Caption duplicates on-screen text at {t}s ('{text}'). Decide once per piece whether captions add meaning (numbers, names, translations) or are accessibility subtitles; do not do both for the same line. Either clear
captions=[]for these scenes or remove the redundant on-screen SerifLine."
- If they are the same content (caption echoes the scene's title/headline that the narration is already reading aloud): CRITICAL — "Caption duplicates on-screen text at {t}s ('{text}'). Decide once per piece whether captions add meaning (numbers, names, translations) or are accessibility subtitles; do not do both for the same line. Either clear
- Distinctness review (human-judged, mandatory). Before approving the render, the reviewer must explicitly answer in the review record:
- "Could this video be any other product's video?" (yes ⇒ CRITICAL, re-author art direction)
- "Does its visual language reuse a look from a prior piece I've made?" (yes ⇒ CRITICAL, re-author) Distinctness is taste-call territory the tool can't automate; reviewer absence on this question is itself a CRITICAL finding ("distinctness review not recorded").
At publish stage (when composition_mode == "atelier"):
- All six atelier compose-stage checks above (existence of
atelierblock, stock_reuse, art_direction_declared, scene_distinctness, captions/text dedup, human distinctness review) must showresolvedin the review record. Any unresolved: CRITICAL — "Cannot publish atelier piece with unresolved doctrine or distinctness findings."