commit 6f2d48322fbb80c12c42cdd03040f6784a49d62c
parent bbcc1acd2bb342722b0e7c78913d9d1ba18d050d
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Thu, 24 Sep 2026 18:47:24 -0400
plans: release 4 prelude — bbcc1acd live on :3001
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
2 files changed, 78 insertions(+), 0 deletions(-)
diff --git a/plans/STATE.md b/plans/STATE.md
@@ -3,6 +3,8 @@
The working memory for the local-AI derived-corpus work. Rewritten at the end of every
session, before context is cleared. See [`README.md`](README.md) for the protocol.
+**Live on :3001 (2026-09-24, 18:42):** `9ab10d77` (release 3), `BUILD_ID` `XsKaA_drqdAbTguxUGVsn`; smoke clean, boot and a form save rewrote nothing but the saved channel's key order; the one-sync md5 sweep is still owed (YouTube 429 cooldown refused it) — [rollout record](one-core-phase-3.md#rollout-2026-09-24--9ab10d77-live-on-3001).
+
**Last updated:** 2026-09-24 — **release 3: one-core Phase 3 slices 3a and 4b are on `main` @
`ef88ac4d`.** Rollout prelude first (`c0a90a37`, `1e27f7c3`: the backfill lane form's
re-acquire figures derived, release 2 live on :3001 — rollout record:
diff --git a/plans/one-core-phase-3.md b/plans/one-core-phase-3.md
@@ -627,6 +627,82 @@ where a record and the code disagreed, the code won):
(`ChannelWorkTable.tsx`) were corrected, and the three `SUB_FILE_RE` comments now say
`sidecar()` enforces the rule — comment-only edits, line counts unchanged.
+### Rollout 2026-09-24 — `9ab10d77` live on :3001
+
+Release 3 (`ef88ac4d`, slices 3a and 4b) plus the three plans/comment commits after it, put in
+front of the operator. Editor only — `git diff --stat 1e27f7c3..9ab10d77 -- umtool` prints
+nothing, so umtool was not rebuilt or restarted (it keeps serving on :3050).
+
+**Offline round-trips first.** `phase3-settings-numbers.ts live=settings.json`: the written
+block equals `jq -S . settings.json` (diff empty, 1,353 scalar paths each side, no key added;
+the live file is 90,513 sorted bytes, up from release 3's 89,871 because the operator's
+settings moved, not the code). `phase3-files-numbers.ts` over the LIVE `transcripts/` (not a
+frozen tree): 6 `site.json` + 71 `config.json`, every `unknown keys: []`, no `WRITE THREW`,
+and the 3,832-line output is **identical** to release 3's frozen-input run
+(`s4b-numbers-merged.txt`) — none of those files has moved since the freeze. Write-back bytes:
+all six `site.json` identical; **66 of 71** `config.json` identical, and the other five
+(`cornbreadman`, `elfpire-eva`, `legal-mindset`, `omnivods-odysee`, `the-quartering-rumble`)
+differ in key order only (`jq -S` equal on a scratch write) — the one-time schema-order
+reorder slice 4b named, and the same md5s release 3 measured.
+
+**Build and one restart.** `pnpm --filter editor build` detached into the live `.next` while
+the old server served: exit 0, ~42 s, `ƒ /api/view/[name]` in the route table; `BUILD_ID`
+`vXFdg-SWIkdh7XpWLEqCQ` → **`XsKaA_drqdAbTguxUGVsn`**. Then TERM pnpm 255275 / next-server
+255325 (cwd `editor/`), :3001 free, `setsid nohup pnpm run start -H 0.0.0.0` → next-server
+525417, `/` 200 after 2 s, `/tags` 200. One restart for the release.
+
+**Smoke, started 8 s after boot.** The eight old/new pairs, with `heldMs, fraction, detail,
+now, rev, builtAt, updatedAt, elapsedMs, etaMs, disk.freeBytes` stripped: `pulse` (109 B),
+`workers` (1,113 B), `activeJobs` (3,225 B), `schedulerStatus` (37,343 B), `widgetSync`
+(1,522 B), `widgetActionable` (1,513 B), `cleanable` (1,677 B) equal on the first pass.
+`autoQueueStatus` differed on the first pass only because the world moved in the 71 s
+between the two fetches: a YouTube 429 cooldown opened (`cooldowns: [] → [{youtube, fails
+10}]`), the download runner took its next focus video (`CAi9jNrHetw → ncdPaDSqt-c`,
+`quarteringvlogs` focus pending 2 → 3) — all live state. Re-fetched two minutes later it was
+equal (508,672 B, 2 s). `/api/view/bogus` and `/api/view/invalidate-cache` 404;
+`/api/widget/presets` 200; `/api/view/pulse?rev=` and `/api/pulse?rev=` both
+`changed:false` (downloads were in flight — 2 auto-download, 2 auto-transcribe, 1 transcribe,
+1 auto-digest, 1 auto-backfill, 1 refresh-report — and the rev still held); `cleanableBytes:
+null`. Pages, all 200: `/` 2 s, `/channels` 0 s, `/channels?sort=size` 0 s, `/jobs` 2 s,
+`/operations/diarization` **62 s**, `/settings`, `/storage`, `/tags`, `/channels/FearAnd`,
+`/channels/FearAnd/videos/03Bgz7vkgbs` 0 s each. No `ZodError` in the start log (0).
+
+**The new surfaces, from the served HTML.** `/channels` is the rack: a `sticky top-0` thead,
+71 sticky identity cells, a sortable **Tier** column ("sort by Tier"). The grouped view renders
+only with a single site in scope (`page.tsx`: groups partition a site), so it was checked on
+`/channels?site=jeralyzer` — 4 `data-testid="group-name"` section headers (`default`,
+Archives, Guest Appearances, Extended Universe), each `scope="rowgroup"` and
+`md:sticky md:top-[var(--thead-h)]` — and `?site=anilyzer` (12). `/jobs` is the one JobRow
+table: 50 `<tr data-kind … data-job-id>` rows, 3 of them `data-live`. `/operations/diarization`
+says **Holding**, "0 in flight" (the lane is held, so `InFlightList` renders nothing — it
+returns null on no items), and "**693** videos still have media on disk and **74,413** would
+need re-downloading — 107× the reachable work, against 276.24 GB free" (679 / 74,411 / 110× /
+269.43 GB at the last rollout).
+
+**md5 sweeps** over `settings.json` + 6 `site.json` + 71 `config.json`
+(`settings.json` `ed53f672…`). (a) Right after boot, and again 3 min later just before the form
+save: identical to the pre-build baseline — boot rewrote nothing. (c) One Configure-form save
+with no field changed on `legal-mindset`, through `pnpm ops channel-config` with `patch: {}`
+(it lays the empty patch over `channelConfigToFormData(existing)` and calls
+`updateChannelAction`, the server action the form posts): only
+`channels/legal-mindset/config.json` changed, `87ee6758…` → `7dd35dac…` — exactly the md5
+the offline write-back predicted; `diff <(jq -S) <(jq -S)` empty, the raw diff moves `name`
+after `platform` and `cookieMode` after `downloadFilter` (key order only). `settings.json` and
+every `site.json` unchanged. (b) **One sync was not run.** `pnpm ops sync
+{"slug":"FearAnd"}` was refused by the editor — "youtube is in a rate-limit cooldown (1634s
+remaining)", the 429 cooldown the autoQueueStatus pair caught opening — so no sync job ran;
+the md5 sweep after the refusal is unchanged. A non-YouTube channel was not substituted.
+Syncs stamp through `patchChannelConfig`, so the expected effect of a sync is a
+`lastSyncedAt` (and, on a full sweep, `lastFullSweepAt`) change on the synced channel's file
+only; that remains unmeasured for this build.
+
+**Boot cost, as observed:** small. The API views and every page but one answered in 0–3 s from
+8 s after boot; `/operations/diarization` took 62 s and the first `/api/auto-queue/status`
+~70 s, both corpus-wide, both while the recency pass ran (`[recency] dating 8000 of 8886
+undated candidates`, twice — once per Next module graph). IO pressure at boot was
+`full avg10 7.26` (58–66 % at the last rollout, when a remux was saturating the platter), which
+is the difference from the 25 minutes release 2 paid.
+
## Next release — slice 3b and Phase 4 (inventory kept from 2026-09-23)
Slices 3a and 4b shipped in the release above (2026-09-24); the slice 3b bullets and the