commit 48c16d4245e3df56b8303f99de960d160bcffc27
parent f0c57c7ebe835996454e4fa80b205cd02bdf14dc
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Thu, 1 Oct 2026 13:46:30 -0400
plans: room for posts R1 as built — the move by perspective, 24 px cards, the gates
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
1 file changed, 56 insertions(+), 0 deletions(-)
diff --git a/plans/deck-posts.md b/plans/deck-posts.md
@@ -149,3 +149,59 @@ Rulings, on top of the above:
Core additions (`deck.mjs`): `shiftedFootage`, `postHolds`, `footageMoves` (the schedule's `moves`:
`[{segment, at, segmentAt, seconds, from, to}]`, present only when there are moves), `posts.hold`
and `posts.shift` settings and validation; `resolveDeck` fills `posts.shift` from its default.
+
+### R1, as built
+
+Branch `deck/room-r1` from 69cb37d7.
+
+| Commit | What |
+|---|---|
+| 8d86edc6 | The hold and the move joined on the carrying clip's input (`segmentJoins`, `joinInputChain`, `moveFilter`, `xfadeGraph`, `hardCutFilterArgs`, `cutOffsets`); every length under the deck is the schedule's; the hard-cut record names its joins; verify-build's freeze check; `deck-room.test.mjs` |
+| f5067b04 | The cards: slide in from past the frame's edge, an accent flare that settles, an accent rail, a platform pill; text 24 px |
+| 4fb19848 | README, quirks, the `[Unreleased]` entry |
+
+Where it differs from, or adds to, the rulings above:
+
+- **The move is one `perspective` filter** (`sense=destination`, `eval=frame`): the input frame's
+ corners are eased by smoothstep so the footage box goes from `from` to `to`. It resamples at
+ 1/256 px; `scale` + `overlay` and `zoompan` round to whole pixels. Before the move it is the
+ identity, copied bit for bit. It has no `t` and `in` counts from 1, so the clock is `(in-1)/fps`.
+ It fills the uncovered band by clamping to the input's edge, so `fillborders` pins the outer
+ 2 px to `palette.bg` first. Measured on c06: the box glides 172→22 px over 18 frames with no
+ stepping.
+- **A hold shows `hold − transition` of still frame** under a crossfade, because the dissolve
+ out starts inside it (2.0 s at the defaults).
+- **Text is 24 px, not more.** At 25 px the ferret cut's c06 stack (3 posts) measured 918 px
+ against an 838 px column, and the oldest would have slid out before the hold. 24 px with
+ tighter padding measures 829.
+- **verify-build's freeze check** compares luma outside the deck and the posts column, because
+ the deck's progress fuse keeps moving during a hold. It allows a mean difference of 1.5;
+ ferret measured 0.01–1.02.
+
+Gates on 4fb19848:
+
+- Workspace tsc clean. `test:scripts` 318 pass, 2 skipped. Capped umtool `next build` with the
+ corpus linked exit 0 (58 s, under load from a concurrent encode), link removed, and the
+ server bundle carries `const postsCues = (` (2 files).
+- Byte-identical: `--only c07 --skip-fetch` without `render.chrome` gives md5
+ `6a92235fa12ca181bb81993129c9ee9d`. A deck manifest without posts gives a `schedule.json`
+ byte-equal to the base's, and the base and the branch give the same overlay chain,
+ `applyChromeArgs` and `previewFromSegmentsArgs` (`segmentJoins` returns null).
+- Ferret, scratch copy, `--chrome-only` (crossfade):
+ - 360.2 s, holds on c03, c06, c12 and c17;
+ - posts and moves at the predicted seconds;
+ - verify-build ok, with all four freezes found;
+ - 17 chapters at the schedule's starts;
+ - QR 7/7 posts and 17/17 deck.
+- Transition-0 copy through the concat-filter prerail: 368.2 s, verify-build ok, QR 7/7 posts.
+ The `.segments` record names each join.
+- `--chrome-preview 126 14` gives 14.000 s (420 frames) from the segments: the dissolve in,
+ the move, the stack and the hold.
+
+Left for R2 (umtool):
+
+- `umtool/lib/report/export.mjs`'s fallback, used when there is no `chapters.ffmeta`, still sums
+ `segmentOffsets` without the holds. A build always writes the ffmeta, so it is reached only
+ for a cut that was never fully built.
+- The preview's posts geometry is now the frame's edge (`postsGeometry`). The preview does not
+ show the footage move or the hold; both happen in ffmpeg, at the join.