carlos / platform Public

docs: instance moves — brief for Astra's ruling recommendations

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 5ca13db9d3c9e9d5c73064b753334412bfab7f7b parent 8067fc5
1 file changed, +101 −0
  • docs/superpowers/specs/CODEX-RULINGS-BRIEF-INSTANCE-MOVES.md +101 −0

CI passed — run details

diff --git a/docs/superpowers/specs/CODEX-RULINGS-BRIEF-INSTANCE-MOVES.md b/docs/superpowers/specs/CODEX-RULINGS-BRIEF-INSTANCE-MOVES.md
new file mode 100644
index 000000000..a547001f3
--- /dev/null
+++ b/docs/superpowers/specs/CODEX-RULINGS-BRIEF-INSTANCE-MOVES.md
@@ -0,0 +1,101 @@
+# Brief: recommend rulings for the instance-moves design
+
+You are advising Paul, who owns the CARLOS platform, on the decisions the
+design record `docs/superpowers/specs/2026-09-24-instance-moves-for-every-app-design.md`
+needs before its slices P1–P9 are planned. Read the whole record first. Its
+predecessor, `2026-08-28-instance-move-design.md` (#331, shipped), is
+background: its never-two-writers cut ordering is settled and not up for
+review.
+
+You are not reviewing the record for defects this time. You are giving a
+recommendation on each decision, grounded in the code, that Paul can accept
+or override one at a time.
+
+## State of play
+
+- The record is a DRAFT filed as amadan discussion carlos/platform #175.
+ Tito Go is the first adopter; its half is in `teamtito/titogo` (not in
+ this checkout, so reason from what the record quotes of it).
+- **P0 is merged on `main` (408db5e, 2026-09-25), not rolled.** It added: the
+ cut installs the activator's maintenance fence (`FenceAndStop`) before
+ trusting `Quiesced`, lifted by a new `LiftFence` once the box no longer
+ holds the route or the record is at rest here; `ServeScheduled` refuses a
+ managed route whose status is not ready; the moves pass is serialised;
+ `MoveAbort` allowlists `preparing`/`ready`; a replica record cannot be
+ moved. This worktree is on the docs branch and may not contain P0; read
+ it with `git show origin/main:<path>` if you need it.
+- First customer path: elatromme → us needs P0, P7, P9, P6, P1, P2, P3.
+- Paul's standing rules that bound every answer (AGENTS.md): every `carlos`
+ command must complete its job for a user with no box or AWS access; the
+ platform is for general use, so a capability an app needs is built into
+ the platform rather than worked around in one tenant; production
+ infrastructure changes need scoped approval.
+
+## The decisions
+
+Thirteen, in two groups. Use these ids.
+
+**Proposed rulings (record §3).** For each: accept, accept with a change,
+or reject.
+
+- **R1** The platform owns the freeze (hooks declared; no hook = today's
+ #331 behaviour; the freeze buys grace, not correctness).
+- **R2** Hooks ride the tick's trust path: `ServeHook` over the instance
+ socket with the instance admin token.
+- **R3** Stores follow only when declared, and only platform-provisioned
+ stores.
+- **R4** Rollback after the cut is a move back, never an automatic undo, so
+ moves to and from home must work (P3, `CARLOS_HOME_PLACEMENT`).
+- **R5** An app's own router stops routing by location and uses a box-local
+ edge door (P7).
+
+**Open questions (record §14).** For each: pick an option (the record's or
+your own).
+
+- **Q1** Freeze budget vs measured cut time: accept an app unfreezing while
+ its process is already stopped, or refuse to cut when the measured cut
+ time exceeds the declared budget?
+- **Q2** Replicas on a move of a home: carry placements unchanged, refuse
+ while replicas exist, or re-point?
+- **Q3** The edge door's identity: per-app unix group, or the app's scoped
+ key? Consider the isolated layout's uid model
+ (`2026-09-11-isolated-exec-design.md`) and G18 (every enrolled process).
+- **Q4** Control-plane residency: data moves, the record/bundle/secrets/log
+ stay in the home region's bucket. State that as the promise, or regional
+ copies of the config bundle?
+- **Q5** Self-serve before #171 (a region box's IAM role can write any
+ account's records): operator-only move doors for other accounts until
+ #171 is fixed?
+- **Q6** Store copies: a short-lived move-scoped IAM user that can read one
+ tenant store, or a hook the app runs with its own store credential?
+- **Q7** Route ownership for direct-mode `carlos add` (G17): explicit
+ `--account`, inherit the app's account, or refuse when the host's app
+ belongs to another account?
+- **Q8** Adoption downtime: a scheduled per-account stop window, or a
+ replicate-then-cut adoption shape?
+
+## What to produce
+
+Write markdown to the output file. For each of the thirteen, in this shape:
+
+```
+### <id>: <one-line question>
+**Recommendation:** <the choice, one sentence>
+**Why:** <3–6 sentences. Cite code as path:line where the argument rests on
+it, and check every citation against this checkout (or origin/main).>
+**If wrong:** <what breaks, and how hard it is to reverse later>
+**Blocks:** <which slices cannot be planned until this is ruled>
+**Confidence:** high / medium / low
+```
+
+Then three short closing sections:
+
+1. **Order to rule them in**, favouring what unblocks the elatromme path.
+2. **Decisions the record is missing**: anything Paul must rule that is not
+ in the thirteen. At most five, each with a recommendation in the same
+ shape.
+3. **Where you disagree with the record's own proposal**, one line each.
+
+Be direct. Where two options are close, say so and say which way you lean.
+Do not re-open #331's cut ordering or anything P0 settled. Keep the whole
+answer under about 2,500 words.