# The editor: one noun, not a pile **Status: COMPLETE (verified against the tree 2026-10-09).** Slices 1–8 shipped (records below). Slice 9 shipped as one-core Phase 1 slice 1.3 (`253826b` → `451c454`, 2026-09-07; record `one-core-phase-1.md`): `digestSweep.ts`, `backfillSweep.ts`, `arbiter.ts`, `SweepLane.tsx` and `SweepScope.tsx` are gone, the sweep resume hooks left `instrumentation.ts`, and each lane has one console. This is the UI half of [`unified-operations-model.md`](unified-operations-model.md), which states the backend half ("four schedulers for what is really one kind of work"; steps 1, 5, 6 open). Read that one first if you are touching a dispatcher; read this one if you are touching a page. ## The diagnosis, in one line **The backend has found its organizing noun — the operation — and the UI has not.** The editor grew page-by-mechanism. Each scheduler, sweep, runner and derived feature landed with its own route, its own fieldset, its own pause switch and its own counter. What that adds up to, counted rather than estimated: - **28 pages** behind a **19-link nav**, whose "Pool" group holds **10 unrelated tools**; - **four channel tables** (`/channels`, the dashboard's, `/actionable`'s, `/cleanup`'s); - **four job lists** (`/jobs`, `/jobs/active`, `/jobs/queue`, the per-channel one); - **three renderings of lane state** (the rail, the dashboard cards, `/jobs/active`'s lanes); - **eight settings surfaces**; and - **four different answers to "what needs doing"**. Digest and attribution are first-class in the **registry** — `common/lib/backfillKinds.ts` says in its own header that registering attribution "lit the channel stage card, `/actionable`, the dashboard instrument and the widget strip with ZERO UI changes" — and second-class in the **UI**: no route, no stage of their own, no per-video view, and two settings fieldsets for one concept. The coherent parts of the UI are exactly the parts that already treat the operation as the noun: `StateBand` drawn at three scales off one fold, and `operationCatalog()` driving both the `/channels` columns and the auto-queue rail. The pile is everything that does not. ## The vision statement > The editor is the operator console for turning a large, mostly-verbatim transcript archive > into a derived corpus and publishing it. Its nouns are the **Corpus** (channels and videos, > read from disk), the **Operations** that produce derived artifacts from it (download, > transcribe, digest, diarize, attribute — one registry entry each, with a state per video, a > cost per unit, a lane it runs on, and a rule in the policy tree that dispatches it), the > **Sites** that publish slices of the corpus, and the **Machine** that supplies capacity and > storage. Every screen answers one question about one of those nouns; a number shown in two > places is the same fold over the same snapshot; a pause is a hold and never a stop; and > reachable work is never summed with work that is blocked, deferred or gone. A new operation > is a registry entry, and it appears on the board, the channel page, the video page and the > policy tree without a new page. The last sentence is the test. Today registering an operation lights four *counters* and no *surfaces*. When it lights the surfaces too, this work is done. ## Where "operation as the noun" honestly breaks A model is worth writing down only with its exceptions attached, or the next person meets one and concludes the model was wrong. | Thing | Verdict | | --- | --- | | **Sync** | **SHIPPED 2026-08-29** (slice 8a+8b). An operation, but channel-scoped and cadence-triggered: `scope: "video" \| "channel"` and `trigger: "backlog" \| "cadence"` are on `OperationDescriptor`, `SYNC_OPERATION` is first in `operationCatalog()`, and `/operations/sync` is its page. Two corrections to the wording above. **(1) "Keeps its own runner" could not be `runner`** — that field is typed `AutoQueueKind` and the heartbeat is not one of them, so the page chooses the cadence console off `trigger` and `runner` stays `undefined` (`operations.test.ts` pins it, with the reason). **(2) The board row is composed, not folded into a band** — `OperationBand`'s five populations are videos and sync's figures are channels, so `buildOperationBands` gains no sync band and `OperationRail` draws a `SyncRailRow` first in the same `