carlos / platform Public

docs: rehearsal runbook final fixes (approval gates, probe regions, customer switch, run order, evidence)

- I1: a "Paul's scoped go" step sits before each deployment change: the
  floor publish (P-3), the switch (P-7, after the copy record is fully
  approved), and Run 4's box stop.
- I4: <pr-R>, the region moveprobe reports (home on a box with no
  CARLOS_REGION, else its placement code), is defined and used in R-1,
  R-3, R-7, the failure switch, and Runs 2 to 5; R-8's obligation region
  is the source box's CARLOS_REGION.
- I5: customer runs get C-0 (copy approved, scoped go, switch on the
  console and the run's two participant boxes, verified) and C-6 (switch
  off, verified); Run 5's cleanup is verified too.
- I6: Run 4 needs Runs 1 to 3; Runs 2 and 3 use the out-of-home
  arrangement when home fix part 2 has not landed.
- Minor: Runs 6 and 7 attach the owner-approved health check's answers,
  not [report].
Sources rows added for each new fact.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 356cf0592c53f19f671e970104c9eee7af2775a0 parent b214944
1 file changed, +152 −51
  • docs/superpowers/plans/2026-10-06-moves-phase1-rehearsal.md +152 −51
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 bd43d8a5b..089ee4906 100644
--- a/docs/superpowers/plans/2026-10-06-moves-phase1-rehearsal.md
+++ b/docs/superpowers/plans/2026-10-06-moves-phase1-rehearsal.md
@@ -7,7 +7,11 @@ instance, and one on a real customer instance.
**No run in this runbook can execute today.** Every run waits for P-0
below. Each run also has its own blockers, listed at its top. Never run one
-without Paul's go in the amadan thread.
+without Paul's go in the amadan thread. Steps that change a deployment
+(publishing the floor, switching moves on, stopping a box) each have their
+own **Paul's scoped go** step just before them: a go in the amadan thread
+that names the deployment and exactly what the step changes. A go for one
+step or one run does not cover another.
The probe app is `moveprobe`. How to build it, ship it and use it is in
[`cmd/moveprobe/README.md`](../../../cmd/moveprobe/README.md). This runbook
@@ -34,6 +38,19 @@ The Sources section at the end gives file and line for each.
| `<profile>` | the deployment's named AWS profile. Always name one. There are no default credentials. |
| `<move>` | the move id the console gave the request (`id` in the flat view) |
| `<inc>` | the instance incarnation (`detail.move.incarnation`) |
+| `<pr-R>` | the region moveprobe reports on region R's box: `home` if that box has no `CARLOS_REGION` (its edges file has no `placement`), else its `CARLOS_REGION`, the placement code. `<pr-from>` and `<pr-to>` are the run's two. |
+
+### The probe's region is not always the region's name
+
+moveprobe reports the region its box gives it, not the name the CLI and
+the console use. On a home box, which has no `CARLOS_REGION`, it reports
+`home`, while `carlos move` still says `ie` (or whatever
+`CONSOLE_HOME_REGION` is). Before each deployment's first run, write down
+`<pr-R>` for every rehearsal region: read `CARLOS_REGION` in the box's
+`/etc/carlos/host.env`, or `placement` in its edges file, and confirm with
+[report]'s `region` and `region_from` on any moveprobe host there. Every
+[report] region check and every `MOVEPROBE_FAIL_READY_IN` value uses
+`<pr-R>`, never the CLI's name.
### Read paths
@@ -243,6 +260,9 @@ lowers its local floor on its own. If dev keeps rolling SHA builds, dev's
runs go without a floor, and P-3 is done on the flagship only, before
Run 5 (§15 step 6).
+- [ ] **Paul's scoped go** in the amadan thread to publish the floor on
+ this deployment, naming the deployment and `min_release`. Nothing below
+ runs without it.
- [ ] Write it create-only from an operator shell. No `carlos` command
writes it (a gap to note on an amadan discussion).
@@ -330,8 +350,15 @@ Paul confirms each of these per deployment before its first run.
### P-7 The switch
-- [ ] Only after P-0 to P-6: `CARLOS_MOVES_PHASE1=on` in the environment
- of the console and of each box in play, then restart them.
+- [ ] P-0 to P-6 are done for this deployment.
+- [ ] **The moves copy record is fully approved**: no row in
+ `docs/superpowers/plans/2026-10-06-moves-phase1-copy.md` is `pending`
+ (`grep -c '| pending |'` on it prints 0). The switch never goes on
+ while a sentence an operator could read is unapproved.
+- [ ] **Paul's scoped go** in the amadan thread to switch moves on, naming
+ the deployment, the console and the boxes.
+- [ ] `CARLOS_MOVES_PHASE1=on` in the environment of the console and of
+ the boxes the go names, and nowhere else, then restart them.
- [ ] Check: `carlos move status --app moveprobe --account <ops> --host
<host>` does not say "Moves are not enabled on this console."
@@ -399,16 +426,16 @@ Runs refer to these by number. `<from>` and `<to>` are the run's regions.
### Checks after a commit
-- **R-1 State arrived.** [report] on the target: `region` is `<to>`;
+- **R-1 State arrived.** [report] on the target: `region` is `<pr-to>`;
`file_key_sha256` and `platform_key_sha256` equal `before-cut.json`'s;
- `object` has no `error` and its `body` names this boot and `<to>`;
+ `object` has no `error` and its `body` names this boot and `<pr-to>`;
`has_secret` is `true`. `curl https://<host>/ready` answers `ready`.
- **R-2 No row lost.** [report] for `bg` and for `worker`: the sum of
`count` over all regions is at least `before-cut.json`'s, and equals the
highest `max_seq` (rows are numbered from 1 in one sequence per kind, so
any gap shows here).
- **R-3 The schedule continues.** [report] `rows` has `kind: tick` with
- `region: <to>`, and its `count` rises about once a minute for three
+ `region: <pr-to>`, and its `count` rises about once a minute for three
minutes after the open. Every `fired` entry has `count: 1`. A minute
that fell due while the instance was offline fires at most once after
the open, and minutes in between are not replayed, so a short gap
@@ -433,8 +460,9 @@ Runs refer to these by number. `<from>` and `<to>` are the run's regions.
### Checks after a rollback (Runs 2, 3 and 4)
-R-1 to R-4 and R-6 apply as written, with `<from>` (the source, where the
-instance is back) in place of `<to>`. R-5 is replaced:
+R-1 to R-4 and R-6 apply as written, with the source (where the
+instance is back) in place of the target: `<pr-from>` in place of
+`<pr-to>` in R-1 and R-3. R-5 is replaced:
- **R-5b The target holds nothing live.** After [deploy]
`log/rolling_back-target-cleaned.json` and `log/rolled_back.json` exist:
@@ -442,8 +470,9 @@ instance is back) in place of `<to>`. R-5 is replaced:
`instances/<host>/` and under `moves/<host>/<move>/` returns no versions
and no delete markers.
- **R-7 The target's writes came back** (dirty rollbacks only). [report]
- on the source: `rows` has a `bg` row with `region: <to>`, written on the
- target while it ran there.
+ on the source: `rows` has a `bg` row with `region: <pr-to>` (the
+ target's probe region, `home` if the target is the home box), written
+ on the target while it ran there.
- **R-8 The return lane is parked** (dirty rollbacks only). A dirty
rollback returns the target's writes through its own lane,
`moves/<host>/<rb>/` in the **source's** data bucket, where `<rb>` is
@@ -460,7 +489,8 @@ instance is back) in place of `<to>`. R-5 is replaced:
jq -s --arg loc "moves/<host>/<rb>" '[.[][] | select(.park.location == $loc)] | first' run-3-claim.jsonl
```
- It has `kind` `park-replica`, `region` `<from>`, an `id`, a
+ It has `kind` `park-replica`, `region` set to the source box's
+ `CARLOS_REGION` (absent when the source is the home box), an `id`, a
`retirement`, and `park` with `location`, `incarnation`, `evidence_at`
and `request_limit_ns`. Record `retirement` as `<ret>`,
`park.incarnation` as `<pinc>` and `park.evidence_at`. An empty answer
@@ -493,8 +523,11 @@ reached the stopped position). The target box logs both:
`CARLOS_AWS_ACCOUNT` on the dev console.
- [ ] Keep `carlos-dev-ie-b` ineligible: no `CARLOS_REGION_HA` in its
`host.env`, so `ie` has one eligible box (M-C21).
-- [ ] Create the dev rehearsal hosts (P-5) after `carlos-dev-uk` serves and
- before dev's claim goes on.
+- [ ] Decide Runs 2 and 3's arrangement (see "Runs 2 and 3: the
+ regions"), then create the dev rehearsal hosts (P-5) after
+ `carlos-dev-uk` serves and before dev's claim goes on: Run 1's and Run
+ 4's in `ie`, Runs 2 and 3's in their arrangement's `<from>`, and two
+ spares.
**Dev's home region.** Dev Ireland is probably the home region (its box
has no `CARLOS_REGION`). Confirm it with the dev console's
@@ -506,13 +539,20 @@ has no `CARLOS_REGION`). Confirm it with the dev console's
- Runs 2 and 3 as written (`uk` to `ie`) move into home and need **home
fix part 2**. The door refuses them until then.
- **Until part 2 lands, only out-of-home moves run.** Run 1 goes ahead on
- part 1. Runs 2 and 3 wait. If Paul wants them sooner, they can run out
- of home (`ie` to `uk`, with the failure switch on `uk`), which rolls back
- into a home source, as Run 4 does. Use that order, and run Run 4, only
- if part 1's own tests show it covers a rollback whose source is home.
- Part 1 is not built yet, so this is open.
-- On the home box, moveprobe sees its region as `home`, not `ie`. Any
- `MOVEPROBE_FAIL_READY_IN` aimed at that box names `home`.
+ part 1. Runs 2 and 3 then use the **out-of-home arrangement**: the host
+ is created in `ie`, the move goes `ie` to `uk`, and the failure switch
+ names `<pr-uk>`. Each rolls back into a home source, as Run 4 does, so
+ this needs part 1 to cover a rollback whose source is home. Check that
+ in part 1's own tests first. Part 1 is not built yet, so this is open.
+ If part 1 does not cover it, Runs 2, 3 and 4 all wait for the fix that
+ does.
+- Run 4 runs only after Runs 2 and 3 have passed, in whichever
+ arrangement they ran. No run is skipped.
+- On the home box, moveprobe reports `home`, so `<pr-ie>` is `home`. Any
+ [report] check or `MOVEPROBE_FAIL_READY_IN` aimed at that box uses
+ `home`, never `ie`.
+
+Record the dev probe regions here: `<pr-ie>` = `____`, `<pr-uk>` = `____`.
If `ie` is not home, the runs go as written and need no home fix.
@@ -533,27 +573,44 @@ to P-7 on dev; Paul's go.
`last.outcome` is `done`; `detail.timings` holds `offline_s` and
`cut_budget_s`.
+### Runs 2 and 3: the regions
+
+Runs 2 and 3 use one of two arrangements, chosen before the dev hosts are
+created (see "Dev's home region"):
+
+- **As written**: the host is created in `uk`, and the move goes `uk` to
+ `ie`. Needs home fix part 2 if `ie` is home.
+- **Out of home** (`ie` is home and part 2 has not landed): the host is
+ created in `ie`, and the move goes `ie` to `uk`. Needs part 1 to cover a
+ rollback whose source is home.
+
+Below, `<from>` and `<to>` are the arrangement's regions as the CLI names
+them, and `<pr-from>`, `<pr-to>` their probe regions. Record the
+arrangement used in each run.
+
### Run 2: dev, forced clean rollback
-**Blockers:** P-0; home fix **part 2** if `ie` is home (see above); Run 1
+**Blockers:** P-0; the home fix its arrangement needs (above); Run 1
passed; Paul's go.
The target fails its readiness check in before-write mode, so it writes
nothing and the rollback should be clean.
-- [ ] Host used: `____` (created in `uk` before the claim).
-- [ ] Before the request, set the switch for the target's region (`ie`, or
- `home` if `ie` is home):
+- [ ] Arrangement: `____`. Host used: `____` (created in `<from>` before
+ the claim).
+- [ ] Before the request, set the failure switch to the target's probe
+ region:
```sh
- carlos env set --app moveprobe --account <ops> MOVEPROBE_FAIL_READY_IN=ie
+ carlos env set --app moveprobe --account <ops> MOVEPROBE_FAIL_READY_IN=<pr-to>
```
The variable is app-wide. Any moveprobe instance that starts in that
region while it is set answers 503 and writes nothing. That is expected.
-- [ ] S-1, S-2 with `--to ie`, S-3, S-4 (capture first). [CLI] M-C8 ("ie
- could not start <host>: <reason>. Moving it back to uk."), then M-C9
- ("<host> is back in uk and serving. Nothing was lost."), exit 3.
+- [ ] S-1, S-2 with `--to <to>`, S-3, S-4 (capture first). [CLI] M-C8
+ ("<to> could not start <host>: <reason>. Moving it back to <from>."),
+ then M-C9 ("<host> is back in <from> and serving. Nothing was lost."),
+ exit 3.
- [ ] From [capture], once the cut has returned and the capture has
stopped: the last rollback journal has `target_phase` `released` or
later, and `dirty` absent or `false`. Record its `id` as `<rb>`, and the
@@ -561,8 +618,9 @@ nothing and the rollback should be clean.
- [ ] Digests: [deploy] `stopped-target.json`'s `db_sha256`, `files_plain`
and `timers_sha256` equal `log/rolling_back-target-released.json`'s
fields `installed_db_sha256`, `files_plain` and `timers_sha256`.
-- [ ] [box] on the `ie` box: "clean true, src_covered true".
-- [ ] R-1 to R-4 and R-6 on `uk`, R-5b on `ie`.
+- [ ] [box] on the `<to>` box: "clean true, src_covered true".
+- [ ] R-1 to R-4 and R-6 on `<from>` (probe region `<pr-from>`), R-5b on
+ `<to>`.
- [ ] [deploy] `log/` has `rolling_back`, `rolling_back-target-released`,
`rolling_back-target-cleaned`, `rolling_back-source-opened` and
`rolled_back`, and no `rolling_back-target-returning`.
@@ -577,20 +635,21 @@ finding, not a probe failure. Stop the series and report it.
### Run 3: dev, forced dirty rollback
-**Blockers:** P-0; home fix **part 2** if `ie` is home; Run 2 passed;
+**Blockers:** P-0; the home fix its arrangement needs; Run 2 passed;
Paul's go.
The target writes one row, starts its worker, and then fails readiness, so
the rollback is dirty and the target's writes must come back.
-- [ ] Host used: `____` (created in `uk` before the claim).
+- [ ] Arrangement: `____`. Host used: `____` (created in `<from>` before
+ the claim).
- [ ] Before the request:
```sh
- carlos env set --app moveprobe --account <ops> MOVEPROBE_FAIL_READY_IN=ie,after-write
+ carlos env set --app moveprobe --account <ops> MOVEPROBE_FAIL_READY_IN=<pr-to>,after-write
```
-- [ ] S-1, S-2 with `--to ie`, S-3, S-4, with the capture started with
+- [ ] S-1, S-2 with `--to <to>`, S-3, S-4, with the capture started with
its claim file: `capture <host> run-3-detail.jsonl run-3-claim.jsonl`.
[CLI] M-C8, then M-C9, exit 3. The cut's wait includes the return
lane's park horizon (R-8), about 17 minutes or more.
@@ -600,20 +659,22 @@ the rollback is dirty and the target's writes must come back.
- [ ] Digests: [deploy] `stopped-target.json`'s `db_sha256` differs from
`log/rolling_back-target-released.json`'s `installed_db_sha256` (the
target wrote).
-- [ ] [box] on the `ie` box: "clean false".
+- [ ] [box] on the `<to>` box: "clean false".
- [ ] [deploy] `log/` has `rolling_back-target-returning` and
`rolling_back-target-returned`, then `rolling_back-target-cleaned` and
`rolled_back`.
-- [ ] R-1 to R-4 and R-6 on `uk`, R-5b on `ie`, R-7, and R-8 on `uk`
- (the return lane `moves/<host>/<rb>/` in `<data-bucket-uk>`).
+- [ ] R-1 to R-4 and R-6 on `<from>` (probe region `<pr-from>`), R-5b on
+ `<to>`, R-7 (a `bg` row with `region: <pr-to>`), and R-8 on `<from>`
+ (the return lane `moves/<host>/<rb>/` in `<data-bucket-from>`).
- [ ] Unset `MOVEPROBE_FAIL_READY_IN` once the checks are recorded.
### Run 4: dev, declare-lost
**Blockers:** P-0, including claim Plan 12's loss-bound admission and Plan
-4 Task 10's box half; home fix part 1 if `ie` is home; Run 1 passed (Runs 2
-and 3 too, if part 2 has landed); Paul's go, and his agreement to take
-`carlos-dev-uk` out of service for the run.
+4 Task 10's box half; home fix part 1 if `ie` is home, covering a
+rollback whose source is home; **Runs 1, 2 and 3 passed** (Runs 2 and 3
+in whichever arrangement they ran; Run 4 is never run ahead of them);
+Paul's go.
The target box is stopped mid-move and declared lost. With only two dev
regions, the target is `carlos-dev-uk`, and `uk` has no eligible box until
@@ -621,11 +682,14 @@ the readmit at the end. **Stop the box. Do not terminate it.** A terminated
box cannot be readmitted.
- [ ] Host used: `____` (created in `ie` before the claim).
+- [ ] **Paul's scoped go** in the amadan thread, before anything below,
+ to stop `carlos-dev-uk` during this run and take it out of service
+ until the readmit.
- [ ] So the landing cannot commit before the box stops, set the failure
switch on the target first:
```sh
- carlos env set --app moveprobe --account <ops> MOVEPROBE_FAIL_READY_IN=uk
+ carlos env set --app moveprobe --account <ops> MOVEPROBE_FAIL_READY_IN=<pr-uk>
```
Its probe then fails however long the stop takes. If the target finishes
@@ -659,7 +723,8 @@ box cannot be readmitted.
`log/rolled_back.json` exist. [deploy] the decoded roster:
`boxes.carlos-dev-uk.state` is `quarantined`, `quarantine_revision` is
one more than before, and `loss_ids` holds the loss.
-- [ ] R-1 to R-4 and R-6 on `ie`.
+- [ ] R-1 to R-4 and R-6 on `ie`, with probe region `<pr-ie>` (`home` if
+ `ie` is home).
- [ ] Unset `MOVEPROBE_FAIL_READY_IN`.
- [ ] Start `carlos-dev-uk` again. It stays quarantined: the deployment's
admission gate refuses it for every host until the readmit. Watch [box]
@@ -703,14 +768,22 @@ applies); Paul's explicit go in the thread, for each of the three.
- **Regions** (N3): the flagship's home is Ireland, so Run 5 uses two
non-home regions, `uk` and `us`, until the home fix parts land. Run 1's
shape goes `uk` to `us`. Runs 2 and 3 go `us` to `uk`, with
- `MOVEPROBE_FAIL_READY_IN=uk` and `uk,after-write`.
+ `MOVEPROBE_FAIL_READY_IN=<pr-uk>` and `<pr-uk>,after-write`. Record the
+ flagship's probe regions: `<pr-uk>` = `____`, `<pr-us>` = `____`.
+- [ ] P-3 on the flagship, after its own scoped go.
+- [ ] P-7 on the flagship: the copy record fully approved, then Paul's
+ scoped go naming the console and the `uk` and `us` boxes, then the
+ switch on those three only.
- [ ] Hosts used: Run 1 shape `____` (created in `uk`), Run 2 shape `____`
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.
+ 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.
---
@@ -730,6 +803,18 @@ approves for the run.
### Customer steps
+- **C-0 Switch on for this run only.** Run 5's switch was removed after
+ it, and this run's participants differ (the source is the home box).
+ - The moves copy record is fully approved (P-7).
+ - **Paul's scoped go** in the amadan thread naming the flagship, this
+ run, the console, and this run's two participant boxes: the source
+ box in `<from>` (the instance's box now) and the target box in
+ `<to>`.
+ - `CARLOS_MOVES_PHASE1=on` in the environment of the console and of
+ those two boxes, and nowhere else; restart them.
+ - Check: `carlos move status --app <app> --account <account> --host
+ <host>` does not say "Moves are not enabled on this console." [box]
+ each of the two boxes' `host.env` sets it, and no other box's does.
- **C-1 Health check, before.** The owner names one health check for the
instance (a URL and the answer that means it is serving) and approves
it for the run. Record it in the deployment repo. Run it and record the
@@ -759,7 +844,15 @@ approves for the run.
`committed-source_parked` and `done`.
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.
+`<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.
### Run 6: a disposable customer-shaped instance
@@ -773,7 +866,7 @@ A disposable instance of a customer app with the same shape as moveprobe
owner's agreement, before the flagship's claim went on (P-5).
- [ ] Instance used: recorded in the deployment repo.
-- [ ] C-1 to C-5.
+- [ ] C-0 to C-6.
### Run 7: the first production customer instance
@@ -785,7 +878,8 @@ with its owner.
- [ ] The instance was created before the flagship's claim went on, so it
is adopted at `instances/<host>` (P-5). One created later cannot move.
-- [ ] C-1 to C-5, with C-3 inside the agreed window. The cut window is the
+- [ ] C-0 to C-6, with C-3 inside the agreed window. Run 6's switch was
+ removed at its C-6, so C-0 needs its own go. The cut window is the
default 120 s.
- [ ] Report `offline_s` back to the owner: [detail] `last.offline_s`, or
`offline_s` in `log/done.json`'s fields.
@@ -795,8 +889,10 @@ with its owner.
## After every run
- [ ] Attach to the amadan thread: the `done` or `rolled_back` log entry
- (its timings), the [report] files from before and after, the bucket
- listings, and the host used.
+ (its timings), the bucket listings, and the host used. For Runs 1 to 5,
+ also the [report] files from before and after. For Runs 6 and 7, which
+ never call `/report`, attach instead the owner-approved health check's
+ answers from C-1 and C-4, and the owner's confirmation.
- [ ] A failed check stops the series. Fix its cause and repeat the run on
a fresh host before going on.
@@ -867,6 +963,7 @@ copy is `docs/superpowers/plans/2026-10-06-moves-phase1-copy.md`.
| the rollback's `id` | `internal/provision/provision.go:1068` |
| a dirty rollback's return lane is `moves/<host>/<rb>`, parked in the source's region, queued when the source has probed, horizon the return seal's bound | `internal/moves/parkscope.go:66-72`; `internal/host/movesrecover.go:658-675`; `internal/hostclaim/move.go:1093-1108` |
| a claim obligation's fields: `id`, `op`, `kind`, `region`, `retirement`, and `park` with `location`, `incarnation`, `evidence_at`, `request_limit_ns`; the claim's `obligations` list | `internal/hostclaim/claim.go:116-121`, `:137-147`, `:166` |
+| the return lane's obligation `region` is the source box's `CARLOS_REGION` (omitted when empty) | `internal/host/movesrecover.go:675`; `internal/host/movespass.go:206`; `internal/hostclaim/claim.go:144` |
| the claim at `control/hosts/<host>.json` is plain JSON, read as is | `internal/hostclaim/claim.go:178-182`; `internal/hostclaim/store.go:38-60` |
| the detail answer's claim view carries no obligations | `internal/console/apiinstancemove.go:1356-1362` |
| a rollback closes only when nothing is owed under its move; a finished park removes its obligation | `internal/host/movesrecover.go:805-809`; `internal/host/movesparks.go:134-142`; `internal/park/remote.go:568`; `internal/hostclaim/delete.go:83-98` |
@@ -913,6 +1010,8 @@ copy is `docs/superpowers/plans/2026-10-06-moves-phase1-copy.md`.
| `moves_protocol`, `moves_floor_min_release`, `prev_release`, `prev_allowed_for`, `data_bucket`, `secrets_key_fp` in the edges file at `control/edges/<box>.json` | `internal/host/edgesfile.go:218`, `:270`, `:295-304`; `internal/console/instancesplacement.go:22`, `:83-86` |
| `control/moves-console.json` and its `secrets_key_fp` | `internal/moves/floor.go:25-33` |
| 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` |
| 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` |
@@ -933,7 +1032,9 @@ copy is `docs/superpowers/plans/2026-10-06-moves-phase1-copy.md`.
|---|---|
| a held timer row is skipped while the instance moves | `internal/schedule/runner.go:190-197` |
| a periodic schedule's next fire is the next boundary after now (no replay) | `internal/schedule/spec.go:119-125` |
-| moveprobe's region is `home` with no `CARLOS_REGION` | `cmd/moveprobe/main.go:94-100` |
+| moveprobe's region is `home` with no `CARLOS_REGION`, else `CARLOS_REGION`; `/report` says which in `region_from` | `cmd/moveprobe/main.go:94-100` |
+| the failure switch matches the probe's own region, so it must name `<pr-R>` | `cmd/moveprobe/main.go:103-106`, `:137-138` |
+| a box's edges `placement` is its `CARLOS_REGION`, absent when unset (the home box) | `internal/host/edgesfile.go:205-211`, `:758` |
| `bg` and `worker` rows each numbered from 1 in one sequence | `cmd/moveprobe/main.go:543-550`, `:158`, `:674` |
| `/report`'s fields, `/arm-once`'s answer, the failure switch's modes | `cmd/moveprobe/README.md`, "Use it", "Make readiness fail on purpose" and "Strings" |
@@ -959,5 +1060,5 @@ copy is `docs/superpowers/plans/2026-10-06-moves-phase1-copy.md`.
|---|---|
| the runs and the pass rule | spec §14.4, spec:6263-6276 |
| the rollout order, the floor before any protected production rehearsal | spec §15, spec:6278-6294 |
-| each rehearsal gates the next, so Run 5 needs Run 4 | spec:6294; controller ruling, fix round 1 |
+| each rehearsal gates the next: Run 4 needs Runs 2 and 3, Run 5 needs Run 4 | spec:6294; controller rulings, fix round 1 and final review |
| the flagship's home is Ireland | spec:1032 |