copy record for the moves series completed (§20)
Plan 6 Task 7's audit of the moves copy record: - the header names the right gate file (approved_moves_copy_test.go), says D13 (pending strings may be wired while the default is off) rather than "may not be wired", counts M-C1 to M-C22, and states the Text and File cell rules the gate holds; - the Plan 6 section's spliced paragraph is rewritten as one line per task, with the unused ids (MV-N382 to N384, N391 to N399) and the withdrawn MV-N388 named; - the 2026-10-09 review's "not built yet" list is marked approved since; - MV-N317 and MV-N363 carry notes: their files speak them, but not as one expression, so the gate cannot pass them as approved until the code or a ruling changes. The inventory and the record agree both ways; every Plan 6 id (MV-N350 to N381, N385 to N390 bar the withdrawn N388) has a row. No wording changed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 file changed,
+24
−6
docs/superpowers/plans/2026-10-06-moves-phase1-copy.md+24 −6
diff --git a/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md b/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md| index 5f0aabc70..d63981c21 100644 |
| --- a/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md |
| +++ b/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md |
| @@ -1,10 +1,18 @@ |
| # Moves Phase 1: copy record (pending Paul's review) |
| Every operator-facing string the Phase 1 plans introduce, with the id the |
| -copy gate (`approved_copy_test.go`, Plan 6 Task 7) checks. Rows are |
| -`pending` until Paul approves them; a `pending` string may not be wired to |
| -a user-facing call site. Spec §20 ids (M-C1 to M-C20) keep their text as |
| -drafted there until the review changes it. No em dashes anywhere. |
| +copy gate (`approved_moves_copy_test.go`, Plan 1 Task 15, completed by Plan |
| +6 Task 7) checks. Rows are `pending` until Paul approves them. A `pending` |
| +string may be wired while `moves.DefaultEnabled` is false (D13), and the |
| +gate keeps the default off while any row is pending. Spec §20 ids (M-C1 to |
| +M-C22) keep their text as drafted there until the review changes it. No em |
| +dashes anywhere. |
| + |
| +The Text cell is the sentence and nothing else. A note goes in the File |
| +cell, in parentheses after the path. A row whose text ends in |
| +`<element>, ...` is a list the code builds at run time; the gate's notation |
| +for it, and for `%q`, is in the Review of 2026-10-09 below (Paul, |
| +2026-10-10). |
| Each plan's Task "Gate and copy" appends its rows under its heading. |
| Columns: id, file, text, status. |
| @@ -310,9 +318,19 @@ The anomaly page (Task 9a's quiet refusals, `internal/host/movesrefusals.go`): a |
| | MV-N317 | internal/host/movesfloorgate.go | <path> is not a regular file with one link, at most 256 bytes, owned by an expected account | pending | |
| | MV-N318 | internal/host/movesfloorgate.go | floor-allows-prev takes two absolute paths: the floor file and the verdict file | pending | |
| +Plan 6 Task 7's audit: MV-N317 is said in two parts. `movesfloorgate.go` holds the text after `<path>` (`errFloorGateUnsafe`), and `movesfloorgate_linux.go` puts the path in front of it (`"%s %w"`). No one expression says the whole row, so the gate cannot pass it as approved as the code stands. Approving it needs either the code to say it in one expression, or a ruling on how the gate reads a sentence put together from a path and a sentinel error. |
| + |
| ## Plan 6 |
| -(completed by Plan 6 Task 7. Task 2 takes MV-N319 to MV-N324, and made the abort door speak M-C13 on a console without the host claim, so M-C13 is now approved verbatim. Task 2b made the delete door speak M-C19 through moveDeleteRefusal in internal/console/apiinstancemove.go, so its File cell moves there (preflight L6) and it is approved verbatim. Task 1a takes MV-N350 to MV-N371 and Task 1b MV-N372 to MV-N379, Task 3 MV-N380 (the member line for stuck, preflight L9) and MV-N381 (the name a member line gives the home region, which a box knows only as the record's empty region; Task 3 fix round 1, ruling 4). Task 3 fix round 1 (ruling 6, preflight L12) moved M-C1 and M-C5 to M-C9 into shared templates in internal/moves/operatorcopy.go, which both move.go and the member stream (internal/host/movesevents.go) call, so their File cells, and MV-N380's, name that file; their text is unchanged (Plan 5 owns MV-N325 to MV-N349) for `carlos move` (move.go, and its usage line in main.go), and speaks M-C1 to M-C12 and M-C22 verbatim from move.go, so those rows are approved. Task 1b speaks M-C18 verbatim from move.go and MV-N11 from the resolve door of a console without the host claim, so both are approved. Task 4 adds no sentence: the detail answer's timings reuse MV-N319 when their read fails. Task 5 takes MV-N385 to MV-N390, the box's pages (internal/host/movespaging.go, preflight L8), and speaks M-C20 verbatim from movespaging.go when the cut's stop evidence finds a stray process, so M-C20 is approved. Its fix round 1 (ruling 1) keeps M-C20 to operators, as the stray page's body and the agent's log line, never the app's members, so MV-N388, the body it replaced, is withdrawn) |
| +Completed by Plan 6 Task 7. |
| + |
| +- Task 2 took MV-N319 to MV-N324 and used MV-N319. It made the abort door speak M-C13 on a console without the host claim, so M-C13 is approved verbatim. Task 2b made the delete door speak M-C19 through moveDeleteRefusal in internal/console/apiinstancemove.go, so its File cell moved there (preflight L6) and it is approved verbatim. |
| +- Task 1a took MV-N350 to MV-N371 for `carlos move` (move.go, and its usage line in main.go, MV-N363). It speaks M-C1 to M-C12 and M-C22 verbatim, so those rows are approved. Task 1b took MV-N372 to MV-N379; it speaks M-C18 verbatim from move.go and MV-N11 from the resolve door of a console without the host claim, so both are approved. |
| +- Task 3 took MV-N380 (the member line for stuck, preflight L9) and MV-N381 (the name a member line gives the home region, which a box knows only as the record's empty region; fix round 1, ruling 4). Its fix round 1 (ruling 6, preflight L12) moved M-C1 and M-C5 to M-C9 into shared templates in internal/moves/operatorcopy.go, which both move.go and the member stream (internal/host/movesevents.go) call, so their File cells, and MV-N380's, name that file. Their text is unchanged. |
| +- Task 4 adds no sentence: the detail answer's timings reuse MV-N319 when their read fails. |
| +- Task 5 took MV-N385 to MV-N390, the box's pages (internal/host/movespaging.go, preflight L8), and speaks M-C20 verbatim from movespaging.go when the cut's stop evidence finds a stray process, so M-C20 is approved. Its fix round 1 (ruling 1) keeps M-C20 to operators, as the stray page's body and the agent's log line, never the app's members, so MV-N388, the body it replaced, is withdrawn. |
| +- MV-N382 to MV-N384 and MV-N391 to MV-N399 were never used. Plan 5 owns MV-N325 to MV-N349. |
| +- Task 7's audit: MV-N363 is the `move` line of the usage in main.go, which wraps it over two lines after `abort |`. The gate matches an approved row inside one literal, so the line break stops it passing as approved as the code stands. Approving it needs the usage line unwrapped, or a ruling on how the gate reads the usage's wrapped lines. |
| | id | file | text | status | |
| |---|---|---|---| |
| @@ -363,7 +381,7 @@ The other 45 were `pending` only because the copy gate requires an approved row' |
| 21 stay `pending`. Each flips to approved, verbatim, in the commit that makes its file speak it. |
| -Not built yet (18): |
| +Not built yet (18), all approved since: Plan 6 built every one and flipped it verbatim (Tasks 1a, 1b, 2, 2b and 5): |
| - M-C1 to M-C12, M-C18 and M-C22 (14 rows, `move.go`): the `carlos move` CLI is Plan 6, and no `move.go` exists. |
| - M-C13 and M-C19 (`internal/console/apiinstancemove.go`, `internal/console/apiinstances.go`): the abort refusal after the cut started and the delete door's refusal during a move. Plan 5 Task 8 lists both as Plan 6 copy; no code says either. |