Archilyzer · Source

archilyzer

Archilyzer
git clone https://archilyzer.pages.dev/source/archilyzer.git
Log | Files | Refs | README | LICENSE

commit 6430f16f59bbf65e3f23ddcb493bdd9e92e27d32
parent 998abd84d56b133ecfd785c3a045cc38e1efb88d
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date:   Sat, 12 Sep 2026 01:44:45 -0400

plans: the storage + priority integration, and the two slots the next branch lands in

STATE.md carries one head for the integration branch and ONE operator runbook
rather than two that disagree about what goes first: the channel-priority
migration is step 1 because it is the only step that must happen before this
code ever boots, then the platter, the saved-video store and the per-channel
moves. The gate numbers are the ones actually observed on the merged tip, not
the ones the two branches reported separately.

FACTS.md pins the two resolutions that are not a union, because the next branch
to touch the runner's channel list or /channels lands in the same two slots:
`listChannelMeta` returns `{ meta, slugs }` (the slug list is PRE-filter, it is
the focus resolver's existence check), filters paused per LANE, and keeps the
parsed `config` on every entry so the media guard does not re-read 68
config.json files per tick; and ChannelsTable ends in TWO sibling bulk bars,
storage first, where a union of the conflict hunk produces one element with
both bars' props.

The numbers on the merged tip: tsc clean in six packages, common 1051/1051
(908 + 63 + 80, the branches' own totals), mcp 205/205, test:scripts 71 + 1
skipped, next build clean, the editor suite 533 passed / 0 failed in 24.2 min
(518 + 5 + 10). Both sums are the branches' sums, which is the check that no
test hunk was lost in the six conflicts. Neither named flake reappeared.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Diffstat:
Mplans/FACTS.md | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Mplans/STATE.md | 21+++++++++++++++++++--
2 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/plans/FACTS.md b/plans/FACTS.md @@ -3735,3 +3735,54 @@ the editor's legacy seed passes `{}`: the seed is after the lane ORDER, not the 15 carrying `overrides: {sync:"paused"}`, no focus, every base tier `normal`. All four compiled roots are `prio-normal(68) > prio-all`. No lane's membership moves; only the `sync` operation loses anyone. + +## The storage + priority integration (verified 2026-09-12) — where the two branches collide + +`integrate/2026-09-storage-priority` off `e74f005`: `storage/relocate-media` first (branched +at `4059dad` = `e74f005^`, so it conflicts only in `plans/STATE.md`), then +`channel-priority/s5`, which conflicts in six files. Five of the six are "keep both, relocate +first". **The two that are not a union are below, and the next branch to touch `/channels` or +the runner's channel list lands in the same two slots.** + +### `listChannelMeta` returns `{ meta, slugs }`, filters paused, and carries the config + +`common/controller/autoRunner.ts`. The merged signature is +`listChannelMeta(paths, kind, priority): Promise<{ meta: ChannelMeta[]; slugs: string[] }>`, +and all three of its properties are load-bearing, one from each branch: + +- **`{ meta, slugs }`, not an array** (priority). `slugs` is the PRE-FILTER list, because it + is an EXISTENCE filter for the focus resolver: filtering it would drop a focused channel the + lane happens to have paused and make the runner's "M channels held" line disagree with the + banner, which resolves against every channel. +- **The paused filter is per lane** (priority), `isChannelPaused(priority, slug, kind)` — the + EFFECTIVE tier for the lane being listed, so `{tier:"normal", overrides:{sync:"paused"}}` + is still drawn by the download lane. Paused is a filter on the channel LIST, never a shape + in the tree. +- **`config: ChannelConfig` stays on each meta entry** (relocate). `ChannelMeta` carries the + parsed config purely so the media guard can call + `inspectChannelMedia(paths, m.slug, m.config)` without re-reading 68 `config.json` files on + every tick of four lanes and on every three-second status poll — `listChannelConfigs` has + already parsed them. A resolution that dropped the field would compile as soon as the guard + re-read the config, and would cost 68 reads per tick to do it. + +### `ChannelsTable` ends in TWO sibling bulk bars, storage first + +`editor/app/channels/components/ChannelsTable.tsx`. Both branches appended a bulk bar after +`</table>`, in the same slot, each with its own props — `ChannelStorageBulkBar` takes +`defaultRoot`, `ChannelBulkBar` does not. A naive union of the conflict hunk produces ONE +element carrying both bars' props (tsc: duplicate props) and, fixed the obvious way, silently +drops a bar. The shape is: + +```tsx +<ChannelStorageBulkBar slugs={selectedSlugs} onClear={…} defaultRoot={defaultMediaRoot} /> +<ChannelBulkBar slugs={selectedSlugs} onClear={…} /> +``` + +Both branches had ALSO, independently, added the same select-checkbox column and the same +`selected`/`selectedSlugs`/`toggleOne` state — identical text, so git merged it to one copy, +and `colSpan` is `10 + columns.length` from both sides rather than 11. The header is +checkbox · Slug · Name · Handling · Build · Tier · Playlist · Last sync · Report · pipelines · +Actions; priority replaced the Sync column with Tier, so the fixed count moved by exactly the +one column the selection added. `editor/app/channels/page.tsx` feeds both halves: a row +carries `media:` AND `priority:`, and the table takes `defaultMediaRoot` AND +`sites`/`focusLabel`. diff --git a/plans/STATE.md b/plans/STATE.md @@ -6,8 +6,12 @@ session, before context is cleared. See [`README.md`](README.md) for the protoco **Last updated:** 2026-09-12 — **both interlude shipments are merged** on branch `integrate/2026-09-storage-priority`: `relocate-channel-media` (from `storage/relocate-media`) and `channel-priority` (from `channel-priority/s5`), in that order, off `e74f005`. The branch -is unmerged and waits on a fast-forward to `main`; the two entries, and the one operator -runbook they now share, are below under the Phase 1 record they build on. +is unmerged and waits on a fast-forward to `main`; the two entries, the gate numbers actually +observed on the merged tip (editor **533/533**, `common` **1051/1051**), and the one operator +runbook they now share are below, under the Phase 1 record they build on. The two resolutions +that are not a union of both sides — `listChannelMeta`'s return shape and the pair of bulk +bars at the foot of `ChannelsTable` — are pinned in +[`FACTS.md`](FACTS.md#the-storage--priority-integration-verified-2026-09-12--where-the-two-branches-collide). **Previously:** 2026-09-08 — **one-core Phase 1 shipped** on branch `one-core/phase-1` (`7f294df` → `81a663f` plus a docs commit, 36 commits, not merged): **dispatch is one scheduler, and the lane is the @@ -267,6 +271,19 @@ goes first, because it is the only step that must happen before this code ever b rows on `/channels` and use the bulk bar; `omnimirror` (130.3 GB) is the obvious first move. Sizes are in the relocate plan's table — they are sizes, not priorities. +**The gates, all run on the merged tip from the integration worktree +(`/home/user/Projects/integrate-2026-09`, worktree #8 — editor 3801, test 3811, export 3810):** +`tsc --noEmit` clean in all six packages; `common` **1051/1051**; `mcp` **205/205**; +`pnpm test:scripts` **71 passed / 1 skipped**; `next build` clean; the editor suite +**533 passed, 0 failed of 533, 24.2 min** behind the queue lock, one worker. No fix commit was +needed — the six conflicts were the whole of the work. + +**Both suite totals are the sum of the branches', which is how we know nothing was dropped in +the conflicts.** `common` is 908 at `e74f005` + 63 relocate (971 at `bc62248`) + 80 priority +(988 at `996f182`) = **1051**. The editor suite is 518 at `12d1778` + 5 relocate (523) + 10 +priority (528) = **533**. Neither known flake reappeared: `backfill.spec.ts:457` (the +`PolicyTreeEditor` adopt race) was green on its first run, and so was every video-page case. + **Next:** one-core Phase 2 (the contract: one `ArchiveReader`), 3 slices. Read `common/architecture.test.ts`'s allow-list first — it is the shortest accurate statement of what is still tangled, it shrank by one across phase 1, and no slice added an entry, relocate