commit 5d52601138d6358f43a30c4f33283dabc130ff9f
parent 19724366cf9abb3429a686d533eb5f77e6b3ff4f
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Mon, 28 Sep 2026 05:43:00 -0400
plans: release 11 integration, as merged — the gates on 2046a23e (FLAKES-ONLY), STATE "Now (2026-09-28, morning)", the Rollout steps
The record: every merge with its branch tip and review, the hand joins (O2's
changelogs and Record; O5 and O2b the Record only), the changelogs checked as
one set, and every gate with numbers — tsc; common 2,112, editor unit 85,
test:scripts 185 + 1 skip, mcp 269, homepage unit 2; the three doc checks;
the five builds; e2e export 206, hub 33, 2origin 3, homepage 31 (0 skipped,
no public data), umtool 175/2/45, editor 652/1/12 of 665. The failures:
the known umtool mix pair (alone x3 36/36) and transcript-source.spec.ts:76
(alone x3 9/9), both flakes. The primary's export/public byte-identical at
all six checkpoints. STATE's new top block and the release 10 lows marked
closed; the Rollout is the ordered list the operator owes.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
| M | plans/STATE.md | | | 85 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- |
| M | plans/release-11.md | | | 214 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- |
2 files changed, 295 insertions(+), 4 deletions(-)
diff --git a/plans/STATE.md b/plans/STATE.md
@@ -3,6 +3,82 @@
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.
+**Now (2026-09-28, morning): release 11 is merged to `main` in full and NOT rolled out.** The
+overnight of 2026-09-28 ([`release-11.md`](release-11.md): every slice's record, then "Integration,
+as merged", then "Rollout"). `main` = `eb28a341` + three integration `plans:` commits
+(FACTS `eeff74c3`, `brand-and-themes.md` `3643c974`, then this STATE and the record); no code
+changed at integration. Nothing was deployed, cut, pushed or restarted; :3001 still runs `BUILD_ID`
+`S07zTu3MKTjHJa9eDM1GF` (2026-09-26 21:46).
+- **The slices, in merge order:**
+ - **O4 — the homepage builds and deploys from `/sites`** (`baaa4b47`): a Homepage section after
+ Hub (Build homepage / Deploy after build / Deploy homepage, a preview branch box), jobs
+ `build-homepage` / `deploy-homepage` / `build-deploy-homepage`,
+ `/api/ops/build-homepage|deploy-homepage` and `pnpm ops build-homepage|deploy-homepage`;
+ `JobLane` survives Strict Mode.
+ - **O3 — runner lows** (`c1d4790a`): an `error` recheck keeps a video "Missing?" (5 real videos flip
+ at the next build: jeralyzer 4, rekietalyzer 1); a failed forced source download keeps the
+ subtitle pass's status and fails the job with yt-dlp's line (`sourceFetchFailure`); a bucket's
+ retry keeps its log (`cookies-mode.spec:241` deterministic); the cut-release lows L3 + L4.
+ - **O6-A — one-core Phase 4 slice 3, checkpoint A** (`cb9d02b2`): `archilyzer doctor`, `run
+ <operation>`, `mcp`, every bin a subcommand, `pnpm archilyzer`; `common/lib/ports.mjs` and
+ `common/lib/envVars.ts` → generated `ENVIRONMENT.md`; `PUBLISH.md` absorbs the two deploy docs;
+ the build mode is a label.
+ - **O1 — hub lows** (`6cd3a9fe`): `/ask` waits for the hub's list, says when there are no
+ archives, shows a scope line; a member's missing live chat on its chip with a live-chat Retry;
+ `normalizeSocialSvg` themes a single-colour icon (the x.com fix); `mcp/README.md`'s `fetch_clip`
+ env lines. Three DRAFT copy lines.
+ - **O2 — homepage and brand lows** (`139a648e`): a custom hex fitted per base (`perBaseColor`),
+ `--chart-6` (a rust, Vermilion's family, validated), the mark's forced-colours outline, the
+ homepage e2e on a synthetic summary.
+ - **O5 — umtool brand fonts** (`15d5d646`): the rail / ledger / scroll / chart in IBM Plex Sans
+ under the brand, fitted by the face's own advances; IBM Plex Mono Bold vendored; an unbranded
+ render byte-identical (334 files).
+ - **O2b — follow-ups** (`69e7f59e`, + changelog nits `59d2f877`): the hub's added archives fitted
+ per base; `<clipPath>` passed over like `<mask>`; `no-data.spec`.
+ - **O6-B — checkpoint B** (`eb28a341`): every test-only env var `E2E_`-prefixed and declared in its
+ playwright config; the harnesses read `ports.mjs`. **One-core Phase 4 is done** (the optional
+ SETUP/PLAN.md consolidations aside).
+- **Gates on the merged tree** (`eb28a341`; every number in the record): tsc clean; common 2,112,
+ editor unit 85, `test:scripts` 185 + 1 skip, mcp 269, homepage unit 2; the three generated-doc
+ checks exit 0; editor, export site + hub, homepage and umtool builds ok; e2e export 206, `e2e:hub`
+ 33, `e2e:2origin` 3, homepage 31 with 0 skipped (no `homepage/public` data), umtool 175 + 2 failed +
+ 45 skipped (the known `mix.spec` pair; alone ×3 36/36), editor full 652 + 1 failed + 12 skipped of
+ 665 in 39.5 min (`transcript-source.spec.ts:76`, a flake new to the records: alone ×3 9/9).
+ Verdict: **FLAKES-ONLY**, no regression. The primary's `export/public` was byte-identical at every
+ checkpoint.
+- **What the operator owes, in order** (`release-11.md`, "Rollout"; the parent's runbook
+ `~/reports/overnight-2026-09-28/MORNING.html` has the scripts):
+ 1. **The copy rulings** — four lines in `export/app/ask/hubScopeCopy.ts`: `NO_ARCHIVES_IN_SCOPE`
+ (`:7`, release 10's, still unruled) and the three DRAFTs `NO_ARCHIVES_ON_HUB` (`:16`),
+ `LIVE_CHAT_MISSING` (`:24`) and `ASK_SCOPE_LINE` (`:33`). They ship as drafted unless changed;
+ a change is one small commit before the cut.
+ 2. **The operator questions the records raise:** should Build all honour `buildPipeline.mode`
+ (today a label; O6)? Is `--chart-6`'s rust near `--state-gone` acceptable (O2)? Settle the five
+ 410'd Rumble videos with a "Full-check unexpected" on `rekietalaw-rumble` and
+ `the-quartering-rumble` (O3)?
+ 3. **A release cut** (`archilyzer release cut all next --commit`; editor 8 and export 9 pending
+ bullets — export's is public on every `/changelog`).
+ 4. **The :3001 restart** on the new `main` (it brings O4's Homepage section and routes, O3's
+ retry-bucket and cut-form fixes, O6's copy and the digest replay that keeps `ids` — restart
+ before retrying any `archilyzer run digest` job — and O2's sidebar outline).
+ 5. **One settings write** after the restart (any Save): it re-normalizes the stored social icons, so
+ the x.com icon loses its `fill="white"`.
+ 6. **The deploys:** the five sites by name, then the hub, then the homepage — the homepage through
+ the new `/sites` → Homepage section (Build homepage, then Deploy homepage), which is O4's live
+ proof.
+ 7. **Re-upload the YouTube picture, watermark and banner** (`~/reports/archilyzer-media/brand/`),
+ still owed since release 10.
+ 8. Optional: rebuild + restart umtool on :3050. Its app changed only in `lib/tools.mjs` (the
+ shared tool probe) and two test-only variable names; O5's render changes already reach it from
+ disk (the live :3050 spawns `report-to-video/*`), and an unbranded render is byte-identical.
+- **Next candidates:** one-core Phase 5 (projects join the core, `plans/one-core.md`); the Diagnostics
+ cards keeping their retry log (O3's found-and-left); `ChartView.tsx`'s five-slot cycle reaching
+ `--chart-6` (O2); O5's two wording lows in `svg-faces.mjs` / the README (kerning is not
+ conservative; `FALLBACK_EM` has exceptions); the LM chat-only tier config; the `Dockerfile.build`
+ image refresh; `transcript-source.spec.ts:76`'s stale-snapshot race (FACTS, "What the integration
+ gate found"); removing the seven `r11-*` worktrees, this one included once `main` carries its tip
+ (it re-sorts the port blocks; `diet-series` stays).
+
**Release 10 is fully rolled out as 0.9.4 (2026-09-28, 00:53).** The blocks below this one are
the history, newest first from "Accent swap and mark contrast rolled out".
- **Slice MR** (the mark ring on dark) merged `2b10f31b`; **0.9.4** cut as editor `2a6f6884` +
@@ -138,7 +214,11 @@ below this block's homepage entry).
Choose some on the [hub's front page] to ask.", with the bracketed words a link to `/`. It
ships as drafted unless changed.
- Whether `/ask` shows a "Searching N of M archives" scope line.
-- **New lows (not started):**
+- **New lows (not started):** *(ALL CLOSED 2026-09-28 by release 11, merged to `main` and not yet
+ rolled out: the icon by O1 — `normalizeSocialSvg` themes a single-colour icon, applied at the next
+ settings write; slice N's forced download and `cookies-mode.spec:241` by O3; `/ask` on a
+ zero-archive hub and the chip's missing live chat by O1 (DRAFT copy); `resolveMaybeMissingState` by
+ O3; umtool's rail/ledger/chart font and the bold IBM Plex Mono by O5. See `release-11.md`.)*
- the operator's x.com social icon is invisible on the light footer (1.11:1): its `<path>` carries
`fill="white"` and `normalizeSocialSvg` defaults only the root fill — fix by re-pasting the icon
without the path fill in `settings.json` (found by slice O's screenshots);
@@ -203,7 +283,8 @@ below this block's homepage entry).
- **The editor was not restarted, on the operator's word.** :3001 has run a post-brand build since 2026-09-26 21:47 (`BUILD_ID` `S07zTu3MKTjHJa9eDM1GF`, main ≈ `9801a034`).
- **Skipped:** the runbook's Anilyzer preview / phone check, on the operator's choice to deploy all five directly.
- **Still optional:** `r10-umtool.sh`.
-- **New lows:**
+- **New lows:** *(both CLOSED 2026-09-28 by release 11 O2, not yet rolled out: `--chart-6`, a
+ validated rust in Vermilion's family; a custom hex fitted per base through `perBaseColor`.)*
- A sixth published site's chart colour would nearly duplicate Anilyzer's magenta. Fix this before Jasolyzer gets a `siteUrl`.
- A custom hex is not fitted per base on the homepage cards.
diff --git a/plans/release-11.md b/plans/release-11.md
@@ -1508,7 +1508,217 @@ blocker. Docs and record only:
- **N1** (pre-existing, recorded only): with `E2E_TWO_ORIGIN_REBUILD=1`, playwright loads
`playwright.2origin.config.ts` twice, so `stageTwoOrigins()` builds the hub twice per run.
+### Integration, as merged (2026-09-28)
+
+Every slice was reviewed to SHIP on its own branch and merged by the parent as it landed; this pass
+gated the combined tree once and wrote the records. Worktree `/home/user/Projects/r11-integration`,
+branch `r11/integration`, port block #5, fast-forwarded to `main` `eb28a341` (`pnpm install
+--frozen-lockfile`: already up to date). **No code changed at integration**: every gate below ran on
+`eb28a341`, and the commits after it are `plans:` only. Scratch files `int-*` in the job's
+`tmp/overnight`.
+
+| merge | branch → tip | review | on `main` |
+|---|---|---|---|
+| **O4** homepage deploy from `/sites` | `r11/homepage-deploy-ui` → `83b786ca` | SHIP AFTER FIXES → re-read SHIP | `baaa4b47` |
+| **O3** runner lows | `r11/runner-lows` → `f4615403` | SHIP AFTER FIXES → re-read SHIP | `c1d4790a` |
+| **O6-A** Phase 4 slice 3, checkpoint A | `r11/phase-4-s3` → `11d0403c` | SHIP AFTER FIXES → re-read SHIP | `cb9d02b2` |
+| **O1** hub lows + DRAFT copy | `r11/hub-lows` → `8f5011c3` | SHIP AFTER FIXES → re-read SHIP (one new low, folded into O2b) | `6cd3a9fe` |
+| **O2** homepage and brand lows | `r11/homepage-lows` → `1b39f285` | SHIP | `139a648e` |
+| **O5** umtool brand fonts | `r11/umtool-fonts` → `8644e63f` | SHIP (four lows, two wording — see below) | `15d5d646` |
+| **O2b** follow-ups | `r11/homepage-lows` → `013efa35` | SHIP; the review's changelog nits as `59d2f877` on `main` | `69e7f59e` |
+| **O6-B** checkpoint B, the `E2E_` prefix | `r11/phase-4-s3` → `0ccd34f3` | SHIP AFTER FIXES → re-read SHIP | `eb28a341` |
+
+**What joined by hand** (`git show --remerge-diff` on each merge).
+- `baaa4b47`, `c1d4790a`, `cb9d02b2`, `6cd3a9fe` and `eb28a341` merged clean: each branch had merged
+ `main` itself first (O3 `0c770285`, O6 `fcdaea12`, O1 `c7b42f23`; O6-B fast-forwarded), and
+ resolved its joins there.
+- `139a648e` (O2): `editor/CHANGELOG.md` (O6's CLI bullet, then O2's forced-colours bullet),
+ `export/CHANGELOG.md` (O1's five hub bullets, then O2's outline and fitted-hex bullets) and this
+ file's Record (O6-A, O1, then O2). Every side kept.
+- `15d5d646` (O5) and `69e7f59e` (O2b): this file's Record only.
+- No code file conflicted in any merge.
+
+**Changelogs, checked as one set.** `editor/CHANGELOG.md` and `export/CHANGELOG.md` each have
+exactly one `[Unreleased]`, directly above `[0.9.4]`: editor **8** bullets (O4 2, O3 3, O6-A 1,
+O6-B 1, O2 1), export **9** (O3 1, O1 5, O2 2, O2b 1). Export's released part (`[0.9.4]` down) is
+byte-identical to the 0.9.4 cut `ee9d41fa`. The editor's differs by exactly two link targets in
+older released bullets (`DEPLOY_DOCKER.md` / `DEPLOY_CLOUDFLARE.md` → PUBLISH.md anchors, words
+unchanged: O6 review Q1, `ef84f535`). `homepage/CHANGELOG.md` keeps its own convention (one
+`[Unreleased]`, no cuts) and gained O2's four bullets, O2b's icon bullet and O6-B's Docker-page
+bullet; O6-B's rename also rewrote one release-10 bullet there (`HOMEPAGE_SUMMARY_FILE` →
+`E2E_HOMEPAGE_SUMMARY_FILE` beside `e2e/fixture-accents.ts`, a file that no longer exists — found
+and left, below). No bullet repeats or contradicts another or the code as merged.
+
+**Gates**, all from the worktree root on `eb28a341` (`$T/int-gates.log`, `$T/int-e2e.log`, per-run
+logs `int-g-*.log` / `int-e2e-*.log`).
+- **tsc** (`pnpm -r --no-bail --workspace-concurrency=1 exec tsc --noEmit`): clean, 67 s.
+- **Unit and script tests:**
+ - common **2,112/2,112**, 45 s (O6-B's recorded count: release 10's 2,038 + O4 3 + O3 10 + O6 30 +
+ O1 21 + O2 5 + O2b 3 + O6-B 2);
+ - editor unit **85/85**;
+ - `test:scripts` **185 passed + 1 skip of 186** (the report-to-video tests included, O5's +10; the
+ skip is the `LIVE=1` network test);
+ - mcp **269/269**; homepage unit **2/2**.
+ - `archilyzer docs env --check`, `settings example --check`, `docs files --check`: all exit 0.
+- **Builds**, all ok, with `export/public` linked per path from the primary (17 links, none dangling)
+ and `homepage/public` holding only its tracked `_headers` (no data copied):
+ - editor 35 s (`BUILD_ID` `dcjZIUK_AhSRInyprrQny`); the route table lists
+ `/api/ops/build-homepage`, `/api/ops/deploy-homepage` and `/api/ops/cut-release`;
+ - export site 23 s: `<html … data-accent="signal">`;
+ - export hub (`INSTANCE_MODE=hub`) 23 s: `… dark" data-base="dark" data-accent="signal"`,
+ `out/ask/index.html` present (48,656 B);
+ - homepage (`pnpm --filter homepage exec next build`, NOT `run build`, whose `prebuild` indexes the
+ corpus) 12 s: the no-data page; its stylesheet carries the `forced-colors` rule and `--chart-6`
+ (×2 `#823c10`, ×1 `#a54a08`);
+ - umtool 16 s (`BUILD_ID` `pikb-0UeTC_FTcwMV-Xml`).
+- **e2e**, one detached sequence (04:44 → 05:38), every run through the machine-wide queue (no
+ wait: nothing else held it):
+
+ | suite | passed | failed | skipped | time |
+ |---|---|---|---|---|
+ | export full | **206** | 0 | 0 | 6.9 min |
+ | `e2e:hub` | **33** | 0 | 0 | 1.2 min |
+ | `e2e:2origin` (`E2E_TWO_ORIGIN_REBUILD=1`, links in place) | **3** | 0 | 0 | 34.2 s (64 s with the two hub builds) |
+ | homepage full (no `homepage/public` data) | **31** | 0 | **0** | 45.5 s |
+ | umtool full (`SONG_DIR=~/reports/quartering-uh-song/data`) | **175** | 2 | 45 | 4.2 min |
+ | **editor full** (`pnpm e2e`, 665 tests) | **652** | 1 | 12 | 39.5 min |
+
+ The homepage's 31 with 0 skipped is O2's claim proved on a clean worktree: the suite reads its
+ synthetic summary and nothing from `public/` or the primary (`e2e/.e2e-summary.json` written by the
+ config; `homepage/public` still only `_headers` after). The 45 umtool skips are the song-data
+ capabilities this machine lacks (O5's and O6-B's runs: the same 175 / 2 / 45). `e2e:2origin`'s log
+ shows `compose hub` run twice (N1) into the WORKTREE's `export/public`.
+- **Failures, classified** (each re-run alone, `$T/int-rerun*.log`):
+ - **umtool `mix.spec.ts:166` and `:201`: the known order-dependent pair, not the integration.**
+ Failed exactly as FACTS records ("`mix.spec.ts` IS ORDER-DEPENDENT"): the row linked to the
+ fixture's `channels/testchan/data/vid1/clips/0.00-14.00.mp4`, left by an earlier spec, instead of
+ `/out/clips-raw/vid1_0.00-9.00.mp4`. O5's and O6-B's full runs failed on the same pair. Alone,
+ `mix.spec.ts --repeat-each=3`: **36 passed**, 36.4 s (`int-rerun-umtool-mix.log`).
+ - **editor `transcript-source.spec.ts:76` ("diagnostics list a video with only
+ transcript.en-US.vtt"): a flake, not known before this pass.** The Diagnostics stage rendered
+ "Channel health" with no populated bucket, so the snapshot the page read lacked the video in
+ `nonStandardVtt`; the `Non-standard transcript VTT name (1)` heading never appeared (5 s
+ expect, 17.5 s in all). Alone, `transcript-source.spec.ts --repeat-each=3`: **9 passed** (the
+ spec's three tests ×3), 41.6 s (`int-rerun-editor-transcript-source.log`). Release 11 touched
+ nothing on its path: not the spec, `e2e/helpers.ts`, `common/controller/channelSnapshot.ts`,
+ `common/views/pipeline/stageStatus.ts`, `DiagnosticsStage.tsx` or the channel `page.tsx` (`git
+ diff --stat 2162db92 eb28a341`). O3's `RetryBucketControl` change renders inside a bucket's card,
+ below the heading that went missing, so it cannot hide it. The likeliest mechanism is
+ `generateReport`'s early return when a `snapshot.json` already exists (`e2e/helpers.ts:193`):
+ one written between `resetData` and the test's VTT swap (a debounced flush from the test before)
+ would be stale and never refreshed. Recorded in FACTS; not fixed (no code at integration).
+ - Nothing else failed. The 12 editor skips are `channels-rack-audit.spec.ts`, which runs only with
+ `E2E_RACK_SHOTS=1`.
+ - **Verdict: FLAKES-ONLY.** No regression.
+- **The primary's `export/public` was never written.** `$T/int-ptree.sh` lists every entry (391:
+ 380 files, by path, type, size, mtime and md5; links by target — it has none) without following
+ links. Taken before any build (`int-primary-before.tree`, md5 `0f4b1f66…`), after the builds,
+ after the export suite, after `e2e:hub`, after `e2e:2origin` and after the editor suite:
+ **identical every time** (`cmp`).
+ - What the runs did in the worktree: the export suite replaced the `sw.js` LINK with its own plain
+ file; `e2e:2origin`'s `compose hub` (which logged "hub-summary.json skipped") replaced the `sw.js`,
+ `hub-sites.json`, `corpus.json`, `llms.txt`, `robots.txt` and `_headers` links with plain files.
+ The seed (`$T/int-seed-public.sh`) relinked every entry before the next run, and
+ `find export/public -xtype l` was empty before each.
+- **The live processes were never touched:** :3001 still serves `BUILD_ID` `S07zTu3MKTjHJa9eDM1GF`
+ (2026-09-26 21:46); nothing was deployed, cut, pushed, restarted or written under `transcripts/`.
+- Numbers tools: none.
+
+**Records folded in at integration** (the `plans:` commits below).
+- **FACTS:** a new section, "Release 11 — slices O1–O6", anchored at `eb28a341`. Amended with dated
+ notes: the `/api/test/*` guard's variable (`EDITOR_TEST_ROUTES` → `E2E_TEST_ROUTES`, now set by
+ `editor/playwright.config.ts`' `E2E_SERVER_ENV`, not `dev:test`), `TWO_ORIGIN_REBUILD` →
+ `E2E_TWO_ORIGIN_REBUILD` in the two worktree-link facts, and `DEPLOY_CLOUDFLARE.md` →
+ `PUBLISH.md` in the preview-access fact. Release 10's "L1 — hub lows" was already amended by O1
+ (`ac9c299b`); its colour entry gains one dated line (`fittedHex` is `perBaseColor`'s only
+ production caller). A closing subsection, "What the integration gate found", records the
+ `transcript-source.spec.ts:76` flake and what each suite writes into a worktree's
+ `export/public`.
+- **O5 review's two wording lows (L1, L2) are recorded in FACTS, not fixed**: IBM Plex Sans has
+ positive kerning pairs, so the sum of advances is not conservative in general (real text's worst
+ net kerning +0.50 px); `FALLBACK_EM` 1.3 is exceeded by a few wide symbols (`⟹` 1.42 em). The
+ comment at `umtool/report-to-video/svg-faces.mjs:32-35` and the README's "Why a table" still say
+ otherwise — a comment-only fix for a later slice (no code changes at integration).
+- **STATE:** a new "Now (2026-09-28, morning)" block above the 0.9.4 one. The 2026-09-26 block's
+ "New lows (not started)" (the x.com icon through umtool's fonts, formerly l.142–155) and the
+ 2026-09-27 rollout's two new lows get a dated note: all closed, with the slice that closed each.
+- **`brand-and-themes.md`:** S4's record said the rail/ledger/chart text stays Fira and no bold Plex
+ Mono is vendored (the "Not branded, on purpose" bullet, the found-and-left `fontBold` bullet and
+ the review-rulings line); each gets a dated note that O5 closed it.
+
+**Found during the pass.**
+- **One `homepage/CHANGELOG.md` bullet is now wrong about its own past.** O6-B's rename rewrote the
+ release-10 bullet "The e2e reads a copy of the summary with fixture accents (`HOMEPAGE_SUMMARY_FILE`,
+ `e2e/fixture-accents.ts`)" to `E2E_HOMEPAGE_SUMMARY_FILE`; neither the new name nor the file
+ existed at that time, and the newer O2 bullet already says the fixture file is gone. Harmless:
+ `homepage/CHANGELOG.md` is not published (the homepage's `/changelog` renders export's,
+ `homepage/app/changelog/page.tsx:25`). A wording fix at the next touch.
+- **The O1 review's new low (a `<clipPath>` counted as a colour) was folded into O2b** (`c17ead28`),
+ so nothing from it is open.
+- **Merged code already runs where processes spawn scripts from disk.** The primary checkout is on
+ `main` `eb28a341`, so the live :3050 already spawns O5's `umtool/report-to-video/*` (a branded
+ render gets Plex and the bold mono; an unbranded one is byte-identical), and any build the live
+ :3001 starts runs the new on-disk scripts (release 7's lesson). O6 kept every package-script name
+ the publish pipeline calls (`build:index`, `compose:site`, …), so an old-editor build still
+ resolves them; an unattended build-deploy would publish the merged code with its `[Unreleased]`
+ notes, which the operator accepted for the night. Outside `report-to-video/` and its e2e, umtool
+ changed only in `lib/tools.mjs` (O6's shared probe) and two test-only variable names
+ (`bin/cut-from-cache.mjs`, `lib/projects/kinds.mjs`); nothing requires a rebuild.
+
+| sha | what |
+|---|---|
+| `eeff74c3` | `plans:` FACTS — release 11 section; dated amendments (the `E2E_` names, PUBLISH.md) |
+| `3643c974` | `plans:` `brand-and-themes.md` — O5 closed S4's Fira and bold-mono notes |
+| _this_ | `plans:` this record, STATE ("Now (2026-09-28, morning)"), the Rollout steps |
+
## Rollout
-Nothing is rolled out tonight. The morning runbook lists what is owed: the :3001 editor restart,
-a release cut and then the deploys, and the YouTube asset re-upload.
+Nothing is rolled out: no cut, no deploy and no restart happened overnight, by rule. `main` is the
+integration tip (above); the live :3001 editor still runs `BUILD_ID` `S07zTu3MKTjHJa9eDM1GF`
+(2026-09-26 21:46), and the live sites are 0.9.4. The operator owes, in order (the parent's runbook,
+`~/reports/overnight-2026-09-28/MORNING.html`, has the scripts):
+
+1. **Rule on the copy lines** in `export/app/ask/hubScopeCopy.ts`: the three marked `// DRAFT
+ (release 11, 2026-09-28)`, and release 10's still-unruled one.
+ - `:7` `NO_ARCHIVES_IN_SCOPE` (release 10's, unmarked): "No archives selected. Choose some on the
+ [hub's front page] to ask."
+ - `:16` `NO_ARCHIVES_ON_HUB`: "This hub has no archives yet. Add one on the [hub's front page] to
+ ask."
+ - `:24` `LIVE_CHAT_MISSING`: "live chat didn't load"
+ - `:33` `ASK_SCOPE_LINE(n, m)`: "Searching {n} of {m} archive(s) — [change on the front page]."
+ (shown whenever at least one archive is in scope; return `null` for all-in-scope to show it only
+ when some are off)
+
+ They ship as drafted unless changed. A change is one small commit on `main` before the cut;
+ `ask.spec` and `federated-search.spec` import these constants, so they follow.
+2. **Answer the records' questions** (none blocks the rollout):
+ - O6: should Build all / Build & deploy all honour `buildPipeline.mode`? Today the mode is a label
+ and containers are used whenever `docker version` answers.
+ - O2: is `--chart-6`'s rust acceptable beside `--state-gone`? The validator fails that pair; gone
+ is only labelled text on the homepage.
+ - O3: settle the five Rumble videos that got HTTP 410 on 2026-09-25 with a "Full-check unexpected"
+ on `rekietalaw-rumble` and `the-quartering-rumble`. They read "Missing?" after the next build;
+ the full check would make them Deleted.
+3. **Cut the release:** `archilyzer release show`, then `archilyzer release cut all next --commit`
+ (editor 8 pending bullets, export 9; export's are public on every site's `/changelog`). The
+ homepage changelog keeps its own `[Unreleased]` convention and is not cut.
+4. **Restart :3001 on the new `main`** (one restart). It brings O4's Homepage section and the two ops
+ routes, O3's retry-bucket, forced-download and Cut release form fixes, O6's build-mode copy and the
+ digest replay that keeps `ids`, and O2's sidebar outline under forced colours. **Restart before
+ retrying any `archilyzer run digest` job**: the old editor's replay widens it to the whole channel.
+5. **Write the settings once** (any Save on Settings, or any other settings write). `writeSettings`
+ re-normalizes every stored social link, so the x.com icon's `fill="white"` becomes `currentColor`.
+ Check `settings.json` afterwards.
+6. **Deploy.** First the five sites by name: the maybe-missing badge change, the forced-colours
+ outline, the single-colour icon and the changelog. Then the hub: O1's `/ask` changes, the fitted
+ hex for official and added archives, the outline. Then the homepage, **through the new `/sites` →
+ Homepage section**: Build homepage with Deploy after build unticked, then Deploy homepage (or `pnpm
+ ops build-homepage --wait`, then `pnpm ops deploy-homepage --wait`; the log ends `[deployed]
+ https://<hash>.archilyzer.pages.dev`). That is O4's live proof. The homepage reads the index as it
+ stands, so it goes after the sites' builds.
+7. **Re-upload the YouTube picture, watermark and banner** (`~/reports/archilyzer-media/brand/`),
+ still owed since release 10.
+8. **Optional:** rebuild and restart umtool on :3050. Nothing in the app needs it; O5's render changes
+ already reach the live :3050 from disk, and an unbranded render is byte-identical.
+9. **Afterwards:** remove the seven merged `r11-*` worktrees when nothing runs (it re-sorts the port
+ blocks; `diet-series` stays).