carlos / platform Public

spec: moves into home (part 2), §2, §7.1, §16 F2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 3f726cd6ab7d4bcb030334565363d9971b0c67de parent af17d34
1 file changed, +24 −7
  • docs/superpowers/specs/2026-10-02-move-any-app-design.md +24 −7
diff --git a/docs/superpowers/specs/2026-10-02-move-any-app-design.md b/docs/superpowers/specs/2026-10-02-move-any-app-design.md
index 60c7f61c8..02f610aa4 100644
--- a/docs/superpowers/specs/2026-10-02-move-any-app-design.md
+++ b/docs/superpowers/specs/2026-10-02-move-any-app-design.md
@@ -1,8 +1,22 @@
# Move any app or instance to another region: Phase 1, a safe single-instance move
**Date:** 2026-10-06
-**Revision:** 7.23.
-
+**Revision:** 7.24.
+
+- **Rev 7.24** lets a move target the home region (moves into home,
+ part 2; plan `docs/superpowers/plans/2026-10-15-moves-home-region-part2.md`,
+ amadan #236). Phase 1 moves between two non-fleet placements, into home
+ only with host claims on (§2). §7.1 refuses a target of home on a
+ console without host claims, or a home whose box sets a region code of
+ its own. §16 F2 records home as a target as delivered by that plan.
+ Paul's rulings of 2026-10-15, decided: **R1**, home targets only under
+ host claims; **R3**, `--to` takes the home's configured name, with no
+ `home` keyword, and `carlos move back` stays a follow-on; **R5**, no
+ protocol version bump (a home box without the new T3 fails T3 and waits,
+ fail closed; boxes roll before consoles); **R7**, a home target may be
+ the console's own box (the records and the claim are durable, so a box
+ lost mid-landing delays recovery and loses nothing). R2(a) and R6 bind
+ the rehearsal runbook, not this spec.
- **Rev 7.23** records Paul's ruling M4 (2026-10-10, moves Plan 5 delta
pre-flight after claim Plan 10): **every close is record first, then
the claim's release.** Rev 7.22 released the claim to `serving` first
@@ -1066,8 +1080,8 @@ key from it.
## 2. Phase 1: what it does and what it refuses
Phase 1 moves **one** exec-backed, hibernating `kind:"instance"` record
-between two non-home, non-fleet placements or out of home, driven by an
-operator. It carries every piece of per-host state, proves the target can
+between two non-fleet placements, into home only with host claims on
+(Ruling R1, rev 7.24), driven by an operator. It carries every piece of per-host state, proves the target can
run it before the source stops, starts it on the target with no public
traffic, and opens only after a commit. If the target cannot start it, the
instance returns to the source automatically, carrying anything the target
@@ -2426,8 +2440,11 @@ is refused (400 or 409, with the sentence), and every box step re-checks:
non-hibernating (`internal/console/apiinstancemove.go:53-72`);
- a replica (`:187-190`, `provision.go:978-980`), or a home with replicas
(new);
-- a target of home (`apiinstancemove.go:203-209`; F2), the current region,
- or one outside the manifest's `regions` (`apiinstances.go:1797`);
+- a target of home on a console without host claims, or a home whose box
+ sets a region code of its own (`apiinstancemove.go:203-209`; F2, rev
+ 7.24, Ruling R1), the current region, or one outside the manifest's
+ `regions` (`apiinstances.go:1797`). A home target is named by the
+ home's configured name; there is no `home` keyword (Ruling R3);
- a source `<host>-sidecar.env`, or any refused registry column (§6.2);
- a private store bound to the instance's environment (codex 12; F4);
- the claim not `serving`, or any box in either region below the protocol
@@ -6336,7 +6353,7 @@ No design here, only what each must satisfy.
| spec | scope | must meet |
|---|---|---|
| **F1 Owner surface** | owner self-serve; person auto-cut (M6); holding route for custom domains | owners only (M13); move-capable service authority explicitly owner-delegated, including the legacy mint path (`apiinstances.go:1554`), with a stated treatment of existing member-minted tokens (codex 11); Tito's router credentials (M18) |
-| **F2 Moves into home** | `CARLOS_HOME_PLACEMENT`, home as a target, `carlos move back` | §5's handoff unchanged |
+| **F2 Moves into home** | Home as a target is **delivered** by `docs/superpowers/plans/2026-10-15-moves-home-region-part2.md` (rev 7.24, #236). `CARLOS_HOME_PLACEMENT` is superseded by Plan 13's signed fleet home designation, which names home once for every reader; no environment variable is added. `carlos move back` stays a follow-on (Ruling R3) | §5's handoff unchanged |
| **F3 Residency cleanup** | delete `superseded/<op id>/`, `move-snapshots/`, `.parked/superseded-*`, receipts after the hold (M7) | no deletion of a live location or its ancestor, selection excluded atomically through the claim (codex 8); the complete residue inventory including noncurrent versions and delete markers (`infra/modules/deployment-buckets/main.tf:27-30`) with scoped version-delete authority and verified removal (codex 9); a warrant binding the exact scope from an immutable console ledger (codex 10) |
| **F4 Stores** | private and app stores (M3, M9) | a joint instance and store transaction with binding versions and compensation (codex 12); store record transitions with config (`internal/objstore/walk.go:427`, `:448`), lifecycle operations serialized against the move (codex 17) |
| **F5 App moves** | sequencer, pause (M8), sidecar refusal (M10) | durable child move ids before dispatch; an app and store cut barrier covering every consumer and concurrent create (codex 18) |