docs: rehearsal runbook: switch moves off only after the move has closed
C-6 and Run 5's switch-off now first confirm the move is closed (no move in flight, claim serving). An unfinished move keeps the switch on while the operator resolves it with carlos move resolve under Paul's scoped go, because with the switch off the moves pass skips Phase 1 records (movespass.go:797-805) and the move would stop being reconciled.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 file changed,
+31
−10
docs/superpowers/plans/2026-10-06-moves-phase1-rehearsal.md+31 −10
diff --git a/docs/superpowers/plans/2026-10-06-moves-phase1-rehearsal.md b/docs/superpowers/plans/2026-10-06-moves-phase1-rehearsal.md| index 089ee4906..87806b515 100644 |
| --- a/docs/superpowers/plans/2026-10-06-moves-phase1-rehearsal.md |
| +++ b/docs/superpowers/plans/2026-10-06-moves-phase1-rehearsal.md |
| @@ -779,8 +779,17 @@ applies); Paul's explicit go in the thread, for each of the three. |
| and Run 3 shape `____` (created in `us`), all before the flagship's |
| claim went on. |
| - [ ] Each of the three as on dev, with every check. |
| -- [ ] After the third, remove `CARLOS_MOVES_PHASE1` from the two boxes and |
| - the console unless Paul says to keep it, and restart them. Check: |
| +- [ ] After the third, and only once **all three moves are closed**: for |
| + each of the three hosts, [detail] `state` is `none` (no move in flight) |
| + and `detail.claim.kind` is `serving`. If any move is unfinished (stuck, |
| + a release past its deadline, relocating, or any exit 4), leave the |
| + switch on and resolve it first with `carlos move resolve` (`--retry` |
| + once the cause is fixed, or `--declare-lost <box>` for a lost target), |
| + each with Paul's scoped go in the thread. The switch must stay on until the move is closed: with it off, a box's |
| + moves pass skips every Phase 1 record, so an unfinished move would stop |
| + being reconciled and stay where it is. |
| +- [ ] Then remove `CARLOS_MOVES_PHASE1` from the two boxes and the |
| + console unless Paul says to keep it, and restart them. Check: |
| `carlos move status --app moveprobe --account <ops> --host <host>` says |
| "Moves are not enabled on this console.", and neither box's `host.env` |
| still sets it. |
| @@ -845,14 +854,24 @@ approves for the run. |
| If the move rolls back (M-C8 then M-C9, exit 3), the instance is back in |
| `<from>`: run C-4 there, then R-5b and R-6, and stop the series. C-6 |
| -still applies. |
| - |
| -- **C-6 Switch off.** Once the run's checks are recorded, whatever its |
| - outcome: remove `CARLOS_MOVES_PHASE1` from the console and the two |
| - boxes, unless Paul says in the thread to keep it, and restart them. |
| - Check: `carlos move status --app <app> --account <account> --host |
| - <host>` says "Moves are not enabled on this console.", and [box] neither |
| - box's `host.env` sets it. |
| +still applies, once the rollback has closed. |
| + |
| +- **C-6 Switch off, once the move is closed.** First confirm the move is |
| + closed: [detail] `state` is `none` (no move in flight) and |
| + `detail.claim.kind` is `serving`. If it is not (stuck, a release past |
| + its deadline, relocating, or any exit 4), leave the switch on and |
| + resolve the move first with `carlos move resolve --app <app> --account |
| + <account> --host <host>` (`--retry` once the cause is fixed, or |
| + `--declare-lost <box>` for a lost target), with Paul's scoped go in the |
| + thread, then check again. The switch must stay on until the move is closed: with it off, a box's |
| + moves pass skips every Phase 1 record, so an unfinished move would stop |
| + being reconciled and stay where it is. |
| + Once it is closed, and after the run's checks are recorded: remove |
| + `CARLOS_MOVES_PHASE1` from the console and the two boxes, unless Paul |
| + says in the thread to keep it, and restart them. Check: `carlos move |
| + status --app <app> --account <account> --host <host>` says "Moves are |
| + not enabled on this console.", and [box] neither box's `host.env` sets |
| + it. |
| ### Run 6: a disposable customer-shaped instance |
| @@ -1012,6 +1031,8 @@ copy is `docs/superpowers/plans/2026-10-06-moves-phase1-copy.md`. |
| | the switch, `on`/`1`/`true`, default off | `internal/moves/switch.go:6-23` | |
| | the copy record's `pending` rows keep the compiled default off; P-7 applies the same rule to the env switch (Paul's ruling) | `approved_moves_copy_test.go:811`; `docs/superpowers/plans/2026-10-06-moves-phase1-copy.md` | |
| | with the switch off the CLI says "Moves are not enabled on this console." (the switch-off check in Run 5 and C-6) | `move.go:65`, `:240-243` | |
| +| with the switch off a box's moves pass skips every Phase 1 record, so the switch goes off only after the move closes | `internal/host/movespass.go:797-805` | |
| +| `carlos move resolve --retry` and `--declare-lost <box>` | `move.go:159-163`, `:258-262` | |
| | the copy gate keeps the default off while a row is pending | `approved_moves_copy_test.go:811` | |
| | the default cut window, 120 s | `internal/moves/budget.go:17` | |
| | `CARLOS_LAYOUT_DEFAULT=flat` | `internal/host/layoutleg.go:68-70`; `system.go:714` | |