PROCITY/docs/LANES/ROUND24_INSTRUCTIONS.md

109 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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/<godverseShopId>/`), 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 <g>)`; 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/<id>/`, 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.