| index 4f7d48737..074da8dd6 100644 |
| --- a/docs/superpowers/plans/2026-08-23-multi-region-steering.md |
| +++ b/docs/superpowers/plans/2026-08-23-multi-region-steering.md |
| @@ -350,6 +350,15 @@ func desiredState(routes []registry.Route, edges []edgesFileView, appsDomain str |
| commands ready-to-run); edges-file `role` over-claim note (steering |
| reads the ARMED-EDGE set, not roles — unaffected, but read-local |
| still wants the replica role first, restated). |
| + **RULED (2026-08-24), superseding this item's "egress ruling request |
| + stays open (#-ref)":** the T7 ruling landed — sender-side per-home-box |
| + in-flight cap plus home-box hop annotation, pricing deferred to Paul |
| + and absorbed by default. Authoritative text: the **Amendment |
| + (2026-08-24)** in Part 3 of |
| + `docs/superpowers/specs/2026-08-20-multi-region-ingress-design.md`. |
| + The arming checklist below is unchanged except for its ordering: the |
| + ruling's code must be rolled to every box of a deployment BEFORE that |
| + deployment arms a second edge, i.e. ahead of step 0. |
| - [x] Full gate; commit `docs: steering rollout notes`. |
| |
| ## Rollout notes (filled by Task 8 at execution) |
| @@ -605,6 +614,21 @@ rollout notes and constraints where they name Part 4 directly. |
| window the backhaul plan called out ("today it is dormant/low-volume |
| by construction... which is the window in which to decide, not |
| after") ends the moment stage 5 begins. |
| + **RULED (2026-08-24), inside that window:** the ruling landed and both |
| + halves are implemented — containment is the semaphore option named |
| + above (a per-home-box in-flight cap on the sending edge, |
| + `CARLOS_BACKHAUL_MAX_INFLIGHT`, default 64, 503 + `Retry-After: 2` at |
| + the limit with no dial), and attribution is a home-box hop annotation |
| + (`usage.EdgeRow`'s additive, `omitempty`, SUBSET `hop_requests` / |
| + `hop_bytes_out`), so backhauled bytes are attributed to the route, |
| + account and app that caused them. Pricing them stays Paul's call and |
| + ships absorbed: `backhaul_gb` is reserved and wired into nothing, so |
| + bills are byte-identical to before. Authoritative text: the |
| + **Amendment (2026-08-24)** in Part 3 of |
| + `docs/superpowers/specs/2026-08-20-multi-region-ingress-design.md`. |
| + Still owed: the numbered issue, to be filed with the ruling's text |
| + when the PR opens. Stage-5 consequence: this must be rolled to every |
| + box of a deployment before that deployment arms its second edge. |
| |
| ### Deferred-minor triage (every task's ledger entry, included or excluded with a reason) |
| |
| @@ -721,6 +745,19 @@ the task's own two fix rounds. Nothing left to triage. |
| later") is needed before or alongside the stage-5 arming decision — |
| raised here rather than left buried in plan 2's own notes, since this |
| is the plan whose stage-5 work makes the ruling time-sensitive. |
| + **RULED (2026-08-24) — no longer blocking, one question left.** The |
| + containment approach is decided and built (per-home-box in-flight cap |
| + on the sending edge, default 64, 503 + `Retry-After: 2`), as is |
| + attribution (home-box `hop_requests`/`hop_bytes_out` on |
| + `usage.EdgeRow`); see the **Amendment (2026-08-24)** in Part 3 of |
| + `docs/superpowers/specs/2026-08-20-multi-region-ingress-design.md`. |
| + What is still Paul's: **whether backhauled bytes should be PRICED** (a |
| + `backhaul_gb` rate-card line or an egress multiplier) or absorbed as a |
| + platform cost of any-edge serving. Shipped default: absorbed — the |
| + counters accumulate dormant, so the decision can be made on real data |
| + after stage 5, and nothing in the engineering depends on the answer. |
| + Also owed: file the numbered issue carrying the ruling's text, and |
| + roll this to every box of a deployment before arming its second edge. |
| - **PR routing**: this branch merges to `main` directly — no stack, no |
| base branch other than `main` (see the PR body, drafted in the task |
| report). |