# PROCITY — Round 24 lane instructions (from Fable, integrator) Date: 2026-07-17 · **R23 verdict: THE HOLD WAS RIGHT.** F held the `v5.0-alpha` tag on a round where every suite was green — `qa.sh --strict --matrix` 7/7, MATRIX 10×7, selfcheck 152,015 — because the round's headline could not be reached: G's 120 real records (Monster Robot Party's actual crate 550, off the real POS) have **no street** (the shop isn't in any town cache), **no identity** (`godverse_id: null` on every godverse shop — the schema has no such field), and **no compatible contract** (C's published atlas naming and C's own runtime loader are mutually incompatible — an atlas named per the contract can never be loaded by the code meant to load it). G built runtime-compatible; E built contract-compatible. **Nobody was wrong; the contract was.** And two gates would have passed without touching their subject — E's validator returns 0 on an empty glob, and #7a-as-written goes green on the *generic* v2 pack's real covers with zero fetches to `stock_godverse/` ever. "Release rounds don't ship known breaches" — F applied the law to its own tag. This is the discipline working at the exact moment it matters most. Round 24 is **THE ALPHA COMPLETION** — the three gaps closed by their owners, the two process fixes made law, and the tag earned. Tag **`v5.0-alpha`** at close (F, and only when #7a runs honestly). ## Two process fixes, now law (from R23's findings) 1. **THE VACUOUS-GATE LAW (all lanes, immediately):** a gate must FAIL — or explicitly SKIP with a printed reason — when its subject is absent. A gate that can pass without touching its subject is not a gate. "No atlases yet ⇒ clean pass" and "real covers render" were the same species: presence-of-a-thing checked instead of the-right-thing. Every new gate states what its subject is and proves it touched it (a fetch log line, a matched-file count, an id equality — something falsifiable). 2. **Charter law #5 amendment — F executes gating merges.** The mid-round merge was Fable's per the charter and Fable was never invoked — the round's headline sat unmerged while five lanes built around it. F proved the fix in the act: verify namespace disjointness empirically, then execute. Going forward: **when a G deliverable is gating, Lane F executes the merge as part of its integration duty** (disjointness verified, not assumed); Fable reviews at the round boundary as before. One less cross-Mac synchronization point. ## The ledger 1. **The contract fix (C — the root cause is yours to close).** Your published atlas contract and your own `stockpack.js:25` loader disagree. Ruling: **the runtime is the authority** — rewrite the contract to what the loader family actually implements, extended per-shop: per-shop atlases live under a per-shop `base` (`stock_godverse//`), index named as the loader expects, fields named as the loader reads them (the `licence`/`license` and nested-vs-top-level provenance drift dies here — pick what the code reads, document it, one truth). Plus F's filed item: **key the pack cache by `type+base`** so a per-shop pack and the town-wide pack coexist. Publish the corrected contract FIRST (half-day rule — G and E both re-emit against it). 2. **The identity field (A, with G).** The town-cache schema grows an optional **`godverseShopId`** on shop entries (schema stays v2 — optional field, absent everywhere except godverse caches; `validateTownCache` requires it on `source: "godverse+osm"` shops). G's adapter emits it from the census (the POS shop id IS the id — no mapping table). A: the validator arm + selfcheck assert; G: re-emit `newtown_godverse` with ids. 3. **The street (E).** Build **`redhill_real`** — one bounded Overpass fetch under the standing authorization — so Monster Robot Party's real shop has its real street. Same discipline as the pack (raw snapshot, ODbL, spans, C's mapping). Hand the donor to G. 4. **The validator, made honest (E).** Fix `validate_atlas.py` per the vacuous-gate law: an empty match set prints `SKIP: no atlases present (0 files matched glob )`; a present-but- unparseable or present-but-unmatched atlas FAILS; field names align with C's corrected contract (your own docstring and your own check currently disagree — F caught it). Then run it against G's re-emitted atlas and gate on the result. Also: the **ballarat** curation (A's spacing warn caught it at 255 m — re-bbox onto its strip or retire, counted, your call). 5. **The re-emit + the second town (G, on ultra).** Against C's corrected contract and A's identity field: re-emit the Monster Robot atlas keyed by `godverseShopId`, run the adapter on E's `redhill_real` donor → **`redhill_godverse`** (the town whose record shop is THE shop). Update the G3 doc §4 if the corrected contract changes any API field naming. Your deliverables are gating → F merges mid-round per the amended law. 6. **The wire + the honest gate + the tag (F, last).** a. Pass the per-shop `base` through the stock path (the seam you deliberately didn't build against a three-quarters spec — the spec is now whole). b. **#7a, honestly:** boot `redhill_godverse` + `?stock=real`, enter Monster Robot Party via your selector, and assert on falsifiables: network log shows fetches under `stock_godverse//`, rendered titles ∈ the atlas index (id equality, not "covers render"), buy debits, tier-1 gone-this-session semantics. Then the ladder re-proof (tier 0 zero-fetch / missing-atlas soft-fall / tier 1) and the frozen classic + default gates. c. `qa.sh --strict --matrix` green (with E's honest validator now IN the gate set), notes §24, the held README v5 teaser ships WITH the tag (they're one claim, as you said), tag **`v5.0-alpha`**, push. 7. **On-call:** B (standing light-round offer holds — R25 gets you first pick of the polish list), D (done — the GIG_RANGE fix landed scoped and clean). ## Laws Charter v5 laws + the two new ones above. Golden discipline: E's ballarat fix and the `redhill_real`/`redhill_godverse` pins are the round's town-golden moves (A pins, batched); synthetic/classic/gig/fixtures frozen. No server code — G3 stays paper until ratified. ## THE EXACT RUN ORDER 1. **Start together: C (#1 contract fix — publish first) + A (#2 identity arm) + E (#3 redhill + #4 validator + ballarat).** 2. **When C's contract and A's field are published: G (#5) re-emits + builds redhill_godverse.** 3. **When G pushes: F merges (amended law #5), then closes (#6)** — wire, honest gate, tag. Waves: **[C, A, E] → [G] → [F merge + close]**. B/D on-call. ## Standing — JOHN: THE WRITE-BACK RULING (§7 of the G3 doc — due this round) The G3 draft frames it exactly as charter law #4 required: **does an in-game purchase ever touch real monsterrobot/Square inventory?** Three options — A: sandbox (read-live, sell-local; zero real-world risk; the one-of-a-kind thrill is fiction) · B: reservation (a real expiring hold via the POS's existing `hold_expires_at`; genuinely one-of-a-kind AND reversible; needs a hold budget, a staff-visible reason code, and the-shop-always-wins race policy) · C: full write-back (game sale = real sale; a business decision, not an engineering one). **Fable's recommendation (yours to overrule): ship v5.0 on Option A, charter Option B as a v5.x upgrade** behind a hold budget you set — B is the strongest truth-per-unit-risk in the doc, but it deserves plumbing that has soaked, not plumbing that tags this round. Option C should only ever happen as a deliberate business launch, if ever. Say A / B / C (or A-then-B, the recommendation) and the G3 doc ratifies with your ruling inline.