carlos / platform Public

docs: instance moves — P0 waits for P7 where an app router dials sockets itself

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paul Campbell pushed by claude agent, operated by paul@keymail.dev 02907379d1276eb21fcd645fbbb24190d48e1c12 parent 2ce74f0
1 file changed, +16 −6
  • docs/superpowers/specs/2026-09-24-instance-moves-for-every-app-design.md +16 −6
diff --git a/docs/superpowers/specs/2026-09-24-instance-moves-for-every-app-design.md b/docs/superpowers/specs/2026-09-24-instance-moves-for-every-app-design.md
index 589b1233b..10c5b419d 100644
--- a/docs/superpowers/specs/2026-09-24-instance-moves-for-every-app-design.md
+++ b/docs/superpowers/specs/2026-09-24-instance-moves-for-every-app-design.md
@@ -565,7 +565,7 @@ mirror) as early as it can safely be.
| slice | what | depends on | unblocks |
|---|---|---|---|
-| **P0** | Run `carlos system layout migrate` on carlos-tito-ie (operator act, built) and fix G12 with a test | nothing new | P6, and any adoption |
+| **P0** | Run `carlos system layout migrate` on carlos-tito-ie (operator act, built) and fix G12 with a test | **P7 first on any deployment whose app router dials instance sockets itself** (below) | P6, and any adoption |
| **P1** | `ServeHook`, the manifest `moves.hooks` declaration, `freezing` state, freeze/thaw calls with the tick's token; hook-path refusal at the edge | P0 for G12 | row 1's failure mode, for every app |
| **P2** | Holding route: `moving` edges role, 503 instead of 404 | — | a cut nobody sees as an error |
| **P3** | Home region publishes a staging lane; moves to and from home | infra: add `ie` to each sibling's `sibling_staging_arns` | rollback |
@@ -575,11 +575,21 @@ mirror) as early as it can safely be.
| **P7** | Edge-local door for app routers | P0 (isolated layout is why the sockets stop being reachable) | apps with their own router, Tito's root domain |
| **P8** | Per-placement store backend; private store and prefix stores follow | P4, P5 | uploads residency |
-**For elatromme → us, the minimum is P0, P6, P1, P3, and P7 or its polling
-alternative** (§8), plus Tito's own slices in the linked record. P2 is small,
-and a customer's first move should not show buyers a 404, so it belongs in
-that set too. P8 is the only way uploads move, and whether the first move
-waits for it is a product call (§14).
+**P0 has an ordering trap on Tito's box.** Tito's router does not read an
+instance's socket from the platform. It guesses `/run/carlos/<host>.sock`
+(titogo `internal/carlos/fleet_http.go:934`, `signup_http.go:660`), and
+the isolated layout moves the socket to `/run/carlos/instances/<iid>/app.sock`
+(isolated-exec design §3.1). Migrating the layout first would cut Tito's
+root domain off from every platform instance on the box. So on carlos-tito-ie
+the order is P7, then Tito's router switches to the door, then P0. Any other
+app that dials instance sockets by a path it computed has the same trap,
+which is one more argument for P7.
+
+**For elatromme → us, the minimum is P7, P0, P6, P1, P3 and P2** (P7 or its
+polling alternative, §8), plus Tito's own slices in the linked record. P2
+is on that list because a customer's first move should not show buyers a
+404. P8 is the only way uploads move, and whether the first move waits for
+it is a product call for Tito, not a platform one.
## 14. Open questions