music-video-gen/flow-state/src/scenes/shader
Dejvino 89e05459c0 Every shot stands on something, and the frame has two ends
A section used to be one scene, and two thirds of the library is composable —
sparse by design, elements ON something. Cast as backgrounds anyway, they left
9 of 40 sampled frames under 20% painted, the darkest at 0.3%: a minute and a
half of a few bright things on black, invisible to every gate because every
gate on the stack was a limit rather than a floor.

Every section now stands on a GROUND: a canvas that fills the frame, cast per
section kind so a shot cut changes the shot and not the world. When the shot
fills the frame itself it IS the ground — two canvases stacked is two pictures
fighting. Above that, a coverage BUDGET: director appetite times the section's
energy times where the story is, capped at two frames' worth of material.

The measured facts move into the repo. scenes/metadata.json is generated from
the gallery — coverage as a shot, coverage as a bed, variety, the structural
profile — tracked in git, stamped with a fingerprint of the scenes and the
metric definitions, and refreshed from gallery.html. `surface` is derived from
it rather than declared; nine scenes claimed `canvas` while painting under a
third of the frame, and declaring it is now a lint error. The generator weights
every layering choice by measured structural distance, because family labels
and the render disagree: two `geometric` scenes can be 0.31 apart and a `flow`
and an `organic` scene 0.04.

The gallery's 0.1 red line is gone. It was right when a section was one scene
and wrong now — nineteen scenes were failing a bar for being consistent, which
is a virtue in an ingredient.

Chasing the numbers turned up four real faults:

  * A scene that reads prev() cannot be a ground. It returns the whole
    composited frame including the layers above it, so a datamosh under a shot
    is eating it: the render stopped reproducing from a seek and two WebGL
    contexts diverged by 91/255 against a tolerance of 4.
  * Screen was the wrong operator for a shot over a bed. It lightens, so a
    median quarter of every frame clipped to paper and whole sections rendered
    100% white. Replaced by a lumakey — the shot's brightness is its alpha.
  * Feedback was an accumulator: a still image settled at 2.3x its own
    brightness. Fine over black, fatal over a filled ground. Normalised at 0.6,
    plus a highlight shoulder so the top rolls off instead of clipping.
  * useTrack never prewarmed, so a fresh Show's first frame differed from every
    later render of it — the export-breaking hazard Compositor.prime documents.

Blazing is a decision now, not a side effect: directors declare an appetite for
it, a section must be loud and late in the story to earn one, and quiet kinds
never do. The ceiling gate matches that — a hard cap per section, and no more
than a fifth of them hot at all.

Rendered across twelve videos, middle of every section:

    painted        51% mean, darkest 0.3%  ->  87% mean, darkest 43%
    clipped white  24% median, worst 100%  ->   1% mean, worst 30%
    separation     0.10                    ->  0.44

Seven scenes can ground a section — five geometric, two organic — so every
quiet section of every video stands on one of two beds. That is the library's
largest hole and it is scene work: there is no minimal or flow canvas that
fills half the frame without reading prev().

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 09:02:01 +02:00
..
analog-wow.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
apollonian-gasket.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
aqueduct-march.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
aurora-veil.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
balance-stack.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
block-mosh.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
cargo-belt.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
cell-divide.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
circuit-bloom.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
classic-wave.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
contour-map.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
curl-flow.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
data-aisle.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
droste-feedback.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
dust-chamber.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
eclipse-field.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
firefly-drift.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
floating-geometry.js The song brings a body, not only an outline 2026-08-19 17:15:49 +02:00
flora.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
gate-corridor.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
girder-lattice.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
halftone-misprint.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
horizon-lines.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
ink-bleed.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
isometric-blocks.js A scatter point in Isometric Blocks — which measures worse, twice 2026-08-18 16:42:55 +02:00
kaleido-tunnel.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
karman-street.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
magnet-lines.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
metaballs.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
moire-grid.js Give a full-frame field a subject the eye can track, and let the song choose 2026-08-18 16:52:57 +02:00
mountain-flight.js Raise the variety bar to 0.1 2026-08-18 18:11:33 +02:00
mycelium-web.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
nebula.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
neon-city.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
pendulum-trace.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
pitch-shatter.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
plasma-bloom.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
prism-bloom.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
psychedelic-drift.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
pylon-grid.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
quasicrystal.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
rain-column.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
ridge-terrain.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
salt-flat.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
scale-mosaic.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
scan-tear.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
shoji-grid.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
signal-decay.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
silk-ribbon.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
slow-orb.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
smoke-column.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
spectrum-sculpture.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
stairwell-descent.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
storm-rift.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
suspension-span.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
synthwave-run.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00
tide-rings.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
time-smear.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
truchet-fold.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
turing-bloom.js Take the effects off the visualizers and leave them to the grade 2026-08-18 16:21:34 +02:00
voronoi-shatter.js A focus: somewhere for a full-frame field to be about, tried on Voronoi 2026-08-18 16:39:35 +02:00
vortex-drift.js Every shot stands on something, and the frame has two ends 2026-08-20 09:02:01 +02:00