commit db313562698c5ff464d620c1a1e50422c109e476
parent f6c4819987bc70ed2abb3da94c92646167d8b5f9
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Fri, 2 Oct 2026 00:27:55 -0400
plans: slice U2's review (H1, N1, N2; L1 a follow-up), the corrected busy-scan claim, and the gates after the fixes
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
2 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/plans/FACTS.md b/plans/FACTS.md
@@ -8323,7 +8323,12 @@ phase deletes from the destination.
media root is never created; a dangling link, a cut move's leftover (`<name>.moved-*`,
`<name>.incoming`), a bad value, or `"media"` in a process without `UMTOOL_MEDIA_DIR` refuse.
- **`umtool storage deliverables <project> --to media|local`** is the move (the bench's "Move
- deliverables" runs it as a job). `umtool check` reports `storage-unreachable` (blocking: an `out`,
+ deliverables" runs it as a job). It, and `move-out`/`move-back`, refuse a project while
+ `lib/report/busy.mjs` sees a pipeline process in it: a script argument under the project directory
+ (the build steps), a `--project` value equal to the project's id or name or resolving to its
+ directory (how the app runs `cut-from-cache.mjs` and `share-batch.mjs` — matched whole, never by
+ prefix), or `apply-manifest.py`/`build.py` by cwd. A hand-run command that is none of these, and
+ another machine, are not seen. `umtool check` reports `storage-unreachable` (blocking: an `out`,
`clips` or `share-*` link whose target is gone) and `storage-mismatch` (open).
- The e2e app server has no media root (`UMTOOL_MEDIA_DIR=` in `playwright.config.ts`); specs give
their CLI one (`<fixture>-media`), so `deliverables.spec.ts` shows an app cutting through a link it
diff --git a/plans/release-17.md b/plans/release-17.md
@@ -609,11 +609,13 @@ manifests, `revisions/`, the caches and the cue cache stay put; final mp4s trave
that is neither is `manifest-invalid` on `storage.deliverables`, blocking.
- **CLI.** `umtool storage deliverables <project> --to media|local [--dry-run] [--json]`: one line per
directory and the switch's before → after; exit 1 on any failure (the switch then stays). Refused
- while a pipeline process works in the project — U1's `/proc` scan of the report scripts, now also the
- report's own `apply-manifest.py` and `build.py` found by their working directory (they name no
- path). Its blind spots, said in the code and `docs/folders.md`: the app's in-process work (the bench
- runs the move as a job, so the app's one-job-at-a-time rule keeps cuts and batches out), a hand-run
- command, another machine. `umtool storage [<project>]` lists each report's deliverables and switch.
+ while a pipeline process works in the project (`lib/report/busy.mjs` after the review, H1): a script
+ argument under the project directory (U1's scan, how the build steps name a project), a `--project`
+ value equal to the project's id or name or resolving to its directory (how the app runs a cut and a
+ share batch; whole values, never a prefix), and the report's own `apply-manifest.py` and `build.py`
+ by working directory. Not seen: a hand-run command that is none of these, another machine. From the
+ bench the move is itself a job, so the app's one-job-at-a-time rule keeps its cuts and batches out
+ as well. `umtool storage [<project>]` lists each report's deliverables and switch.
- **Bench.** The deliver panel says where the deliverables are (`data-deliverables` = `local` |
`media` | `invalid`; one `data-deliverable="<name>"` with `data-deliverable-state` per directory) and
gains **"Move deliverables to media|local"** (`data-action="deliver-move"`, `data-move-to`), the
@@ -703,6 +705,21 @@ manifests, `revisions/`, the caches and the cue cache stay put; final mp4s trave
`[Unreleased]` (`editor/CHANGELOG.md`): "umtool can move a report's cut clips and share batches to
the media drive, one project at a time."
+#### Review (SHIP AFTER FIXES) and the fixes
+
+| Finding | Fix |
+|---|---|
+| H1 (HIGH) — the busy scan counted a pipeline script only when an argument was the absolute project path, but the app runs `cut-from-cache.mjs` and `share-batch.mjs` as `--project <id>`: a shell-run move did not see the app's cuts and batches, the two writers it exists to wait for; the docs, FACTS, this record and the CLI comment claimed it did | `3ff84ad5`: the scan moves to `lib/report/busy.mjs` (imported by the CLI only) and also counts a script whose `--project` value equals the project's id or name, or resolves against the process's cwd to the project directory — whole values, never a prefix; `move-out`/`move-back` get it too. Tests: `namesProject`'s cases, a dummy process carrying `cut-from-cache.mjs --project <id>` is seen and `<id>-other` is not, the CLI refuses as `busy` with its pid and moves once only `<id>-other` runs. The claim is corrected in the CLI comments, `docs/folders.md`, `docs/cli.md`, FACTS and the "What it does" bullet above: what it sees, and that a hand-run command that is none of these scripts, and another machine, are not seen |
+| N1 — a link under an absent key (absent means local) was not flagged, only under an explicit `"local"` | `3ff84ad5`: a `clips`/`share-*` link into the media root under no key is `storage-mismatch` too (a hand-made link elsewhere under no key is not); a unit case runs `umtool check` on no key, `local`, `media` |
+| N2 — the route's 409 for a move while a job runs was asserted nowhere | `f52f1eb1`: `deliverables.spec`'s cut test posts a `move` during the cut and expects 409 "a job is already running" |
+| L1 — the decisions inbox and the deliver panel stat through every `out`/`clips`/`share-*` link, so a stalled media drive blocks them (U1's class) | left, a follow-up (below) |
+
+**Gates after the fixes:** umtool tsc clean. `deliverables.test.mjs` **18/18** (+4), `storage.test.mjs`
+24/24. umtool e2e at `f52f1eb1`, `deliverables` + `storage`: **10 passed**, 0 failed, 1.2 min of tests (10 min with the queue).
+
+**Follow-up (L1):** with a stalled (not absent) media drive, the inbox's decisions pass and the deliver
+panel block on the stat through each link, as U1's project summary does for `out`.
+
### Slice XP, as shipped — X posts are private (2026-10-01)
Branch `r17/x-posts-private` off `main` `90bd8384`, worktree `~/Projects/r13-lows-export` (editor 5501,