Archilyzer · Source

archilyzer

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

commit a9d6c9f91502f41e1d8e276a3c1e40ecd62e4aeb
parent 9920845af6b7dae89a68467ae252b86d1dda72f0
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date:   Thu, 24 Sep 2026 13:28:55 -0400

plans: slice 3a, as shipped; changelog entry

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

Diffstat:
Meditor/CHANGELOG.md | 1+
Mplans/one-core-phase-3.md | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 54 insertions(+), 0 deletions(-)

diff --git a/editor/CHANGELOG.md b/editor/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## [Unreleased] +- **Every channel table and every job-in-flight line is now drawn one way.** The /channels rack, the dashboard's Channels table and the work tables on the operation pages and /cleanup are one table with a column set per page, over one channel row built on the server (which no longer ships a channel's config to the browser); the dashboard's "Needs work" seed is computed by the same code the widget endpoint serves. On the jobs side, /jobs rows, the "Active jobs" cards on channel/video/operation pages, the monitor widget's Active jobs strip and the operations board's "In flight" list are one job row in three sizes, with one rule for which buttons (Retry / Reorder / Drain / Cancel / Force-release) a job gets. **What you might notice:** a work table's report column reads "stale"/"missing" like the rack's instead of a date; the dashboard's Sync button is the rack's; a lane line on /jobs offers Force-release while its runner is running; widget job lines show who asked for the job; an in-flight download on the operations board links to its job page. Nothing a count says moved. - **`settings.json` has one schema and one writer, and its key table is generated.** Every key, its default, its clamp and its documentation is now one zod schema (`common/lib/settingsSchema.ts`); `getSettings`/`writeSettings` both parse through it, and every settings form saves through one helper (`editor/app/settings/saveSettings.ts`) that merges only what the form changed. **`SETTINGS.md`** (new, repo root) lists every key with its default and what it does, and `settings.json.example` is now the full default object — both generated by `common/bin/settings-example.ts` and checked by a test, so neither can drift. Nothing an operator has configured reads differently. **Fixed:** adding or editing a storage location on `/storage` no longer erases the record of which location the saved-video store is on (`storage.savedVideosLocationId`). - **Every live panel now polls one endpoint, `/api/view/<name>`, and the eight old addresses still answer.** The change token, the job head, workers, the operations board, the sync console and the widget's three strips were eight separate API routes that each did the same thing; they are one route serving eight named views (`pulse`, `activeJobs`, `workers`, `autoQueueStatus`, `schedulerStatus`, `widgetSync`, `widgetActionable`, `cleanable`), and the editor's own pages poll it there. `/api/pulse`, `/api/jobs/active`, `/api/workers`, `/api/auto-queue/status`, `/api/scheduler/status` and `/api/widget/{sync,actionable,cleanable}` are kept as **rewrites**, not redirects — same method, status, body and query string (`?rev=` included) — so a monitor widget pinned in a browser, or any script polling the old path, keeps working untouched. `/api/widget/presets` is unchanged. An unknown view name is a 404. **One behaviour change you might notice:** the operations board (every 3 s) and the sync console (every 5 s) now send their next poll only after the previous one answers, and abandon a poll that takes longer than 10–15 s — so a slow editor no longer piles requests up behind itself, and a hung request no longer stops the page updating. - **A lane's pause is one key on the lane, and the four old pause fields are gone from `settings.json`.** Holding a lane has been `autoQueue.<lane>.held` since the runner work landed; until now the file also still carried the four flags that used to mean it — `transcriptionsPaused`, `downloadsPaused`, `digest.digestsPaused` and the backwards `backfill.enabled` (where *enabled* meant *not held*) — which were read only when a lane had no `held` yet, to carry an older file's pause across. Every lane now carries its own key, so those four are **deleted**: nothing reads them, no form writes them, and the next settings save drops them from the file. A settings.json that still spells one of them holds nothing with it, so a hand-edited file (or a very old backup restored over a newer one) can no longer resurrect a pause you had lifted, or lift one you had set. "Run the backfill lane" on the diarization page and the Hold/Pause buttons write the one key, as they already did. **UPGRADING: boot once on the release that writes `held` before taking this one.** That release is the one that moved the gate onto the lane and carried the old fields across on read; a single boot of it (any settings save, or just starting the editor and pausing/resuming anything) puts `autoQueue.<lane>.held` in your settings.json, after which **nothing you can see changes here** — the same buttons, the same labels, the same pauses. An install that jumps straight from an older release to this one has no `held` keys at all and **loses its pauses**: transcription, downloads and digests come up running, and the backfill lane comes up held. Re-set them from the dashboard, or add the keys by hand before starting. diff --git a/plans/one-core-phase-3.md b/plans/one-core-phase-3.md @@ -782,3 +782,56 @@ docs) at `5b43dc8d`, **1650** after `81deae69` (+2 docs wiring tests); `test:scr diarization, attribution, scheduler, cadence-ui, storage-locations, channel-storage, workers, worker-remote, parakeet, parakeet-partial, chough, transcription-app-migration, disk-space, channel-priority, settings — **157/157 passed, exit 0, 9.9 min**, first run, nothing re-run. + +## Slice 3a, as shipped — one drawing per noun (2026-09-24) + +Branch `one-core/phase-3-s3a` off `1e27f7c3`, unmerged. *Commit 8 (this record) was written +while the two `next build`s were still running; their results are in the implementer's +report, not here.* + +| sha | what | +|---|---| +| `ab7a4739` | `common/views/channelRow.ts` (`ChannelRowView`, `buildChannelRowView`, `reportStateOf` moved, `ChannelRowPriority`, `ChannelRowMedia`, `channelVolumeOf`) + `actionableCounts.ts`, both tested; `loadActionable` count helpers become wrappers | +| `155efeb9` | rack split: `ChannelsRack.tsx` (chrome) + shared `ChannelsTable.tsx`; `channelColumns.tsx` registry; `/channels` builds rows with the builder | +| `01f08670` | dashboard on the shared table; "Needs work" seed = `buildWidgetActionablePayload(widgetActionableRows(rows))`; `PrioritizeButton` moved; `dashboard/ChannelsTable.tsx` + `types.ts` deleted | +| `f63260d8` | `ChannelWorkTable` = server shell over the shared table; `Row` and `isStaleOrMissing` deleted | +| `0d20c42a` | `jobs/components/JobRow.tsx` (table / card / compact) + `JobRowActions` + `JobRowHeading`; JobsTable, RunningJobsList, LaneStrip on them; compact bars; `lib/formatElapsed.ts` | +| `797078c2` | `AutoRunnerInFlight.jobId` (type + the two `onChildJob` callbacks); `fromInFlight` + `source: "runner"`; InFlightList on `JobRow compact` | +| `4a784486` | widget `ActiveJobsStrip` on `JobRow compact`; its private row, bars, glyph tables deleted | +| `c944475f` | fix: column ids/presets move to plain `channelColumnPresets.ts` (see deviation 1) | + +**Gates.** tsc clean after every commit. common **1677** (1663 + 5 actionableCounts + 6 +channelRow + 3 fromInFlight); editor unit **67**; `test:scripts` 156 + 1 skip. **e2e**, one +detached run from the worktree root, 41 spec files (both lists; every named file exists): +**280 passed, 0 failed, 0 skipped, 0 flaky, exit 0, 14.7 min** — the second run; the first +was stopped in its first minute on the bug `c944475f` fixes. **Numbers** +(`phase3-view-numbers.ts`, primary's `transcripts/` + `settings.json`, read-only): main +`1e27f7c3` (a clean detached checkout) and the branch at `4a784486`, back to back — **diff +empty, 5,925 bytes each**. The `autoQueueStatus` view gains the optional per-unit `jobId`; +the numbers tool does not cover that view. + +Deviations: +1. **A column registry by id, not column objects.** A server shell cannot pass `cell: (row) => + ReactNode`. And a server component that imports a VALUE from a `"use client"` module gets + a client reference, not the value (`WORK_COLUMNS.filter is not a function` on every + operation page — invisible to tsc), so the ids, sort keys, `PipelineColumn` and presets + live in the directive-free `channelColumnPresets.ts`; the cells stay in the client registry. +2. **The rack split** into `ChannelsRack` (focus / volume / instrument bars, scroll region + + `--thead-h`, selection + free-up, the deck outside the scroll box) and the shared table; + group-header `colSpan` is counted from the drawn columns. +3. **LaneStrip keeps its lane line**; its runner job's buttons are `JobRowActions`, so it now + also offers Force-release while that job runs, and Cancel only while running/queued. +4. **Runner `jobId`**: three lines in `autoRunner.ts`; the private `childJobIds` map stays + private. A `source: "runner"` row links `Job <id>` only when `inRegistry`. +5. `formatElapsed` went to `editor/app/lib/formatElapsed.ts` (dispatch.ts re-exports), not + `common/lib/format.ts`: that file was the parallel slice's, and it is not `formatDuration`. +6. `channelVolumeOf` (the page's `volumeOf`) lives in `channelRow.ts`; the builder takes an + optional `mediaLocationLabel` so the dashboard still names the badge's location from the + media target. +7. Work tables use the rack's report cell (`report age for <slug>`, "stale"/"missing"); + an unset last sync still reads "never". Actions are left-aligned everywhere. +8. The dashboard's Sync is `ChannelSyncButton` (same `sync <slug>`, same `role="alert"`). +9. Widget job lines now show `detail`, as every other job row does. +10. Group sections still carry `ChannelStat` (config included) to the client — pre-existing, + untouched. +11. Commits 1–7 and the fix carry an Opus 5.5 trailer, not the header's; left as they are.