commit 428a54e67ce4962550119321abbfbc5a437becce
parent 15300ae7349e3d6a313ced7d35c4a2b5f12aab75
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Wed, 23 Sep 2026 20:20:19 -0400
plans: one-core Phase 3 slices 2 and 4a marked shipped
Status line with merge shas; the rewrites-not-redirects and no-batch-route
decisions under slice 2; zod adopted and saveSettings(patch) in place of
saveSettingsBlock under slice 4; Phase 4's `settings example` already
exists as common/bin/settings-example.ts.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/plans/one-core.md b/plans/one-core.md
@@ -311,6 +311,11 @@ https://jeralyzer.pages.dev/corpus.json` before and after, byte-identical output
### Phase 3 — Views in the core, editor as shell (4 slices)
+> **Status 2026-09-23.** Slice 1 shipped 2026-09-15 (`838da4a`). **Slice 2 shipped 2026-09-23,
+> merged as `8d6e84f6`; slice 4a (settings.json only) shipped 2026-09-23, merged as `ae2fa5a9`.**
+> Slice 3 and slice 4b (`site.json`, channel `config.json`, sidecars) are the next release.
+> Records, gates and the next release's inventory: [`one-core-phase-3.md`](one-core-phase-3.md).
+
1. **`common/views/`**: move `buildActiveJobs`, `buildWorkers`, `lanes.ts`,
`channelFlow.ts` + `stageStatus.ts`, the widget sync builder and `pulse` out of
`editor/app/**` into pure functions over (snapshot, registry, settings, pool). Each keeps
@@ -318,6 +323,9 @@ https://jeralyzer.pages.dev/corpus.json` before and after, byte-identical output
2. **One polling route.** `/api/view/[name]` serves any view; the seven thin routes become
rewrites to it (retired routes redirect). Worker protocol (`/api/worker/*`), the external
cron tick, file serving and the four `/api/test/*` routes stay.
+ *As shipped (2026-09-23): EIGHT routes, not seven, became `rewrites()` to the one route —
+ API paths are rewritten, never redirected, so method, body and `?rev=` pass through. No
+ `names=a,b` batch route: cadences stay per call site, and Phase 6's SSE is the batch.*
3. **One drawing per noun.** Channel row: `channels/components/ChannelsTable.tsx` with a
column set replaces the dashboard's and `ChannelWorkTable`. Job in flight: the
`JobRowView` renderer from slice 8c with a `variant` replaces `RunningJobsList`,
@@ -338,6 +346,14 @@ https://jeralyzer.pages.dev/corpus.json` before and after, byte-identical output
`config.json`'s mutable sync state (`lastSyncedAt`, `lastFullSweepAt`, …) is declared
as such in the schema; splitting the file is *not* in scope (disk is frozen).
`settings.json.example` and the docs' key table are generated from the schema.
+ *As shipped for `settings.json` (slice 4a, 2026-09-23): **zod adopted** — the veto is spent,
+ one dependency in `common/`, kept out of every client bundle. The writer is
+ `saveSettings(patch: Partial<SiteSettings>)` (one-level-deep merge,
+ `editor/app/settings/saveSettings.ts`), NOT `saveSettingsBlock(block, patch)`: the
+ channel-priority action writes `channelPriority` and the four `autoQueue` roots in one
+ write, which a one-block signature would split. It is a helper the actions call, not a
+ server action. `SETTINGS.md` + `settings.json.example` are generated. `site.json`, channel
+ `config.json` and the sidecars are slice 4b.*
Deleted: six payload builders from the app, seven API routes, two channel tables, three
job renderers, eight stage status derivations, ~1,400 lines of hand sanitizers.
@@ -351,7 +367,8 @@ job renderers, eight stage status derivations, ~1,400 lines of hand sanitizers.
`--nodata`; `build:hub` gets a CLI and an editor entry (it has neither).
2. **`common/bin/archilyzer.ts`**: `index`, `compose site|hub|homepage`, `build site <id>|all`,
`deploy site <id>`, `sync tick`, `run <operation> <channel> [ids…]`, `mcp`, `settings
- example`, `doctor` (the env/binary/port checks now scattered across `paths.ts`, umtool's
+ example` (*already exists as `common/bin/settings-example.ts`, with `--check`, since Phase 3
+ slice 4a — becomes a one-line subcommand*), `doctor` (the env/binary/port checks now scattered across `paths.ts`, umtool's
doctor and `worktree.mjs`). Existing bins become one-line subcommands and are removed
from `package.json` scripts once nothing references them. Port defaults exist once
(`scripts/worktree.mjs` today says it "mirrors" three other places).