PROCITY/docs/LANES
m3ultra 9b1df5cca0 Lane E R25 (v5.0-alpha): the licence line made unmissable + the sku form asserted
THE BUG WAS A DIVERGENCE, NOT A SPELLING (ledger #2). The R24 gate printed "OK — 0 warnings" on a
real shop's product photos while saying NOTHING about their licence. Two paths read one field with
different spellings:

    the CHECK:  lic = prov.get("licence") or prov.get("license")   <- permissive: passed either
    the PRINT:  lic = prov.get("licence")                          <- strict, behind `if lic:`

While G's artifact was British they agreed. G's R24 keyed re-emit moved it to US `license`: the check
still passed, the print silently resolved to {}, and FLAG BEFORE ANY PUBLIC/COMMERCIAL RELEASE stopped
reaching a human. The `or` fallback WAS the bug — it made one path permissive so it could not feel the
other break. That is my own R21 stale-roads lesson one layer up (a check applied to one of two
symmetric paths is a trap with a fuse on it) — I wrote that lesson down and shipped it again anyway.

Fixed structurally, not by adding the missing spelling: ONE spelling, NO fallback (British `licence`
now ERRORS and names C's §7.3 retirement); ONE lookup, ONE owner (validate_index returns the evidence
string, main prints what it is handed and never re-looks-up the field — no second path left to drift);
and the evidence line is COUNTED — judged N atlases means N licence lines shown, or FAIL.

MY OWN FIRST CUT HAD THE SAME DISEASE AND MY OWN TEST PASSED FOR THE WRONG REASON. I added the tally
tripwire — but main() also appended its own missing-licence error, so all_errs was never empty when the
tally would fire: the tally was UNREACHABLE DEAD CODE, and the test went green through the other path
and reported PASS. Exactly the trap I recorded in R24 ("a gate that fails for the wrong reason is a
gate that will pass for the wrong reason later") — one round later, on me, in the file where I wrote
it. Now the field check owns the precise error and the tally sits after the all_errs return, existing
only for the day that check goes permissive again. Verified by stubbing validate_index permissive: it
fails VIA THE TALLY, not incidentally.

Proved 8/8: G's sku re-emit -> PASS with the flag shown · `license` gone/empty -> FAIL · British at top
level -> FAIL · British nested -> FAIL · attribution/snapshot gone -> FAIL · THE R24 SILENT SHAPE ->
FAIL · permissive-check simulation -> FAIL via the tally.

Aligned to C §7.3 as the provenance authority: the four gate fields (license, attribution, generator,
snapshot) live at TOP LEVEL, US spelling — the convention 21 shipped town caches already use. This
reverses R24's #2/#3, which read the artifact of the day. Docstring and code now say the same thing;
R24's fourth bug was that they didn't.

C §7.2a — THE SKU FORM (ledger #3), and I verified C's claim before building to it: independently
measured 120/120 godverse ids also present in the generic pack (F and C exactly right), and G's
snapshot carries 120/120 unique skus so the re-emit was feasible. Proved the compliant shape passes
BEFORE handing G the gate (4/4: sku_<POS sku> -> PASS · positional -> FAIL · sku-but-duplicated ->
FAIL · one id sneaking back into rec_ -> FAIL at 1/120, so it catches a real collision, not only an
all-or-nothing one).

-> C: two things beyond your literal ask, say if you disagree. (1) I also assert the actual property
your rule exists to guarantee — the pack's ids are DISJOINT from the shipped generic packs, measured
against web/assets/models/stock_*_index.json; the prefix says ids should be disjoint, this measures
whether they are, and it catches the reverse drift (a generic pack wandering into sku_) a prefix check
never could. Absent generic packs WARN rather than passing silently. (2) I flag British `licence`
anywhere, including inside the nested provenance{} "colour" block — §7.3 retires the spelling and R25
is what a spelling fork costs, so I read the retirement as global. Scope it back if you meant
otherwise.

The gate was RED by design for one wave: between my readiness and G's re-emit the collision was real
and unfixed, so it failed deliberately — a gate that stayed green on a defect F had just found would
be the vacuous species in a different hat. It went green when G landed 4314622, with no change from me.

Gates: validate_atlas green against G's re-emitted atlas with the licence line PRINTED (the point of
the round); validate_manifest (qa gate 3) exit 0; qa.sh --strict 6 passed / 0 failed / QA GREEN.
-> F: this is the commit you held for — the tree now contains the code that produced your green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:16:49 +10:00
..
FABLE_TO_LANE_G.md Fable (integrator): response to Lane G — Draco ruling (no-Draco depot), density ruling, bug triage, G2/G3 sequence 2026-07-16 20:34:30 +10:00
LANE_A_CITYGEN.md PROCITY scaffold: spec, research, 6 Opus lane prompts, core modules, vendored three r175, 69 inherited skins 2026-07-14 10:46:40 +10:00
LANE_A_NOTES.md Lane A round 25 (v5.0-alpha): the sweep reconciled with Ruling 2 + the six pins (ledger #1) 2026-07-17 02:23:57 +10:00
LANE_B_NOTES.md Lane B round 22 (v4.0): #3 per-town bookmarks — anchor on the retail heart (Lane G's filed bug) + F's primitive 2026-07-16 22:01:41 +10:00
LANE_B_STREETSCAPE.md PROCITY scaffold: spec, research, 6 Opus lane prompts, core modules, vendored three r175, 69 inherited skins 2026-07-14 10:46:40 +10:00
LANE_C_AUDIO.md Lane C R14 (v3.0 release): venue audit + docs freeze + guitar_amp ruling 2026-07-16 08:40:42 +10:00
LANE_C_GLB_VALIDATION.md Lane C R5 C3: re-measure interiors after Lane E's hero-prop bake 2026-07-14 21:16:15 +10:00
LANE_C_INTERIORS.md PROCITY scaffold: spec, research, 6 Opus lane prompts, core modules, vendored three r175, 69 inherited skins 2026-07-14 10:46:40 +10:00
LANE_C_NOTES.md Lane C round-9: draw-headroom note for D's browser rigs (F1 handoff) 2026-07-15 09:57:55 +10:00
LANE_C_PUB.md Lane C R25: sku-derived slot ids — F's id-collision finding made structural (ledger #3) 2026-07-17 02:18:37 +10:00
LANE_D_CITIZENS.md PROCITY scaffold: spec, research, 6 Opus lane prompts, core modules, vendored three r175, 69 inherited skins 2026-07-14 10:46:40 +10:00
LANE_D_NOTES.md Lane D R23 (v5.0-alpha): the GIG_RANGE chunk-neighbour fix — scoped to the gig path (ledger #6) 2026-07-16 23:06:07 +10:00
LANE_E_ASSETS.md PROCITY scaffold: spec, research, 6 Opus lane prompts, core modules, vendored three r175, 69 inherited skins 2026-07-14 10:46:40 +10:00
LANE_E_NOTES.md Lane E R25 (v5.0-alpha): the licence line made unmissable + the sku form asserted 2026-07-17 09:16:49 +10:00
LANE_F_INTEGRATION.md PROCITY scaffold: spec, research, 6 Opus lane prompts, core modules, vendored three r175, 69 inherited skins 2026-07-14 10:46:40 +10:00
LANE_F_NOTES.md Lane F R24 (v5.0-alpha): THE CRATE WALKS — the per-shop wire + a gate that can't lie 2026-07-17 08:43:29 +10:00
LANE_G_GODVERSE.md Lane G (GODVERSE, ultra) R1: real-shop census adapter — 18 real Newtown shops on the real road graph 2026-07-16 20:19:14 +10:00
ROUND3_INSTRUCTIONS.md Lane F R5 start: archive R3/R4 instruction claims + v2 flags table + v1.1 watch 2026-07-14 20:48:19 +10:00
ROUND4_INSTRUCTIONS.md Lane F R5 start: archive R3/R4 instruction claims + v2 flags table + v1.1 watch 2026-07-14 20:48:19 +10:00
ROUND5_INSTRUCTIONS.md Fable (integrator): round-6 lane instructions — finish v2 wiring + pay review debts (A plansrc carried, F enforcement harness, C draw batching, orphaned assets) 2026-07-14 22:21:31 +10:00
ROUND6_INSTRUCTIONS.md Fable (integrator): round-7 lane instructions — roster default-on flip + GODVERSE real stock + weather + strict harness 2026-07-14 23:53:54 +10:00
ROUND7_INSTRUCTIONS.md Fable (integrator): round-8 lane instructions — catch-up (A/B carried) + the town comes alive (patronage, buy loop, weather, pack breadth) 2026-07-15 02:06:34 +10:00
ROUND8_INSTRUCTIONS.md Fable (integrator): round-9 lane instructions — the v2.0 ship round (interior presence, buy-anywhere, tram, tour, docs freeze) 2026-07-15 09:16:59 +10:00
ROUND9_INSTRUCTIONS.md Fable (integrator): round-9 lane instructions — the v2.0 ship round (interior presence, buy-anywhere, tram, tour, docs freeze) 2026-07-15 09:16:59 +10:00
ROUND10_INSTRUCTIONS.md Fable (integrator): round-10 instructions — interior giant-rig blocker, v2.0 tag pulled 2026-07-15 12:12:55 +10:00
ROUND11_INSTRUCTIONS.md Fable (integrator): v2.0 shipped; round-11 instructions — the audio round 2026-07-15 14:08:32 +10:00
ROUND12_INSTRUCTIONS.md Fable (integrator): round-12 instructions — v3.0-alpha, one pub end-to-end 2026-07-15 17:32:34 +10:00
ROUND13_INSTRUCTIONS.md Fable (integrator): round-13 instructions — v3.0-beta, the district 2026-07-15 21:30:01 +10:00
ROUND14_INSTRUCTIONS.md Fable: R14 kickoff rulings recorded (push done, flag stays opt-in, genres final) + gitignore local session files 2026-07-16 00:59:42 +10:00
ROUND15_INSTRUCTIONS.md Fable (integrator): round-15 instructions — close the v3.0 release (F's carried brief + poster-face fix + amp fix) 2026-07-16 09:21:39 +10:00
ROUND16_INSTRUCTIONS.md Fable (integrator): round-16 instructions — v3.1 THE FLIP (defaults on, classic covenant, drummer sits, town-wide pools) 2026-07-16 12:01:26 +10:00
ROUND17_INSTRUCTIONS.md Fable: R17 kickoff rulings — v4 = THE REAL MAP (John), Overpass fetch authorized 2026-07-16 14:05:50 +10:00
ROUND18_INSTRUCTIONS.md Fable (integrator): v4 REAL MAP charter + round-18 instructions — v4.0-alpha REAL ROADS (katoomba_real) 2026-07-16 15:29:10 +10:00
ROUND19_INSTRUCTIONS.md Fable (integrator): round-19 instructions — the v4.0-alpha close (fragmentation ruling, BIG_CITY fix, the gate) 2026-07-16 17:06:18 +10:00
ROUND20_INSTRUCTIONS.md Fable: R20 kickoff ruling — density widening approved (John), directive: subtle, texture not takeover 2026-07-16 18:14:53 +10:00
ROUND21_INSTRUCTIONS.md Fable (integrator): round-21 instructions — the v4.0-beta close (venue cluster bias, selector index, density soak, the gate) 2026-07-16 20:14:39 +10:00
ROUND22_INSTRUCTIONS.md Fable (integrator): round-22 instructions — v4.0 THE EPOCH CLOSE (tri diet first, pack absorb, release tour, G items) 2026-07-16 21:44:03 +10:00
ROUND23_INSTRUCTIONS.md Fable (integrator): v5 THE REAL SHOP charter + round-23 instructions — v5.0-alpha THE FIRST REAL CRATE 2026-07-16 22:48:59 +10:00
ROUND24_INSTRUCTIONS.md Fable (integrator): round-24 instructions — the alpha completion (contract fix, identity field, redhill, honest gates) + two new laws 2026-07-17 00:21:51 +10:00
ROUND25_INSTRUCTIONS.md Fable (integrator): round-25 instructions — the tag, earned (sweep vs Ruling 2, licence line, sku ids, F closes) 2026-07-17 02:14:02 +10:00
ROUND26_INSTRUCTIONS.md Fable (integrator): R26 amended — wave-0 status (F green, tag pending E) + the atlas manifest (F's finding #4, structural) 2026-07-17 08:54:27 +10:00