carlos / platform Public

copy gate: the self-serve job's rows MV-O217 to MV-O236; the job's console files join movesScanFiles

Task 7's sentences, approved by Paul 2026-10-22 with the plan's copy
list; MV-O229 (the staged book's mismatch, quoted in the plan's Task 6)
is pending.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 48b4bf0f16b15a4b17a8dfb6a3d880720cd99ce7 parent 31f3c61
2 files changed, +30 −0
  • approved_moves_copy_test.go +5 −0
  • docs/superpowers/plans/2026-10-06-moves-phase1-copy.md +25 −0
diff --git a/approved_moves_copy_test.go b/approved_moves_copy_test.go
index e68911264..2740ffd65 100644
--- a/approved_moves_copy_test.go
+++ b/approved_moves_copy_test.go
@@ -109,6 +109,7 @@ var movesCopyIDs = []string{
"MV-O179", "MV-O180", "MV-O181", "MV-O182", "MV-O183", "MV-O184", "MV-O185", "MV-O186", "MV-O187", "MV-O188", "MV-O189",
"MV-O190", "MV-O191", "MV-O192", "MV-O193", "MV-O194", "MV-O195", "MV-O196", "MV-O197",
"MV-O198", "MV-O199", "MV-O200", "MV-O201", "MV-O202", "MV-O203", "MV-O204", "MV-O205", "MV-O206", "MV-O207", "MV-O208", "MV-O209", "MV-O210", "MV-O211", "MV-O212", "MV-O213", "MV-O214", "MV-O215", "MV-O216",
+ "MV-O217", "MV-O218", "MV-O219", "MV-O220", "MV-O221", "MV-O222", "MV-O223", "MV-O224", "MV-O225", "MV-O226", "MV-O227", "MV-O228", "MV-O229", "MV-O230", "MV-O231", "MV-O232", "MV-O233", "MV-O234", "MV-O235", "MV-O236",
}
// copyRow is one row of the record. The File cell is the file the sentence is
@@ -1209,6 +1210,10 @@ var movesScanFiles = []string{
"internal/console/selfserve_door.go",
"internal/console/selfserve_view.go",
"internal/console/selfserve_estimate.go",
+ "internal/console/selfserve_apply.go",
+ "internal/console/selfserve_checks.go",
+ "internal/console/selfserve_job.go",
+ "internal/console/testhooks.go",
"internal/console/claim_runtime.go",
"internal/alerting/alerting.go",
"internal/hostops/move_log_writer.go",
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 9dd493aa7..d6a244abd 100644
--- a/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md
+++ b/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md
@@ -746,3 +746,28 @@ The self-serve move doors' sentences (self-serve moves plan 2 Task 5; `internal/
| MV-O214 | internal/console/selfserve_door.go (self-serve moves plan 2 Task 5, approved by Paul 2026-10-22) | no move is in flight | approved |
| MV-O215 | internal/console/selfserve_door.go (self-serve moves plan 2 Task 5, approved by Paul 2026-10-22; MarkSelfServeCut's committed-expiry answer, quoted in the plan's Task 4 and ruled for Task 5) | the move expired. prepare again | approved |
| MV-O216 | internal/console/selfserve_door.go (self-serve moves plan 2 Task 5, approved by Paul 2026-10-22; provision.MoveRunOpenError's sentence, the run family's existing 409, written out for the self-serve door) | a run is open on this instance: <id>. wait for it to finish or cancel it, then move the instance | approved |
+
+The self-serve job's sentences (self-serve moves plan 2 Task 7; `internal/console/selfserve_checks.go`), approved by Paul 2026-10-22 with the plan's Task 7 copy list. They are the reasons a self-serve move's row carries (the view's `reason`, and `last.reason` once it ends): MV-O217 to MV-O228 are the boxes' facts the job refuses before anything is copied or taken offline (`<fact>` is the fact's name: the route, the timers, the live link, the programs file, a data path, the park directory, the staging prefix, the instances prefix, the lock, the archive, the stray entries, the staging lane, the source's facts, the target's facts or the staged copy; `<label>` the box's edges label; `<build>` what the live link or the programs file names; `<owner>` the lock's keys; `<detail>` the archive's own reason). MV-O229 is the staged book's mismatch, quoted in the plan's Task 6, which the 2026-10-22 approval does not list: pending. MV-O230 to MV-O236 are the outcomes and the reserving reason. The job also speaks MV-O209 (a lane that fails), MV-O211 (a cancellation's outcome), MV-O195 and the start validation's refusals, all recorded already.
+
+| id | file | text | status |
+|---|---|---|---|
+| MV-O217 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | could not determine <fact> on <label> | approved |
+| MV-O218 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the target box already has a route for <host> | approved |
+| MV-O219 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the target box has timers for <host> | approved |
+| MV-O220 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the target box has a stale live link for <host> naming <build> | approved |
+| MV-O221 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the target box's programs file names <build> | approved |
+| MV-O222 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the target box already holds data for <host>: <path> | approved |
+| MV-O223 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the target box's park directory is not clean | approved |
+| MV-O224 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the target box has too little free disk for <host> | approved |
+| MV-O225 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the target bucket already holds objects for <host> | approved |
+| MV-O226 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the target bucket holds a lock for <host> (<owner>) | approved |
+| MV-O227 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | <host> has a stray entry beside its files directory: <path> | approved |
+| MV-O228 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | <host>'s files cannot be archived: <detail> | approved |
+| MV-O229 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7; quoted in the plan's Task 6, outside the 2026-10-22 approval) | the staging prefix for <host> does not match what this move staged | pending |
+| MV-O230 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | box <label> was replaced | approved |
+| MV-O231 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the move was not started in time | approved |
+| MV-O232 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the move was not confirmed in time | approved |
+| MV-O233 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the move could not be started | approved |
+| MV-O234 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | another move is in flight | approved |
+| MV-O235 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | the instance was recreated | approved |
+| MV-O236 | internal/console/selfserve_checks.go (self-serve moves plan 2 Task 7, approved by Paul 2026-10-22) | waiting for another move on this box | approved |