| index ba8067f97..19458f100 100644 |
| --- a/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md |
| +++ b/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md |
| @@ -26,9 +26,9 @@ Columns: id, file, text, status. |
| | M-C11 | move.go | <host> could not start in <to> or in <from>. It is offline. Run carlos move resolve --host <host> --retry once the cause is fixed. | pending | |
| | M-C12 | move.go | Ready to cut. Run carlos move cut --host <host> when you are ready. | pending | |
| | M-C13 | internal/console/apiinstancemove.go | This move has started its cut. It will finish or move back on its own. | pending | |
| -| M-C14 | internal/host/movespass.go | <host> keeps a file this move cannot copy: <path>. Only regular files and folders move. | pending | |
| -| M-C15 | internal/host/movespass.go | <host> keeps more than 256 MiB of files beside its database. Keep large files in object storage. | pending | |
| -| M-C16 | internal/host/movesreport.go | <host> does not answer its readiness path. Declare moves.ready_path for this app. | pending | |
| +| M-C14 | internal/host/movesphase1.go | <host> keeps a file this move cannot copy: <path>. Only regular files and folders move. | approved | |
| +| M-C15 | internal/host/movesphase1.go | <host> keeps more than 256 MiB of files beside its database. Keep large files in object storage. | approved | |
| +| M-C16 | internal/host/movesphase1.go | <host> does not answer its readiness path. Declare moves.ready_path for this app. | approved | |
| | M-C17 | internal/console/apiinstancemove.go | <host> uses private storage. Instances with private storage cannot move yet. | approved | |
| | M-C18 | move.go | This declares <box> lost. Anything <host> wrote on <box> after <time> is lost. Type the host name to confirm. | pending | |
| | M-C19 | internal/console/apiinstances.go | <host> is being moved. Delete it after the move finishes, or abort the move first. | pending | |
| @@ -51,10 +51,10 @@ Columns: id, file, text, status. |
| | MV-N9 | internal/host/movesreport.go | the staging lane holds another move's move.json | approved | |
| | MV-N10 | internal/host/systemapply.go | moves protocol floor: <version> is below <min_release> | approved | |
| | MV-N11 | internal/console/apiinstancemove.go | declare-lost is not enabled in this deployment yet | pending | |
| -| MV-N12 | internal/provision/provision.go | no journaled move in flight | pending | |
| -| MV-N13 | internal/provision/provision.go | the record's move is <id> for incarnation <incarnation> | pending | |
| -| MV-N14 | internal/provision/provision.go | malformed move start | pending | |
| -| MV-N15 | internal/provision/provision.go | past the point of no return. the cut completes forward or moves back on its own | pending | |
| +| MV-N12 | internal/provision/provision.go | no journaled move in flight | approved | |
| +| MV-N13 | internal/provision/provision.go | the record's move is <id> for incarnation <incarnation> | approved | |
| +| MV-N14 | internal/provision/provision.go | malformed move start | approved | |
| +| MV-N15 | internal/provision/provision.go | past the point of no return. the cut completes forward or moves back on its own | approved | |
| | MV-N16 | internal/console/apiinstancemove.go | the instance is already in <region> | approved | |
| | MV-N17 | internal/console/apiinstancemove.go | could not read the app's instances manifest. try again | approved | |
| | MV-N18 | internal/console/apiinstancemove.go | could not read this instance's storage binding. try again | approved | |
| @@ -79,26 +79,26 @@ Columns: id, file, text, status. |
| | MV-N37 | internal/console/apiinstancemove.go | this console is below the moves protocol floor. roll the console first | approved | |
| | MV-N38 | internal/console/apiinstancemove.go | the move changed since this request read it. read its state and try again | approved | |
| | MV-N39 | internal/console/apiinstancemove.go | past the point of no return. the cut completes forward | approved | |
| -| MV-N40 | internal/provision/provision.go | cut is only legal from ready | pending | |
| -| MV-N41 | internal/provision/provision.go | already aborting | pending | |
| -| MV-N42 | internal/provision/provision.go | a move in state "<state>" cannot be aborted | pending | |
| -| MV-N43 | internal/provision/provision.go | a move to <to> is already <state> | pending | |
| -| MV-N44 | internal/provision/provision.go | a <role> does not move. delete it and create one in the new region | pending | |
| -| MV-N45 | internal/provision/provision.go | no move in flight | pending | |
| +| MV-N40 | internal/provision/provision.go | cut is only legal from ready | approved | |
| +| MV-N41 | internal/provision/provision.go | already aborting | approved | |
| +| MV-N42 | internal/provision/provision.go | a move in state "<state>" cannot be aborted | approved | |
| +| MV-N43 | internal/provision/provision.go | a move to <to> is already <state> | approved | |
| +| MV-N44 | internal/provision/provision.go | a <role> does not move. delete it and create one in the new region | approved | |
| +| MV-N45 | internal/provision/provision.go | no move in flight | approved | |
| | MV-N46 | internal/console/apiinstancemove.go | this move's state does not allow that. read its state and try again | approved | |
| | MV-N47 | internal/console/apiinstancemove.go | only exec-backed instances move. this route is kind <kind> | approved | |
| | MV-N48 | internal/console/apiinstancemove.go | an addr-backed route's process is not platform-managed. there is nothing to move | approved | |
| | MV-N49 | internal/console/apiinstancemove.go | fleet-placed instances keep state-does-not-follow semantics. moves are for platform regions | approved | |
| | MV-N50 | internal/console/apiinstancemove.go | pooled instances do not move yet. their data lives on the pool's own box | approved | |
| | MV-N51 | internal/console/apiinstancemove.go | a non-hibernating instance runs outside the activator. nothing manages its data, so nothing can move it | approved | |
| -| MV-N52 | internal/console/apiinstancemove.go | too many instance requests. wait a minute and try again | pending | |
| +| MV-N52 | internal/console/apiinstancemove.go | too many instance requests. wait a minute and try again | approved | |
| | MV-N53 | internal/console/apiinstancemove.go | this console has no deployment bucket, so it cannot answer this | approved | |
| | MV-N54 | internal/console/apiinstancemove.go | account "<segment>" is ambiguous. pass --account-id with one of: <sqid> ("<name>"), ... | pending | |
| | MV-N55 | internal/moves/readiness.go | the last round moved <bytes> bytes and the bar is <bytes> | approved | |
| | MV-N56 | internal/moves/readiness.go | the target has not published a readiness report yet | approved | |
| | MV-N57 | internal/moves/readiness.go | the target's readiness report is stale | approved | |
| | MV-N58 | internal/moves/readiness.go | <check> was not reported | approved | |
| -| MV-N59 | internal/moves/readiness.go | <check>: did not pass | pending | |
| +| MV-N59 | internal/moves/readiness.go | <check>: did not pass | approved | |
| | MV-N60 | internal/moves/readiness.go | T11: the cut budget admits no probe attempt | approved | |
| | MV-N61 | internal/moves/readiness.go | T11: the cut budget was priced for a final round of <MiB> MiB and the bar is <MiB> MiB | approved | |
| | MV-N62 | internal/moves/readiness.go | the source has not published a readiness report yet | approved | |
| @@ -111,27 +111,27 @@ Columns: id, file, text, status. |
| | MV-N69 | internal/moves/readiness.go | the database size could not be measured | approved | |
| | MV-N70 | internal/moves/readiness.go | the cut window is not a usable number of seconds | approved | |
| | MV-N71 | internal/moves/readiness.go | the cut needs about <seconds> seconds with one probe attempt and the window is <seconds> seconds | approved | |
| -| MV-N72 | internal/host/movesreport.go | nested instances cannot move yet | pending | |
| +| MV-N72 | internal/host/movesphase1.go | nested instances cannot move yet | approved | |
| | MV-N73 | internal/host/movesreport.go | the source has published no archive yet | approved | |
| | MV-N74 | internal/host/movesreport.go | the host claim has not touched <region> yet | approved | |
| | MV-N75 | internal/host/movesreport.go | waiting for the root stage pass | approved | |
| | MV-N76 | internal/host/movesreport.go | the source has not reported its release yet | approved | |
| -| MV-N77 | internal/moves/archive/archive.go | archive: only regular files and directories move: <path> | pending | |
| +| MV-N77 | internal/moves/archive/archive.go | archive: only regular files and directories move: <path> | approved | |
| | MV-N78 | internal/moves/archive/archive.go | archive: the files directory is over 256 MiB | approved | |
| -| MV-N79 | internal/moves/archive/archive.go | archive: the files directory holds more than 131072 entries | pending | |
| -| MV-N80 | internal/moves/archive/archive.go | archive: a file changed while it was being archived: <path> | pending | |
| -| MV-N81 | internal/moves/archive/archive.go | archive: refused path: <path> is longer than 4096 bytes | pending | |
| +| MV-N79 | internal/host/movesphase1.go | archive: the files directory holds more than 131072 entries | approved | |
| +| MV-N80 | internal/moves/archive/archive.go | archive: a file changed while it was being archived: <path> | approved | |
| +| MV-N81 | internal/host/movesphase1.go | archive: refused path: <path> is longer than 4096 bytes | approved | |
| | MV-N82 | internal/moves/readiness.go | T11: the target's report carries a rate that is not a usable number | approved | |
| | MV-N83 | internal/moves/readiness.go | T11: the target's report claims <n> probe attempts and its measurements admit <n> | approved | |
| | MV-N84 | internal/moves/readiness.go | the target's readiness report is dated ahead of this clock | approved | |
| | MV-N85 | internal/moves/readiness.go | the source's readiness report is dated ahead of this clock | approved | |
| -| MV-N86 | internal/moves/archive/archive.go | archive: only regular files and directories move: <path> is a hard link | pending | |
| +| MV-N86 | internal/moves/archive/archive.go | archive: only regular files and directories move: <path> is a hard link | approved | |
| | MV-N87 | internal/host/systemapply.go | moves protocol floor: carlos.prev records no version, so it is below <min_release> | approved | |
| | MV-N88 | internal/host/systemapply.go | moves protocol floor: the floor on this box cannot be read: <error> | approved | |
| | MV-N89 | internal/host/systemapply.go | a participant in a held operation does not downgrade: <version> is below the running <release> | approved | |
| | MV-N90 | internal/host/systemapply.go | a participant in a held operation does not downgrade, and the registry cannot say whether this box is one: <error> | approved | |
| | MV-N91 | internal/host/systemapply.go | a participant in a held operation does not downgrade, and the running release is unknown | approved | |
| -| MV-N92 | internal/host/systemapply.go | moves protocol floor: could not write it on this box: <error> | pending | |
| +| MV-N92 | internal/host/systemapply.go | moves protocol floor: could not write it on this box: <error> | approved | |
| | MV-N93 | internal/host/systemapply.go | <refusal>; the root passes paused for the install could not be started again: <error>. the next apply or recovery starts them | approved | |
| | MV-N94 | internal/host/systemapply.go | <refusal>; the root passes paused for the install could not be started again: <error>, and the retry could not be recorded: <error>. the journal stays for the next recovery | approved | |
| | MV-N95 | internal/host/systemapply.go | <refusal>; the root passes paused for the restore could not be started again: <error> | approved | |
| @@ -144,8 +144,8 @@ Columns: id, file, text, status. |
| | MV-N102 | internal/release/materializeheld.go | release: held rows are not staged while CARLOS_HOST_CLAIM is on | approved | |
| | MV-N103 | internal/appconfig/renderheld.go | config: not a held row of this move | approved | |
| | MV-N104 | internal/appconfig/renderheld.go | config: held rows are not rendered while CARLOS_HOST_CLAIM is on | approved | |
| -| MV-N105 | internal/host/systemapply.go | moves protocol floor: another writer holds the floor lock on this box; this waits for the next run | pending | |
| -| MV-N106 | internal/host/systemapply.go | <error>; the root passes paused for the restore could not be started again: <error>, and the retry could not be recorded: <error> | pending | |
| +| MV-N105 | internal/host/systemapply.go | moves protocol floor: another writer holds the floor lock on this box; this waits for the next run | approved | |
| +| MV-N106 | internal/host/systemapply.go | <error>; the root passes paused for the restore could not be started again: <error>, and the retry could not be recorded: <error> | approved | |
| | MV-N107 | internal/host/systemapply.go | <error>; the journal stays: <error> | approved | |
| | MV-N108 | internal/activator/backend_exec.go | S2: the agent is not placed in its delegated cgroup subtree, so it cannot spawn strictly | approved | |
| | MV-N109 | internal/activator/backend_exec.go | S2: this host's last strict group has not been cleaned up yet | approved | |
| @@ -273,6 +273,21 @@ Columns: id, file, text, status. |
| |
| Paul approved the wording of all 205 rows then pending (M-C1 to M-C22 and MV-N1 to MV-N183), with no edits. 160 are marked approved above: their code already speaks the approved text. |
| |
| -The other 45 stay `pending` here only because the copy gate requires an approved row's text to appear in its file. Their wording is approved and final. Each flips to approved, verbatim, in the commit that makes its file speak it: the CLI and paging strings when Plans 5 and 6 build them, and the drifted ones when their code is brought back to the approved text. The 45 rows are: M-C1, M-C10, M-C11, M-C12, M-C13, M-C14, M-C15, M-C16, M-C18, M-C19, M-C2, M-C20, M-C22, M-C3, M-C4, M-C5, M-C6, M-C7, M-C8, M-C9, MV-N105, MV-N106, MV-N11, MV-N12, MV-N129, MV-N13, MV-N14, MV-N146, MV-N15, MV-N40, MV-N41, MV-N42, MV-N43, MV-N44, MV-N45, MV-N52, MV-N54, MV-N59, MV-N72, MV-N77, MV-N79, MV-N80, MV-N81, MV-N86, MV-N92. |
| +The other 45 were `pending` only because the copy gate requires an approved row's text to appear in its file. Their wording is approved and final. 24 are now `approved`: their code was brought back to the approved text (18 rows: MV-N12, MV-N13, MV-N14, MV-N15, MV-N40 to MV-N45, MV-N52, MV-N59, MV-N77, MV-N80, MV-N86, MV-N92, MV-N105, MV-N106), or the row's File cell was corrected to the file that says it (6 rows, now `internal/host/movesphase1.go`: M-C14, M-C15, M-C16, MV-N72, MV-N79, MV-N81). |
| + |
| +21 stay `pending`. Each flips to approved, verbatim, in the commit that makes its file speak it. |
| + |
| +Not built yet (18): |
| + |
| +- 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. |
| +- M-C20 (`internal/host/movespaging.go`): the paging sentence is Plan 5, and no `movespaging.go` exists. |
| +- MV-N11 (`internal/console/apiinstancemove.go`): the declare-lost door is Plan 4 Task 10. `resolve` answers "nothing to resolve yet" to anything but a retry. |
| + |
| +Built, but the gate cannot read the row (3), so the row stays pending until Paul rules on how it is gated: |
| + |
| +- MV-N54: the row ends in a list template, `<sqid> ("<name>"), ...`. The code builds that list at run time (`apicli.go`) and joins it into the sentence, so the sentence is never one literal ending in `, ...`. Making it so would print a literal `...`. |
| +- MV-N129: the same, `<NAME (kind)>, ...`; `t3Differs` in `internal/host/movesreport.go` joins the names it found. |
| +- MV-N146: the row's text carries a note, `(MV-N68 with a new <which>)`. The code says `no fresh rate measurement for the disk's per-file sync` through MV-N68's `NoFreshRate`, which is correct; the note is not a part of any sentence the code could say. |
| |
| Rows added after this review (MV-N184 onward, MV-N300 onward) still need review. |