carlos / platform Public

docs: nearest-region spec rev 4.1, Paul's split ruled as R8

Placement ships on this spec; latency routing (R6) is sequenced to its
own follow-on spec, built to the section 13 invariants. The section 18
question is removed, the rollout states that no placement step depends
on Phase L, and section 13 notes the #169 arming hazard was posted to
amadan carlos/platform #169 on 2026-10-01.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 4ad64f7c88fbf469a8d470daba216d8011a84d59 parent 826da7a
1 file changed, +17 −15
  • docs/superpowers/specs/2026-10-01-nearest-region-default-design.md +17 −15
diff --git a/docs/superpowers/specs/2026-10-01-nearest-region-default-design.md b/docs/superpowers/specs/2026-10-01-nearest-region-default-design.md
index c29e1ed06..bc6b813e3 100644
--- a/docs/superpowers/specs/2026-10-01-nearest-region-default-design.md
+++ b/docs/superpowers/specs/2026-10-01-nearest-region-default-design.md
@@ -1,7 +1,7 @@
# Nearest region by default: each app picks its region at creation
**Date:** 2026-10-01
-**Revision:** 4.
+**Revision:** 4.1.
- Rev 1 (7fbc9479) went to Astra (GPT-6, via codex), and the findings are in
`CODEX-FINDINGS-NEAREST-REGION-R1.md`.
@@ -16,6 +16,7 @@
- **Rev 4 moves latency routing (R6) into a follow-on spec**, because the
existing steering converger is not safe to arm (§13). That spec gets
invariants to meet, and placement ships first.
+- Rev 4.1 records Paul's ruling on that split as R8 and removes the question.
**Status:** DRAFT for review. The rulings in §3 are Paul's and are not
reopened here. Everything marked *(decision)* is this spec's and open to
@@ -134,6 +135,7 @@ Non-goals, each with a follow-up in §20:
| R5 | **Done = new apps only, plus moves.** Existing apps keep their region. Relieving Ireland comes from instance moves. An owner-only verb to change an existing app's region is out of scope (a follow-up). | §2, §20 |
| R6 | **Latency routing is in scope** for non-home instances, not placement alone. | §13: its invariants and gates, delivered by the follow-on spec |
| R7 | **The rollback floor is a runbook rule.** It is documented for release notes and the roll recipe, with no outside guard. | §5.7, §17 |
+| R8 | **Split** (Paul, 2026-10-01). Placement ships on this spec. Latency routing (R6) is sequenced to its own follow-on spec, built to the §13 invariants. | §13, §17 |
| D1 | The app region is stored console-side and set once at creation. The create door fills an empty `req.Region` from it **before** normalization, the allow-list and the armed checks. Existing apps are backfilled to the home, so behaviour does not change. | §5, §7 |
| D2 | The guess works in coordinates: timezone to a point, IP to a point through an operator-supplied MaxMind-format `.mmdb` (`CONSOLE_GEOIP_DB`), then the great-circle nearest eligible region. Home when everything fails. | §6 |
| D3 | Surfaces: a new-app picker; names and the guess for external pickers; the CLI as R4. | §9, §10, §11 |
@@ -855,13 +857,17 @@ Behind these sits a fourth fact. The flagship's Route53 zone for
DNSimple still serves the live answers (`dns.tf`). A converger writing to a
zone nobody consults is inert at best.
+The arming hazard was posted to amadan discussion carlos/platform #169 on
+2026-10-01, so it is on record where the arming decision lives, independent
+of this spec.
+
Three rounds have each found a new fault in this one area. Per the lesson this
repo has already paid for, the answer is not another patch to an example. It
is an invariant, a design built to it, and a simulation that checks it.
That is a spec of its own, about the converger. It is not a section of a
spec about choosing regions.
-**(decision) Phase L moves to a follow-on spec, and placement ships without
+**(ruling R8) Phase L moves to a follow-on spec, and placement ships without
waiting for it.** R6 is unchanged: latency routing for non-home instances is
still in scope for this work and still binding. It is sequenced, not dropped.
This spec now does three things for R6:
@@ -1177,26 +1183,22 @@ and `ip` appear in none of:
6. **CLI release.** It is safe in either order (§9.6).
7. **titogo**, in its own repo, adopts `/regions/guess` and the place names.
-**Phase L: latency (R6)** is the follow-on spec's rollout, not this one's
+No step of Phase P depends on Phase L. Phase P writes nothing to DNS, stamps
+no `Steering` field, and needs neither `CARLOS_STEERING_ZONE_ID` nor any
+change to the zone.
+
+**Phase L: latency (R6, R8)** is the follow-on spec's rollout, not this one's
(§13.3). Its gate is that spec landing with its simulation passing, plus
scoped approval for the infrastructure. Until then, **no deployment arms
`CARLOS_STEERING_ZONE_ID`**, including for the static-site steering that
-already exists. Take the latency baseline once Phase P step 5 has run.
+already exists. The latency baseline is taken once Phase P step 5 has run.
+That makes Phase L depend on Phase P, never the other way round.
Copy review (§19) happens before Phase P step 3 ships any string.
## 18. Questions for Paul
-1. **Sequencing R6.** Do you agree that placement (Phase P) ships on this
- spec, and latency routing (Phase L) follows on a spec of its own, built to
- §13.2's invariants?
- - The alternative is to hold placement until the converger is fixed.
- Ireland's disk is the incident, and placement relieves it for new
- instances without touching DNS.
- - **Recommendation: split.** R6 stays binding on the follow-on spec. It is
- sequenced, not dropped.
-
- This is a sequencing call under R6, which is why it is yours.
+None. R8 settled rev 4's sequencing question.
## 19. Copy (pending copy review)
@@ -1348,5 +1350,5 @@ The `docs/site/cli.md`, README and release-note additions (§5.7, §11, §12,
| former question | disposition |
| --- | --- |
| Q1: apply R5, titogo separate | adopted (§2, §17 step 7) |
-| Q2: implement R6 with the DNS corrections, keep the separate approved Phase L rollout and measurements | adopted in substance. The corrections are larger than a patch, so they move to the follow-on spec with invariants (§13); the sequencing is §18 Q1. |
+| Q2: implement R6 with the DNS corrections, keep the separate approved Phase L rollout and measurements | adopted in substance. The corrections are larger than a patch, so they move to the follow-on spec with invariants (§13); the sequencing is ruled by R8. |
| Q3: name the exact floor version before activation; keep region-aware reads when disabling | adopted (§5.6, §5.7, §17 step 5) |