commit 49d17ad4576eaf6d7c212be7abdfa930d36467ca
parent 2e37008f7bdf8e1d6f28cdce52dcf2f275f5ea56
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Thu, 1 Oct 2026 16:30:08 -0400
plans: the fix pass after the finale review — FIX-A, FIX-B, LOW-1 to LOW-7, the gates
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
1 file changed, 42 insertions(+), 0 deletions(-)
diff --git a/plans/deck-posts.md b/plans/deck-posts.md
@@ -358,3 +358,45 @@ Found and left:
- `onscreen-posts.spec.ts`'s timings at 15 fps (above) — resolved: 3c70c6d3 on the main line made
the posts and mute specs follow whole-frame holds and the build's mute fade, and the merge
carries it.
+
+## Fix pass after the finale review
+
+The read-only review of 1aecf54f (everything after df062b37: B2, the A/V pin, B1, T1) said SHIP
+AFTER FIXES. A capped umtool `next build` with the corpus linked passed at 1aecf54f: exit 0, 26 s.
+
+| Commit | What |
+|---|---|
+| 3465184d | FIX-A: an `endFade` longer than the last segment is the segment. `endFadeFrames` clamps the fade's frames to `lastFrame`, and the sound fades over the same frames, so the last frame is bg and the sound silent together (a 3 s segment under `endFade: 5` was 59 % of the way to bg) |
+| 3d9d5afd | FIX-B: "Bench B1, as built" above; one `[Unreleased]` bullet |
+| 083ee2d6 | LOW-5: `MUTE_FADE` lives in the dependency-free `report-to-video/mute.mjs` (`umtool-report-to-video/mute`), re-exported by `deck.mjs`; the bench's `playback.mjs` imports it from there |
+| ece9c818 | LOW-6: `/api/report/audio` spawns the build's `FFMPEG_BIN`, and the request's abort signal kills the decode |
+| 46a4d417 | LOW-1: a window save clamps a mute mark within the writer's 0.02 s of the moved edge onto it and stores it. Chosen over loosening the build: the build's check stays strict for every writer, and the clamp is what a patched mark already got |
+| 0ffed4f2 | LOW-2: a `muteFrom` at or past its segment's length (inside the extent, past `cutEnd`) is noted as "will not be heard", not "muted from" |
+| c56f1a74 | LOW-3: the teaser segment's key hashes `encodeArgs(render)` (crf, preset, audio bitrate, rate, channels) |
+| 964585a1 | LOW-4: `TEASER_LIMITS.fit` — title 34, kicker 56, overline 64, second tier 66 characters per row, the tail and its gap counted on its row; `validateTeaser` refuses a longer row with a sentence |
+| 07d1fa08 | LOW-7: the records |
+
+- **LOW-4, rendered.** A teaser whose title line is the 80 characters the limit allowed, still at
+ 6.5 s through `compose-chrome --region teaser --still`: shrunk to its 56 px floor, the line ran
+ past both edges of the frame (ink in columns 0–1919). Measured in the face at each role's floor
+ on ordinary headline words in capitals, a row holds: title 36–37, kicker 58–60, overline 65–67,
+ second tier 69–71. Each limit is a little under that. Stills at the limits, the tail included
+ where it sits, keep their ink within columns 114–1804. A row of only wide capitals (M, W) can
+ still spill at these counts, and the README says so.
+- **LOW-5, the client bundle.** Client chunks (`umtool/.next/static`) at 1aecf54f: `crypto-browserify`
+ in 1 chunk (3 hits), `createHash` 1, 1,505,165 bytes in all. After: 0, 0, 1,043,591 bytes.
+ `chromeCacheKey` is 0 both times, because the minifier renames it.
+- **LOW-7.** The changelog no longer says a cut without the deck, posts, `muteFrom` or `endFade`
+ "builds exactly as before" (the pin changed every crossfaded graph). The end fade falls on
+ whatever the last segment is, a closing teaser included. The README's "what it was" line is
+ corrected. The teaser's loudness is the segment's measured −19.7 LUFS in both. The 15 fps spec
+ item is marked resolved. `quirks.md` has the acrossfade-by-sound vs xfade-by-picture drift.
+
+Gates at 07d1fa08:
+
+- Workspace tsc clean (49 s). `test:scripts` 368 pass, 2 skipped (370).
+- Capped umtool `next build` with the corpus linked: exit 0 (23 s), link removed.
+- Byte-identical: `--only c07 --skip-fetch` on the unchanged ferret manifest copy without
+ `render.chrome` gives md5 `6a92235fa12ca181bb81993129c9ee9d`.
+- umtool e2e `onscreen-posts onscreen clip-bench build projects report-fetch-via-editor`: 97
+ passed (4.9 min).