Skip to content

cinetic v0.5.0

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 28 Sep 23:46

Blind reviews found films sparse, static at the end and quiet at the payoff. This version fills the frame, keeps the end moving, lets the music lead, and removes a compression smear from blurred masters.

Added

  • Compression smear check in forensics.py. Flat fields (at least 1% of the frame, 98% within ±2 of one code value) are split into 16 px blocks of the exact luma plane and sampled twice per second. A smeared share over 0.2 of the frame fails on two samples and warns on one, and a ×25 smear.png sheet is written. finishing.md §5 documents the cause and the fix.
  • render.sh --10bit encodes a blurred master as High 10 (yuv420p10le), for masters that will be graded or re-encoded.
  • palette.py --stage-hue and --stage-chroma give the stage a hue from the brand's world (pine-black 160, deep teal 200, ink-navy 235). A purple stage hue (270-340) is refused and a warm one (31-118) gets a warning. A dark stage at h 235-270 with C < 0.02 gets a note that it is the stock dev-tool theme.
  • Per-film loudness target: the gate reads master.lufs from audio/score.json and accepts −14 or −16 LUFS when none is set. −16 is allowed for calm brands and stings.
  • av-audit.py warns when the first 5 ms of audio peak above −40 dBFS.
  • brand-svg.ts reads an optional LOCKUP token (ratio, gap, weight, track) from tokens.ts, so the brand kit's SVG lockups match the film's lockup. It prefers a font vendored by add-font.mjs over node_modules.
  • Lint regression tests: scripts/test/lint-film.test.mjs runs lint-film.mjs on 11 fixtures that declare their expected hits. It also checks that both starters fail only on their placeholder markers and lint clean without them, and that palette.py refuses banned accents and papers unless --brand-supplied is passed.

Changed

  • Films fill the frame. The hero covers about 40-70% of a product shot, no region larger than about a quarter of the frame stays empty outside designed negative space, and in vertical feeds the platform's caption and button zones get background instead of empty bands.
  • The last third keeps moving. The lockup appears once, at the end, and brand logo time stays at or under about 12% of the runtime.
  • The music leads the picture with a progress motif and resolves on a lockup chord. A feature video lands its value in one short payoff line.
  • Text in flight stays under about 20 px/f.
  • Renders are stopped by their own PID, never with a pkill -f pattern that can kill other renders on a shared machine.
  • Step 1 adds the feature-word test: watching muted, a stranger should use the brief's word for the feature.

Fixed

  • Flat backgrounds in blurred masters no longer smear under compression. swscale's 8×8 ordered dither turned a flat paper that fell between two code values into a 228/229 checker that x264 kept in some blocks and flattened in others. accumulate.py now does the BT.709 conversion in float and quantizes once, so flat fields round exactly, and TPDF dither goes only into smooth ramps, with one fixed pattern.
  • Posters come from a clean lossless still instead of a frame decoded from the H.264 master, which baked 4:2:0 chroma and block smear into the image. deliver.sh uses --poster-from, else a Remotion still of --comp, else the last frame kept by hf-finish.sh. If the still does not match the master's frame (mean absolute difference at most 2, at most 0.25% of pixels more than 32 levels off), it warns and uses the master's frame.
  • The soundtrack no longer clicks on its first sample. master.py applies a 3 ms raised-cosine fade-in from zero at sample 0 and a fade-out of at least 10 ms after the limiter.

Install with the skills CLI: npx skills add Leonxlnx/cinetic

Or download cinetic.skill below: a zip of the skill folder with cinetic/SKILL.md at its root.