Skip to content

fix(video_compose): pass per-cut tone and filter to CinematicRenderer - #920

Open
executorrr86 wants to merge 1 commit into
OpenMontageInc:mainfrom
executorrr86:fix/cinematic-cut-tone-filter
Open

executorrr86 wants to merge 1 commit into
OpenMontageInc:mainfrom
executorrr86:fix/cinematic-cut-tone-filter

Conversation

@executorrr86

Copy link
Copy Markdown
Contributor

Summary

CinematicRenderer reads tone and filter on each video scene, and its fixtures use them, but video_compose's cut adapter (_cuts_to_cinematic_scenes) drops both. Every clip gets the default CSS filter and cold colour wash, and edit_decisions has no way to change or turn them off. On footage that is already dark or graded, the picture comes out much darker than the source.

This passes both fields through, accepts them on cuts in the schema, and adds tone: "none" to remove the wash.

Related issue

None. Refs #41, whose adapter copied these fields but was never merged, and #459, which adds a single piece-wide metadata.cinematic_tone, without none or filter.

Changes

  • video_compose.py: the cut adapter copies tone and filter to the video scene when the cut sets them. Cuts without them produce the same scenes as before.
  • CinematicRenderer.tsx / cinematic/types.ts: new tone none (no wash).
  • edit_decisions.schema.json: tone (enum cold, steel, void, neutral, none) and filter (string) on cuts. Without them a cut with tone fails the checkpoint ("Additional properties are not allowed"). The descriptions say title cuts ignore them.
  • skills/pipelines/cinematic/compose-director.md: one paragraph on the default grade and how to turn it off.

Measured

Frame 30 of a flat grey clip (value 128), centre of the frame, through the adapter and remotion still:

Cut setting Centre value
nothing (default) 84
tone: "none" 118
filter: "none" 91
tone: "neutral", filter: "none" 91
tone: "none", filter: "none" 128

On main, every row comes out as the default (84): the scene reaches the renderer with no tone or filter. The vignette is not affected: corners stay darker even with both set to none.

Testing

  • npx tsc --noEmit: clean.
  • Full pytest tests: 2924 passed, 17 skipped.
  • test_cinematic_remotion_adapter.py: the adapter copies both fields and leaves cuts without them unchanged.
  • test_phase0_contracts.py: the schema accepts a valid grade and rejects tone: "warm" and a non-string filter.
  • test_cinematic_cut_grade_render.py renders real frames: the default still darkens, tone+filter none keeps 128, and tone: "none" alone sits between them. It is skipped when Remotion is not installed, so it does not run in the current CI job.
  • I removed each part in turn and the tests caught it: the none case in the TSX (2 failures), the adapter lines (3) and the schema fields (1).

Checklist

  • The change is focused on a single logical concern.
  • I ran the relevant tests locally (make test-contracts / make test) where applicable.
  • I updated docs/README if behavior or usage changed.
  • No unrelated files (build artifacts, local config) are included in the diff.

🤖 Generated with Claude Code

CinematicRenderer already reads tone and filter on each video scene, but the
cut adapter dropped them, so every clip got the default filter and cold wash
and there was no way to turn them off from edit_decisions. The adapter now
copies them, the schema accepts them on cuts, and tone "none" removes the wash.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant