commit e2ad2d8bddb5e1442d58ff4500ae566aaa4b4ba1
parent ea22b2fc9ce785df013dd03872c775b50a16870c
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Sat, 26 Sep 2026 18:23:02 -0400
plans: release 10 slice N review fixes — M1 wording (5397363f), L1 persistKept test (ea22b2fc), L2 recorded; gates on ea22b2fc: common 1,985, editor unit 85, test:scripts 173 + 1, mcp 269, editor build, FULL editor e2e 641 passed / 2 failed / 12 skipped in 48.6 min, re-runs alone ×3: tags 3/3 (flake), cookies-mode 2/3 (pre-existing NeedsCookiesList unmount race)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
| M | plans/release-10.md | | | 82 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- |
1 file changed, 80 insertions(+), 2 deletions(-)
diff --git a/plans/release-10.md b/plans/release-10.md
@@ -1236,8 +1236,10 @@ key; no new job kind; no new directory.
"Source-video persistence applies to transcribe-handling channels only." for any other handling,
so the plan's e2e 6(a) — click the button on a youtube-handling video — had no button to click.
- The gate is gone.
- - A youtube channel gets its own description line: "…A transcript already on disk is kept, and
- no audio is extracted beside it."
+ - A youtube channel gets its own description line: "…YouTube's subtitles are fetched again
+ first, as on any re-download; a Whisper transcript is not touched, and no audio is extracted
+ beside a transcript." (review M1: the first wording said the transcript was "kept", which a
+ re-fetched VTT is not).
- Labels, aria-labels and test ids are unchanged.
- `videoChoreCards.ts`'s `shown` text is updated.
- **`keepTranscript` with a plan that persists nothing fetches nothing.** The plan said "do not
@@ -1323,6 +1325,82 @@ key; no new job kind; no new directory.
- **"Persist kept now" on a youtube-handling channel now downloads every kept video's source**
(the plan's known limitation). `persistKept` still counts a returned-but-failed download as
`persisted` (pre-existing).
+- **A forced download that fails on a video with a transcript marks the whole download failed**
+ (review L2; a low for a later slice, not fixed here).
+ - The `else` branch after the attempt-3 run (`downloadOneManaged.ts:1470-1472`) sets `status =
+ "failed"` and `lastSucceeded = false` for a `keepTranscript` pass too.
+ - So the video page shows "Download failed" on a video whose transcript is fine.
+ - The whole-recording fetch job still ends `done` with no file, and the MCP says "finished but
+ named no file".
+ - yt-dlp's `source-media.*.part` (from `bestvideo*+bestaudio`, possibly several GB) can stay in
+ `data/<id>/` until a later persist resumes it.
+ - These are the same mechanics as today's no-subs fallback, now reachable on youtube channels.
+ - The review's option: on a `keepTranscript` failure, keep the subtitle pass's status and record
+ only the failed attempt.
+
+**Review fixes** (review SHIP AFTER FIXES, `n-review.md`: one medium, three lows; the three
+questions ruled as asked — the card un-gated, no `--no-overwrites`, the history file kept off
+`PREFETCH_OWN_FILES`).
+
+1. **M1: nothing the operator reads says the transcript is "kept"** (`3067f8af`). On a
+ youtube-handling channel the subtitle pass deletes and re-fetches `transcript.<lang>.vtt` (and
+ the live chat) before the media pass runs, so "kept" was true only of a Whisper
+ `transcript.json`.
+ - The Source video card, the `[Unreleased]` bullet and the AGENTS.md paragraph now say:
+ "YouTube's subtitles are fetched again first, as on any re-download; a Whisper transcript is
+ not touched, and no audio is extracted beside a transcript."
+ - The AGENTS.md sentence also says the pass was skipped for a transcript *or captions* (nit N5).
+2. **L1: a test that `persistKept` passes `forceMedia`** (`42f836cd`,
+ `controller/persistKeptForceMedia.test.ts`, 1 test).
+ - Setup: youtube handling, `keepLatest: 1`, a kept video with a `transcript.json`,
+ `SETTINGS_FILE` set to a temp file with the disk floor off.
+ - Asserts: three spawns, the last without `--skip-download`; `persisted: 1`; the pointer
+ (`override`) and the container in the store; no `audio.*` or `source-media.*` in the data dir;
+ the transcript's bytes unchanged.
+ - It bites: with `persistKept.ts:137` removed it fails.
+3. **L2:** recorded above, under "Found and left".
+4. **L3: the full editor suite** (below).
+- **Nits not taken:**
+ - N1 is covered by M1's "beside a transcript".
+ - N2, N3 (a 300-unit cut can split a surrogate pair), N4 and N6 are cosmetic.
+
+| sha | what |
+|---|---|
+| `3067f8af` | M1: the card text, the changelog bullet, the AGENTS.md clause (+ N5) |
+| `42f836cd` | L1: `persistKeptForceMedia.test.ts` |
+| _this_ | `plans:` these fixes, L2, the full-suite gate |
+
+**Gates on `42f836cd`:**
+- **tsc:** clean before each commit (`n-tsc6.log`, `n-tsc7.log`).
+- **common 1,985/1,985** (+1, the L1 test).
+- **editor unit 85/85.**
+- **`test:scripts` 173 + 1 skip.**
+- **mcp 269/269.**
+- **Editor build:** `pnpm --filter editor exec next build` ok, compiled in 19.9 s, 54 s total
+ (`n-gates2.log`).
+- **The FULL editor e2e suite** (`pnpm e2e`, no spec list; queued, detached, `export/public` links
+ in place with none dangling): **641 passed, 2 failed, 12 skipped of 655, 48.6 min**
+ (`n-e2e-full1.log`). Each failure was re-run alone ×3
+ (`pnpm e2e cookies-mode.spec.ts:241 tags.spec.ts:220 --repeat-each=3`): **5 passed, 1 failed,
+ 3.0 min** (`n-rerun1.log`).
+ - `tags.spec.ts:220` ("a video whose description and transcript are large previews and
+ renders"): **3/3 alone — a flake.**
+ - The failed assertion is the `addTag` helper's `tags-saved` wait (5 s), under load.
+ - The test downloads nothing, so no `metadata.history.json` exists and the new header block
+ renders nothing.
+ - `cookies-mode.spec.ts:241` ("defer: … downloads via the bucket button"): **2/3 alone — an
+ intermittent that predates this slice.**
+ - Both failures are the same: `getByLabel('Retry needs cookies output')` → "element(s) not
+ found" while waiting for "Managed download complete". The captured log shows the download
+ itself finished (`single-url fetched vidcookiegated1`).
+ - The cause: `NeedsCookiesList` (`editor/app/channels/[slug]/components/stages/DownloadStage.tsx`)
+ returns `null` when the bucket empties, so the refresh after the successful download
+ unmounts the card and its run log before the last line arrives. That is the FACTS
+ "a run log lives in the panel's React state" hazard, in a file this slice does not touch.
+ - Nothing of this slice runs on that path. The gated video's first prefetch fails before
+ writing metadata, so there is no history. The retry is not a forced download, and its
+ transcript comes from the subtitle pass, so there is no attempt 3.
+ - Left for a later slice: render the card while its run lives, as `SourceVideoSection` does.
## Rollout