diff --git a/docs/LANES/ROUND24_INSTRUCTIONS.md b/docs/LANES/ROUND24_INSTRUCTIONS.md new file mode 100644 index 0000000..30307f9 --- /dev/null +++ b/docs/LANES/ROUND24_INSTRUCTIONS.md @@ -0,0 +1,108 @@ +# 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.