commit 701c83c28cd777290f5e07aa230c625c7375aff9
parent 5dbead9a3e3836d7f1432eb2a78cf2fd774f6d3c
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Fri, 25 Sep 2026 19:50:31 -0400
plans: release 9 rollout record — 5dbead9a live on :3001 (boot pass re-queued 1 / cancelled 390, ops sync exits 0), hub + homepage deployed from the same commit; STATE + FACTS
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
3 files changed, 127 insertions(+), 8 deletions(-)
diff --git a/plans/FACTS.md b/plans/FACTS.md
@@ -6410,3 +6410,36 @@ Line numbers are `plans/FACTS.md` lines at `e172749b`, before this record's in-p
- **Restart leftovers.** Jobs queued when the editor stops keep `status: "queued"` in their meta
forever (no re-queue, no mark). A just-drained job also reads `queued` (`startedAt: null`) for a
while after its log starts. Both are cosmetic.
+
+## Release 9 facts (2026-09-25)
+
+- **A job body never calls `revalidatePath` directly.** A job the platform queue drains runs with no
+ request store and Next throws `Invariant: static generation store missing`, which marked the job
+ `failed` after its work was done. Job bodies and `onDone`/`afterRun` hooks call
+ `safeRevalidate(paths, tags?)` (`editor/app/lib/safeRevalidate.ts`): it swallows exactly that
+ invariant (one warning per bundle), rethrows anything else. Request-context server actions keep
+ the plain call.
+- **`--sleep-requests 1` is a YouTube platform arg** (`common/ytdlp/platformArgs.mjs`), like
+ Rumble's; a channel's `ytdlpExtraArgs` comes after and wins.
+- **`runManagedDownloads` skips the inter-download sleep only for `skipped-filtered`** (no media
+ request was made). Every failure class still sleeps — YouTube's soft block "try again later"
+ classifies as `deleted`/per_video, so skipping there would hammer a soft block.
+- **A job record carries `progressAt`** (live-only, stamped by the one progress writer and by task
+ completion). `/jobs` marks `possibly-stalled` only when tasks are idle AND progress has not moved
+ for 10 min (`common/views/jobRows.ts`).
+- **Boot settles queued metas** (`common/jobs/bootQueuedJobs.ts`, from `instrumentation.ts`, after
+ the storage boot pass, best-effort): `sync` is never re-queued (the heartbeat re-derives it);
+ metas queued > 24 h before the boot are cancelled as stale; of the rest only the newest per kind +
+ channel + bucket + params is re-queued via the retry path; the others are cancelled as superseded;
+ `ARCHILYZER_IDLE_BOOT` cancels everything. A `cancelReason` field on the meta says why. First live
+ boot: re-queued 1, cancelled 390.
+- **The hub embeds `public/hub-summary.json`** at `compose:hub` (`common/controller/poolSummary.ts`
+ shared with `compose-homepage`; `common/lib/hubSummary.ts` projects `official` + per-site figures
+ from the same `buildHomepageSummary`). Optional end to end: missing/404/malformed → cards without
+ figures. `compose-site` removes it; `builtHubProblem` does not require it; it is gitignored. A
+ member's `corpus.json` carries only channel/video counts, so the figures cannot be summed live.
+- **The hub defaults to the `archilyzer` theme, dark** (`export/app/layout.tsx` branches on
+ `instanceMode() === "hub"`); site builds stay base/system. In that theme `--chart-3` is its own
+ green (light `#5a9e3a`, dark `#86c86a`), no longer `--state-gone`'s hex.
+- **Port blocks follow the sorted worktree list** (`pnpm wt list`): adding or removing a worktree
+ shifts every later block. Tell a running implementer.
diff --git a/plans/STATE.md b/plans/STATE.md
@@ -3,14 +3,25 @@
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-25, 14:43):** `0e72ef73` (release 8, on top of release 7's `bb3dbb4c`),
-`BUILD_ID` `9pC6zELQSzjdkIPDNsVox`. umtool on :3050 was rebuilt without a code change and restarted
-with it, `BUILD_ID` `a9YAe_dwhuM6DiCPzIwMD`. Still live from release 7:
-- https://archilyzer-hub.pages.dev (five members);
-- https://archilyzer.pages.dev (200; since 18:30 the release-8 refresh, slice H, is production —
- deploy `a684a0ce`; its hero does NOT link the hub until the hub is polished, step C of the
- 2026-09-25 evening plan);
-- https://rekietalyzer.pages.dev (rebuilt 13:00).
+**Live on :3001 (2026-09-25, 19:40):** `0213f6c8` (release 9 = slice F four fixes + hub slice C1, on
+top of release 8's `0e72ef73`), `BUILD_ID` `P0VMdKX7gbdsaiS5GvorF`. umtool on :3050 untouched,
+`BUILD_ID` `a9YAe_dwhuM6DiCPzIwMD`. Live sites:
+- https://archilyzer-hub.pages.dev — C1 (archilyzer theme, "Official instances" with the homepage's
+ figures from `hub-summary.json`), deploy `6e7115f9`;
+- https://archilyzer.pages.dev — the release-8 refresh (slice H) since 18:30, rebuilt 19:45 from
+ `0213f6c8` (deploy `37fc10cc`); its hero does NOT link the hub until C2 lands (C3);
+- the five official sites at release 8's slices Z + E (17:45 / 18:10 deploys).
+
+See the [release-9 rollout record](release-9.md#rollout-2026-09-25-evening--0213f6c8-live-on-3001-third-restart-of-the-day).
+
+**Next (the 2026-09-25 evening plan, step C2 onward):** C2 federated-search UX (target behaviour
+proposed to the operator: all official sites by default with per-site chips, per-site loading/failed
+state, "N of M archives answered", a text source label on each result card, staged loading);
+then the Ko-fi line (ko-fi.com/archilyzer — copy: "funds development and better servers for the
+official instances", no setup details; homepage line + hub footer + config-gated site footers);
+then C3 (`HUB_LINK_ENABLED = true`, homepage rebuild) in the same homepage deploy; then release 10
+lows (soft-block classification, boot-pass storage-wait timeout, `/jobs` cancelReason) and Phase 4
+slice 3.
See the
[release-8 rollout record](release-8.md#rollout-2026-09-25-late-afternoon--0e72ef73-live-on-3001-second-restart-of-the-day).
diff --git a/plans/release-9.md b/plans/release-9.md
@@ -377,3 +377,78 @@ Bonnellyzer 2, Hasanalyzer 3, Rekietalyzer 0 — identical before and after on t
- The chart-3 change repaints the homepage's third instance too; it needs a homepage rebuild to show.
## Rollout
+
+## Rollout 2026-09-25 (evening) — `0213f6c8` live on :3001 (third restart of the day)
+
+Merge order: release 9 slice F (`one-core/r9-fixes` `7a646efa`, review SHIP AFTER FIXES → re-read
+SHIP) merged as `ef0978a6`; slice C1 (`one-core/c1-hub-look` `545cf025`, which had merged main and
+re-gated) merged as `0213f6c8`. Scripts: `plans/tools/rollout/` with `REL=r9` (`4bdb1f5e`, step 0 of
+the evening plan), plus `$T/r9-{build,restart,hub-home,sync}.sh`.
+
+**Gate on the merged tree** (`7a646efa`, tree = `ef0978a6` minus a STATE commit): tsc 0; common
+1,839; editor unit 78; scripts 162 + 1 skip; editor `next build` ok; e2e 14 specs 86/86, 5.9 min.
+C1's re-gate on `11e185c0` (main merged): tsc 0; common 1,845; export site build, `compose:hub` +
+hub build ok; `e2e:hub` 11/11; the projection of main's `buildHomepageSummary` (low H) over the
+primary's stats pages matched the live homepage summary exactly (5 / 63 / 75,785 / 49,767 /
+60,840 / 480; gone per site 473, 2, 2, 3, 0).
+
+**Editor build** on the primary at `0213f6c8`: 40 s, `BUILD_ID` `9pC6zELQSzjdkIPDNsVox` →
+`P0VMdKX7gbdsaiS5GvorF`. umtool untouched (still `a9YAe_dwhuM6DiCPzIwMD`, not restarted).
+
+**md5** 81 files (one more than release 8: the new `paramounttactcl-x` channel). before → pre-restart:
+ONE change, `paramount-tactical/config.json` — written 19:35:47, the operator clearing the
+`downloadFilter.include: "Quartering"` on the Configure form (the plan's "for the rest" step;
+`lastFullDownloadAt` had been stamped at 19:19:27 by download-missing, before the sweep).
+pre-restart → after-boot: identical.
+
+**Restart** 19:40: live jobs were only the two auto runners (no operator job). Editor answered 200
+after 3 s, `/tags` 200. **Boot pass (B4b):** 391 queued metas before → `[boot] stale queued jobs:
+re-queued 1, cancelled 390 (sync 345, superseded 1, stale 44)` → 1 queued meta after. The one
+re-queue was the paramount-tactical metadata-scan (`01M3CV5W6WG8QJW09G2F0N1V8A` →
+`01M3DF38BAH541K6A51XE8HXWG`), which ended **`done`** with nothing left to scan — the first live
+B1 proof: one `[safeRevalidate] no request store (a queued job ran outside a request); skipped
+revalidating /channels/paramount-tactical, /channels, /operations/[id] (page)` line in the start
+log, no `failed`.
+
+**B1 + B3 live proof:** `pnpm ops sync --json '{"slug":"teamrcn"}' --wait` exited **0** in 29 s,
+job `01M3DF7EQJB92BK2Q5QNN9H61R` `done` (release 8's ran the same work and read `failed`); its
+listing spawn carried `--sleep-requests 1` (`yt-dlp --flat-playlist … -I 1:50 --sleep-requests 1
+https://www.youtube.com/@teamrcn`). B4a: no STUCK on a healthy job seen. B2 waits for the next
+download-missing with filter-declined videos (Paramount's were all settled before the release).
+
+**Smoke** (`plans/tools/rollout/smoke.sh`, 19:42 → 19:49): `SMOKE_FAIL=1` from exactly the two
+moving pairs — `/api/jobs/active` vs `/api/view/activeJobs` (the proof sync ran during the read)
+and `/api/auto-queue/status` vs `/api/view/autoQueueStatus` (same 513,122 bytes; the diff is
+`focusPending` 107 → 112 / 1,353 → 1,348 and the lane's current video: the auto-download lane
+walking Paramount Tactical between the two reads). Everything else green: 6 pairs identical, 2
+404s, presets, pulse `changed=false` both ways, 11 pages 200, `BUILD_ID` `P0VMdKX7gbdsaiS5GvorF`,
+0 ZodError, `DEFERRED_OK download.deferred well-formed ("ok 0")` (the fixed check), umtool 200,
+`/channels/paramount-tactical/videos` 200 with 42 open rows.
+
+**Hub + homepage (C1):** `pnpm ops build-hub` 65 s — log: `hub-summary.json covers 5 official
+instance(s).`; `deploy-hub` 27 s → https://archilyzer-hub.pages.dev (deploy `6e7115f9`). Live
+check (Playwright): `data-theme="archilyzer"`, H1 "60,840 hours of speech from every official
+archive, searchable at once.", `Official instances` with 5 `shelf-spine` cards each showing
+channels / recordings / transcripts / hours (Anilyzer 23 / 29,751 / 8,365 / 8,159), no eyebrow,
+the live "Searching …" line, `/hub-summary.json` 200. `archilyzer build homepage` 47 s (v5) +
+`deploy homepage` 32 s → https://archilyzer.pages.dev (deploy `37fc10cc`), H1 present, still no
+hub link (C3). **The two summaries differ by 3 recordings** (hub 75,800, homepage 75,803): the
+auto-download lane archived three Paramount videos in the two minutes between the builds;
+transcripts, hours, gone identical.
+
+**Paramount Tactical (A2), the same evening:** metadata-scan `01M3DBFV07NC0Z6KWZ1BG3K9BX` scanned
+the last 201 (0 errors; store 1,370 + 12 members-only errors of 1,473); download-missing
+`01M3DD3WBVYPPXB1NCQ1HDX8BM`: 1,381 missing, 92 complete, 12 members-only excluded, **1,369 settled
+by the filter with 0 requests and 0 sleeps**; keep-videos matched 1 (`NV1QqS9NOiU`, already kept).
+Both ops jobs read `failed` on the pre-release invariant. After the operator cleared the filter
+(19:35) the auto-download lane took the channel at lane pace: archive 92 → 115 by 19:50.
+
+**Found and left.**
+- The hub orders its cards by `hub-sites.json` (alphabetical); the homepage orders by transcripts.
+ Same colours per site (C1's `seriesColor` fallback keys on the summary's order), different rows.
+- No official site sets `accent`; all five hub cards wear series colours. A `site.json` edit each.
+- The hub build now walks the pool's `data/` and opens the LMDB read-write (as the homepage build
+ does); an unmounted drive undercounts silently — C1 record.
+- YouTube's soft block ("try again later") classifies as `deleted` → per_video → no backoff — F record.
+- The boot pass waits for the storage boot pass with no timeout (review LOW); `/jobs` does not show
+ `cancelReason`; the safeRevalidate warning is once per bundle.