videoskillethandoff Open the app ↗
On this page

Screening a timeline, not a board

2026-09-04. The day before had left the carousel playing three recordings of the app's window. Two of them had nothing happening in them, and the third spent five of its sixteen seconds on a white field. This is what it took to find that out and what fixed it — including the instrument that was wrong, and the two hours it cost before anyone noticed it was wrong.

The measurement that came first, and what it settled#

The previous note left the lead slide at 914K with "length is the lever, and the timeline has about a second of slack in its holds". ffprobe on the shipped file, summed per beat, says the lever is real and the slack is not where it looked:

beatsecsK/s
opening hold1.065
drag mix1.755
drag auto-iris1.552
press mixer1.079
drag loop mix1.851
finish hold2.465

The bitrate is flat, so a second of hold costs exactly what a second of drag costs and no more — there is no fat to find, only a length to choose. Colour bars at rest cost as much as a feedback runaway, because what h264 is paying for in both is the picture's own noise floor; the panel is static and codes once. Across the whole reel it is the look that sets the price: the two colour-bars slides ran 57–58K/s and the fuzzy-feedback one 12K/s.

That last number is the useful one, and it is not about file size. A slide that encodes at a fifth of the going rate is a slide with nothing moving in it. The encoder had been saying so all along.

Three slides, three different faults#

The fault slide dragged a row three per cent and claimed a raster that breathes. HV sag runs -100..100 on a zero curve, so the travel expands around the middle — and { drag: { slider: 'HV sag', to: 0.53 } } is +1.6us, not the +6us the old note guessed. The bars sat there looking clean. At 0.93 it is +70us: they bow, and the black between them bows with them, which is the whole argument for it being geometry. Screened against the group's other rows — bend at 60 and 120, v size underscan, the beam limiter — and those are more violent but they tear the bars into diagonals and ribbons. A fault you cannot still read the picture through says nothing about geometry.

The map walk ran over mud. Fuzzy color bars feedback is a soft brown smear that does not change; the 12K/s above is its file saying so. It runs over Wiggity now, which is the gallery's own first look, carries two mod wires, and is a bright scanline arch that bends while the map is walked.

The lead slide's auto-iris was the problem, not the solution. A camera loop driven past unity latches: the frame saturates to white and nothing later in the timeline gets it back, so the clip's middle was a white field and its finish a smear over one. Held under unity the optical loop only holds trails, and the colour is the electrical loop's job.

The instrument was wrong#

This is the part worth keeping.

contact.mjs renders a candidate by putting the whole board on the URL and letting it settle. That is exactly right for a preset — a preset is a board, and whoever clicks the chip gets that load. It is wrong for a slide, because a loop applied at load grows from an empty frame buffer, and that is a transient which happens once and which no hand can reproduce.

The cost of not knowing that: fbMix:0.9, fbIris:0.6, fbZoom:0.97, cfbMix:0.95 screened as a radial starburst on black, sharpest of eleven neighbours, reachable in four non-fine rows. Recorded, it is a horizontal smear. Two rounds of contact sheets, a lap-count check (the starburst is fully formed by frame 100, so it is not settling time), and eight orderings of the same four rows — all eight land on the same wash. The board is not reachable at all.

scripts/pathprobe.mjs is what came out of it. It walks the rows the way a timeline does, at the timeline's own pace, and grabs the canvas at the end — no screenshot per frame and no encode, so a variant costs seconds where a take costs ninety, and a dozen fit in the time one recording does. Every finish in the shipped slide was chosen on its output.

What it found, in one round of twelve:

What ships#

Four rows on the lead slide — mix, rotate, loop mix, loop delay — and the finish is a field of flowing colour with "4 off stock" and the delay row's own readout in frame. 823K wide against 936K, 762K narrow against 923K.

The other two slides cost more than they did (deflection 491K → 625K, signal-path 85K → 657K), and that is the flat-bitrate measurement read from the other side: they are moving now. The page still fetches one clip at a time, so what a visitor pays on arrival is the lead slide's, which went down.

Recorder bug this turned up#

reel-taken.json had been recording the poster's frame number where it should have been recording a release: a const at for the still frame shadowed the module-scope const at = capturedAt(), so the manifest went out holding 374. --check reads that back as taken at vundefined and reports every clean tree as stale. Entries for slides no longer in the reel are dropped now too, rather than carried forever — the file still had control, window and feedback in it.

Left open#