diff --git a/skills/meta/bespoke-composition.md b/skills/meta/bespoke-composition.md index 083ce76d..04b692b6 100644 --- a/skills/meta/bespoke-composition.md +++ b/skills/meta/bespoke-composition.md @@ -43,6 +43,37 @@ direction each time. Write it down (a short `art-direction.md` in the project) a Ask yourself: *what visual metaphor belongs to this subject that I have not used before?* If the answer resembles a past piece, you haven't found the direction yet. +### 1.5 Plan each scene as its own composition — no hero-component spine +The most insidious form of templating sneaks back in at the *scene* level: pick one striking +visual (a candle, a browser frame, a score ring), then re-use it every scene with different +text underneath. The piece feels custom because the hero is custom — but every scene is +mechanically the same composition. That's branded slides, not a film. **Don't do that.** + +The signature device named in your art-direction is meant to appear in **one or at most two +beats** — typically the climactic moment — not as the visual scaffolding of every scene. It +earns its weight by being scarce. + +For each scene in the plan, answer concretely *before* writing code: + +- **What is this scene's primary visual subject?** It must be *different* from the previous + scene's. A character. A diagram. A piece of evidence. A landscape. A typographic moment. The + signature device. A void. Each scene's primary subject is its job. +- **Why does this beat exist?** What does it do for the story that no other beat does? If you + can collapse two scenes into one without losing meaning, you should. +- **How does it differ visually from the scene before and after?** Different composition (rule + of thirds vs centered vs split). Different scale (intimate close vs wide field). Different + motion register (still vs busy). Different palette emphasis. Different type treatment. +- **If you removed the signature device from this scene, would the scene still work?** If yes, + the signature device probably doesn't belong in this scene — it's there as filler. Cut it. + +The reviewer enforces this as a "scene_distinctness" check (see +`skills/meta/reviewer.md` → Composition Authoring Mode Review): a recorded inventory of +each scene's primary subject + first frame, and an explicit answer to "do any two scenes +share their primary visual subject?" Yes ⇒ CRITICAL ⇒ re-plan. + +The corollary: the per-scene plan is a *first-class artifact*, not implied. Write it down +(in `art-direction.md` or a sibling `scenes.md`) before authoring `Composition.tsx`. + ### 2. Decide the motion language — principles, not presets Reach for **principle** skills, never finished animations: - **`framer-motion`** and **`lottie-bodymovin`** — Disney's 12 principles (anticipation, staging, @@ -75,6 +106,13 @@ Recurring mechanics that bite if you don't know them: - **GSAP-in-Remotion**: use a `paused` timeline and `.seek(frame/fps)` — never `requestAnimationFrame` — so frames render deterministically. - **Fonts**: `loadFont()` from `@remotion/google-fonts/` at module scope, once. +- **Captions vs on-screen text — pick one role, never both for the same content.** Decide + once per piece, before authoring: are captions adding meaning the spoken words can't carry + (a number, a name, a translation, a quote attribution), OR are they accessibility subtitles + echoing the narration? If your scene already displays a SerifLine that reads the script + verbatim, do NOT also emit an auto-caption with the same text — the doubled phrase looks + amateurish even when the rest of the scene is beautiful. Empty `captions=[]` in props, or + scope captions only to scenes where the on-screen text differs from what's being said. ### 5. Render through the atelier path (project-local, throwaway) Bespoke scenes are **throwaway and project-local** — they never enter the shared `src/` registry. diff --git a/skills/meta/reviewer.md b/skills/meta/reviewer.md index 6d1d6478..f47f1310 100644 --- a/skills/meta/reviewer.md +++ b/skills/meta/reviewer.md @@ -327,11 +327,17 @@ The templated→atelier inversion (`AGENT_GUIDE.md` → "Composition Authoring M 1. The compose stage's `final_review.checks.atelier` block must exist. If absent: **CRITICAL** — "Atelier render skipped doctrine checks — `_render_via_atelier` returned without `atelier` checks; investigate tool wiring." 2. 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/." 3. If `final_review.checks.atelier.art_direction_declared == false`: **CRITICAL** — "Atelier render with no art-direction declaration. Set `edit_decisions.bespoke.art_direction` before re-render." -4. **Distinctness review (human-judged, mandatory).** Before approving the render, the reviewer must explicitly answer in the review record: +4. **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.md` step 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_direction` actually 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"). +5. **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." +6. **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) - - *"Is the signature device named in `art_direction` actually present in the rendered frames?"* (no ⇒ CRITICAL, re-author or update the declaration to match what was actually built) 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"): -1. All four atelier compose-stage findings above must show `resolved` in the review record. Any unresolved: **CRITICAL** — "Cannot publish atelier piece with unresolved doctrine or distinctness findings." +1. All six atelier compose-stage checks above (existence of `atelier` block, stock_reuse, art_direction_declared, scene_distinctness, captions/text dedup, human distinctness review) must show `resolved` in the review record. Any unresolved: **CRITICAL** — "Cannot publish atelier piece with unresolved doctrine or distinctness findings."