Archilyzer · Source

archilyzer

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

commit cb38dafa2c6763106a2a31699efed6d5fd5e63a0
parent 12a41e7bc3501984a39afef20abd9d7c4989805a
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date:   Thu,  1 Oct 2026 10:19:13 -0400

plans: release 16 slice RM — a media move refuses to start over a running job, holds the channel's writers, and mirrors its copy before verifying

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

Diffstat:
Mplans/release-16.md | 21+++++++++++++++++++++
1 file changed, 21 insertions(+), 0 deletions(-)

diff --git a/plans/release-16.md b/plans/release-16.md @@ -24,6 +24,7 @@ slice's prompt carries its ruling, and this record carries what was built. Rules | CK | `r16/search-in` | A "Search in" row — Transcripts, Posts, Live chat — on the export and hub search, Transcripts and Posts on by default | `common/components/{FiltersPanel,SearchSessionContext,SearchResults,SearchBar,exportFilterStorage}.tsx/.ts`, `common/lib/searchQuery.ts` and `common/lib/search/*` as its prompt names, `export/e2e/search-in.spec.ts` (new) and the specs its prompt names, `export/e2e/helpers.ts`; records: `plans/FACTS.md` | | DX | `r16/research-setup` | The research-only setup (source → `pnpm install` → `claude mcp add archilyzer` → `/ask`) in one place, the homepage's AI and MCP doc; the sites' and the hub's Use-with-AI page removed and its links pointed at the doc; `README.md` §1/§4 and `mcp/README.md` their own copies (as amended) | `homepage/content/docs/ai-and-mcp.md`, `export/app/use-with-ai/` (removed), the Use with AI links (`export/app/components/{Header,MobileMenu,Footer}.tsx`, `export/app/(workspace)/ask/page.tsx`), `common/lib/{project,corpus}.ts` + `common/bin/compose-site.ts` (what named the page), `mcp/README.md`, `README.md` §1/§4 (wording only), `homepage/e2e/docs.spec.ts`, `export/e2e{,-hub}/use-with-ai-link.spec.ts` and the specs that visited the page | | FK | `r16/forms-keep-input` | Every editor form keeps what was typed when its action fails: actions return the submitted values with the error, the shared field helpers seed from them | new `editor/app/lib/formState.ts` + test; `editor/app/components/forms/Field.tsx` and the local `Field`s in `SiteForm.tsx`, `ChannelForm.tsx`; every action that returns `{ok:false,error}`/`{error}` (sites, settings, operations/settingsActions, scheduler, storage, homepageActions, cutReleaseAction, channels, videoActions); the 15 forms the ruling lists; e2e `forms-keep-input.spec.ts` (new) + the existing `sites-crud`, `settings`, `channels` specs; records: `plans/FACTS.md`. As shipped, also `editor/app/components/forms/Controlled.tsx` (new) and one tag swap each in `DurationField`, `SocialLinksField`, `SiteMembershipsSection`, `WorkersField` ("Slice FK, as shipped") | +| RM | `r16/move-holds-writers` | A media move holds the channel's writers and mirrors its copy, so a transcription or download during the move cannot fail it | `common/controller/relocateChannelMedia.ts` (+ the saved-video mover if it shares the code) + tests; the lane runners' per-channel skip (`common/controller/autoRunner.ts`, the backfill/digest/normalize/clip-fetch entry points, `common/lib/channelMediaHold.ts`); `common/jobs/jobKinds.ts` (`needsMedia`); the channel page's Storage panel and the rack's reason text; `editor/e2e/relocate*.spec.ts`; records: `plans/FACTS.md` | ## Slice CK — the ruling (2026-09-30) @@ -86,6 +87,25 @@ slice's prompt carries its ruling, and this record carries what was built. Rules doing so. - Labels and test ids are contracts; nothing on disk changes shape. +## Slice RM — the ruling (2026-10-01) + +- **A move refuses to start while a job is running on the channel** (download, transcription, + normalize, digest, clip fetch, metadata refresh, snapshot — anything that writes under its + `data/`), naming the job; the operator waits or cancels it. A move never waits silently. +- **While `.relocating.json` exists, the channel's writers are held:** every lane runner skips the + channel (the hold's sentence says "its media is moving"), every `needsMedia` job refuses to start + on it (it does today through `in-transition`; the slice proves which writer got past that on + 2026-09-30 — the transcription of `v50t5yt` ran during the copy — and closes it), and the hold + clears when the move completes or is abandoned. The rack and the channel page show the hold. +- **The copy mirrors.** The last copy pass before verification is `rsync -a --delete` from source to + the destination copy (the destination is the copy under construction; the source is never the + target of `--delete`), and verification is an empty `--dry-run --itemize-changes --delete` plus + equal counts. If a source change is seen between the pass and the check, one more pass runs; a + second difference refuses and names the file. Resume takes the same path, so an interrupted move + with stale files on the destination (the 2026-10-01 case: a transcriber's scratch dir copied, then + deleted from the source) completes. +- The on-disk marker's shape does not change; nothing else about where media lives changes. + ## Record ### Slice CK, as shipped — a search reads what the visitor ticked (2026-09-30) @@ -752,6 +772,7 @@ Both slices are export- and homepage-side; the editor and umtool are not rebuilt (ruled: Posts on by default); untick Posts → none; tick Live chat on a video with chat → the hits wear "live chat"; untick all three → Search disabled with the row named. 5. Records: this section, `STATE.md`, memory. +7. Slice RM (2026-10-01) is editor-side: a capped editor build and one restart after its merge. 6. Slice FK (2026-10-01) is editor-only: a capped editor build and one restart after its merge — done 03:15–03:16 (`GUkqnqHzYNMPWIF-rBS6W`), smoke green.