docmontage: make music + end-tag mandatory, add Remotion EndTag component

User override during the audit runs made music and an end-tag MANDATORY
defaults for documentary-montage (narration stays optional). This commit
codifies those defaults into the pipeline manifest + director skills and
ships the Remotion end-tag component that the compose stage now
concatenates after the FFmpeg body.

Changes:

- pipeline_defs/documentary-montage.yaml: idea/edit/compose stages now
  require music_plan and end_tag_plan to be present; opt-out requires
  an explicit user note recorded in metadata.

- skills/pipelines/documentary-montage/idea-director.md: rewrote sections
  4 (music MANDATORY), 5 (end-tag MANDATORY with shape
  {text,palette,duration_seconds,render_engine:remotion,component:EndTag}),
  6 (narration OPTIONAL), 7 (updated brief JSON shape), 8 (quality gate).
  Common Pitfalls grew two entries covering silent-contract drift and
  end-tag omission.

- skills/pipelines/documentary-montage/compose-director.md: section 4
  now stops on music-contract violation; new section 4b documents the
  two-engine flow (FFmpeg body -> npx remotion render EndTag -> ffmpeg
  concat). Quality gate checks render_report.metadata.music_mixed and
  end_tag_rendered.

- remotion-composer/src/components/EndTag.tsx (new): bold uppercase
  typographic end-card with animated 0->100% underline draw-in and a
  single left-to-right shimmer sweep. Supports cool_offwhite_on_black
  and warm_ivory_on_black palettes. Renders at 1920x1080 @ 30fps.

- remotion-composer/src/Root.tsx: register EndTag as a first-class
  composition (durationInFrames=165, 5.5s hold) so it can be rendered
  standalone via the Remotion CLI with --props overrides.
This commit is contained in:
calesthio
2026-04-11 00:42:53 -07:00
parent de94d4dba3
commit b80b7a0a61
5 changed files with 351 additions and 18 deletions
+14 -7
View File
@@ -54,11 +54,14 @@ stages:
- Thematic question is ONE sentence
- Tone register is ONE value from the fixed list
- Duration and shape are concrete
- Music plan is resolved or explicitly silent
- Music plan is present (MANDATORY — silent only if user explicitly opted out)
- End-tag plan is present (MANDATORY — one philosophical closing line, rendered as Remotion end-card, unless user explicitly opted out)
- Narration plan is present (narration itself is OPTIONAL — absence is fine if music + visuals + end-tag carry the register)
success_criteria:
- Schema-valid brief artifact
- thematic_question present in metadata
- music_plan present in metadata
- music_plan present in metadata (source may be `none` ONLY with explicit user opt-out note)
- end_tag_plan present in metadata (text, palette, duration — may be `null` ONLY with explicit user opt-out note)
- name: scene_plan
skill: pipelines/documentary-montage/scene-director
@@ -125,8 +128,9 @@ stages:
- Hero slots hold longest; mid-sequence cutaways shortest
- No two adjacent cuts share subject AND scale
- Transition vocabulary is at most 4 distinct values
- Music config is present OR brief explicitly says no music
- total_duration_seconds matches sum of cut durations
- Music config is present (MANDATORY — silent only if brief.metadata.music_plan.source=none with explicit opt-out note)
- End-tag cut is present at the tail (MANDATORY — rendered separately via Remotion, concatenated after body, unless brief.metadata.end_tag_plan is null with explicit opt-out note)
- total_duration_seconds matches sum of cut durations INCLUDING the end-tag hold
- Every cut has a reason
success_criteria:
- Schema-valid edit_decisions artifact
@@ -156,12 +160,15 @@ stages:
checkpoint_required: true
human_approval_default: false
review_focus:
- Output duration matches planned within 1s
- Output duration matches planned within 1s (body + end-tag inclusive)
- Resolution matches target_platform canvas
- Uniform LUT applied across the timeline
- Music present iff brief planned for it
- First and last frames verified
- Music is mixed in (MANDATORY — silent output only with explicit user opt-out recorded in brief)
- End-tag MP4 rendered via Remotion and concatenated at the tail (MANDATORY — absence only with explicit opt-out)
- First and last frames verified (last frame must be the end-tag card unless opted out)
- No silent fallback from a motion-led promise
success_criteria:
- Schema-valid render_report artifact
- Output file exists and passes ffprobe validation
- render_report.end_tag_rendered = true (or explicit opt-out)
- render_report.music_mixed = true (or explicit opt-out)