commit 30e2834879bf54b90723b5c84c78e1c9d59a0e82
parent 4572213d70dd41e717892d9cbc4c35c58154afe4
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Thu, 24 Sep 2026 13:27:24 -0400
plans: rollout 2026-09-24 — release 2 live on :3001, smoke and the boot-cost note
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
2 files changed, 58 insertions(+), 4 deletions(-)
diff --git a/plans/STATE.md b/plans/STATE.md
@@ -3,8 +3,12 @@
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.
-**Last updated:** 2026-09-23 — **one-core Phase 3 slices 2 and 4a are on `main` @
-`ae2fa5a9`, and gate B is done.** Base `54cf1b31`; two branches merged in the order
+**Last updated:** 2026-09-24 — **release 2 is LIVE on :3001** (`1e27f7c3` = `b836ea8a` +
+two prelude commits; rollout record:
+[`one-core-phase-3.md`](one-core-phase-3.md#rollout-2026-09-24--b836ea8a--two-prelude-commits-live-on-3001)),
+and **slices 3a + 4b are in flight** on `one-core/phase-3-s3a` and `one-core/phase-3-s4b`
+(worktrees off `1e27f7c3`). Previous: 2026-09-23 — **one-core Phase 3 slices 2 and 4a are on
+`main` @ `ae2fa5a9`, and gate B is done.** Base `54cf1b31`; two branches merged in the order
`one-core/phase-3-s2` → `8d6e84f6`, then `one-core/phase-3-s4a` → `ae2fa5a9` (with `main`
merged into it as `7035316c`). Release record, gates and the next release's inventory:
[`one-core-phase-3.md`](one-core-phase-3.md#release-2026-09-23--slices-2-and-4a); anchors:
@@ -35,8 +39,8 @@ merged into it as `7035316c`). Release record, gates and the next release's inve
**Still owed (operator):** the Anilyzer **production** deploy (preview is up, see below); the
other five sites to corpus spec 4; the LM chat-only tier (shipped, unconfigured). **Owed
-(code):** the backfill lane form's hint text still says 836 reachable (gate B measured 679) —
-`LaneSettingsForm.tsx:101`.
+(code):** nothing from release 2 — the lane form's 836 hint is live figures since `c0a90a37` /
+`1e27f7c3` (679 reachable, 74,411 needing media on 2026-09-24).
**Previously:** 2026-09-22 — **the release *curated-tags follow-ups + debts sweep* is on
`main` @ `766e0873`.** Base `4ac8ceda`; three branches merged in the order
diff --git a/plans/one-core-phase-3.md b/plans/one-core-phase-3.md
@@ -519,6 +519,56 @@ list its own record (`5b43dc8d`) or the review fix (`81deae69`), and the review
settingsDocs wiring tests, so common on that tip is 1650, not 1648. Both records said
"unmerged"; both are merged.
+### Rollout 2026-09-24 — `b836ea8a` (+ two prelude commits) live on :3001
+
+The editor on :3001 had served a `54cf1b31` build since 2026-09-14; this put release 2 in
+front of the operator. Editor only — `git diff --stat 54cf1b31..b836ea8a -- umtool` is empty
+and umtool's one `common` import (`lib/momentUrl`) is unchanged, so umtool was not rebuilt.
+
+**Two code commits on `main` first, both to the same stale sentence.** `c0a90a37` — the
+backfill lane form (`LaneSettingsForm.tsx`) derives the re-acquire figures from the
+widget-sync payload plus one statfs of the transcripts root (`getFreeBytes`, the same call
+behind the jobs payload's `disk.freeBytes`); the hand-typed "836 / ~76,270 / 91× / 45 GB"
+stays as the fallback when no figures are passed. `1e27f7c3` — found live: the lane-wide
+`backfill.reachable` folds attribution-text, whose input is the transcript, so the first
+build rendered "78,146 videos still have media on disk". The page now reads the
+**diarization** kind's entry from `backfill.kinds` — the one operation whose missing input is
+audio, which is what the toggle fetches. Live it reads "679 videos still have media on disk
+and 74,411 would need re-downloading — 110× the reachable work, against 269.43 GB free", the
+successor of the dated sentence and the same 679 gate B measured.
+
+**Procedure, as in release 1:** offline round-trip first —
+`plans/tools/phase3-settings-numbers.ts live=settings.json`, written block equal to
+`jq -S . settings.json` (diff empty, no key added); then `pnpm --filter editor build` detached
+into the live `.next` while the old server kept serving; then TERM the process whose cwd is
+`editor/`, wait for :3001 to free, `setsid nohup pnpm run start -H 0.0.0.0`. Done twice
+(build 7 on `c0a90a37`, build 8 on `1e27f7c3`): `BUILD_ID` `CXAYTdyUXFjcEqCiMCwQ-` →
+`M-ujB5s8O4_phVlvBejMG` → `vXFdg-SWIkdh7XpWLEqCQ`, both route tables with `ƒ /api/view/[name]`.
+
+**Smoke, by hand = `view-route.spec.ts`:** `/api/view/<bogus>` and `/api/view/invalidate-cache`
+404; `/api/widget/presets` 200; `/api/view/pulse?rev=` and `/api/pulse?rev=` both
+`changed:false` (build 8; on build 7 a download was in flight and the rev never held still);
+`/api/widget/cleanable` `cleanableBytes: null` (the old cleanable path is gone, not `-1` —
+the spec's fixture value); `/`, `/operations/diarization` (Holding, re-acquire off), `/settings`,
+`/storage`, `/jobs`, `/tags` all 200; `settings.json` md5 `8e03ec3f…` unchanged across both
+boots; no `ZodError` in either start log. The eight old/new pairs: `pulse`, `workers`,
+`widgetSync`, `widgetActionable`, `cleanable` byte-equal on build 7 (ignoring `builtAt` /
+`disk.freeBytes` / `now`); `activeJobs`, `autoQueueStatus`, `schedulerStatus` equal once the
+live-only fields (`heldMs`, a running download's `fraction` / ETA `detail`) are stripped — a
+live server is not the idle fixture. Build 8 changed nothing under `app/api`, so the pair
+evidence carries.
+
+**What the smoke could not clear, and why.** Corpus-wide pages took 47–240 s and several
+probes timed out for ~25 min after each boot. The cause is not the build: every boot re-runs
+the recency pass (`[recency] dating 8000 of 8883 undated candidates`, once per Next module
+graph, memoised in-process), the scheduler re-queues the overdue sync-all (46 syncs held, 2
+running), and a metadata scan resumes — all against a platter drive (`sdb`, the relocated
+media root) that an in-flight ffmpeg remux and, later, the 4b numbers script were saturating
+(`/proc/pressure/io` "full" 58–66 %; the NVMe was idle). Two restarts in one hour paid that
+boot cost twice; `ARCHILYZER_IDLE_BOOT=1` exists for exactly this and was not used because the
+lanes were meant to resume. Sharp fails to load in the primary and every worktree
+(`require('sharp')` throws); builds do not need it and it predates this release.
+
## Next release — slice 3 and slice 4b
Not started. The facts below were checked against `ae2fa5a9` on 2026-09-23.