diff --git a/F-progress.md b/F-progress.md index 1a0bdfa..85a4d2f 100644 --- a/F-progress.md +++ b/F-progress.md @@ -4,6 +4,53 @@ --- +## Round 23 (v5.0-alpha — THE FIRST REAL CRATE) — **F HELD the tag** + +**`v5.0-alpha` is NOT tagged. The crate is real; it has no street.** G's 120 real records off a real +shop's POS are in the tree and byte-identically re-bakeable — genuinely the artifact the charter asked +for. Nothing in the game can reach them. `#7a` isn't a gate that failed, it's a gate that **cannot be +run**. R18's law: *release rounds don't ship known breaches.* Full record: `LANE_F_NOTES` §23. + +**F executed the merge that never happened** (charter law #5) — `main` had no `stock_godverse/**` at all, +so the branch F was asked to tag lacked the round's headline. Review had happened, C had verified +pre-merge and passed; only the `git merge` was missing. Disjointness verified before merging, not +assumed. Zero conflicts → `43b035a`. + +**What passed — everything except the crate.** `qa.sh --strict --matrix` **7 passed · 0 failed · 0 warn**; +**MATRIX GREEN — 10 towns × 7 gates**; selfcheck **ALL GREEN 152,015/152,015** (was 161,300 — E retired +toowoomba); flags harness green, so the `?classic=1` covenant still holds through the merge. Tier 0 +`?noassets` → **zero fetches, zero console errors** (the offline law holds); tier 0 default boot on the +godverse town; tier 1 (v2 town-wide) `?stock=real`. **Tier 1 (v5, per-shop) — the round's whole +deliverable — is never fetched.** A, D, E and C's work is sound; only the rung this round was built to +add is unattached. + +**Three findings, in order of how much they cost:** +1. **The atlas contract contradicts itself.** `LANE_C_PUB:271` publishes `stock_shop__index.json`; + C's own loader at `stockpack.js:25` fetches `${base}stock_${type}_index.json`. **Incompatible.** G + built runtime-compatible (so C's base-override check passed); E built contract-compatible (so E's + validator can't see it). **Nobody was wrong — the contract was.** F recommends amending to G's shape; + it's the only one the runtime can load. +2. **The gate built to catch that was blind and green.** `validate_atlas.py` globs a filename that can't + exist at runtime, finds nothing, and `return 0` — so it passes whether the atlas is absent, misnamed, + or perfect. It had never seen one until F pointed it at G's by hand, which then surfaced *deeper* drift + (E's code reads provenance top-level, E's own docstring says nested, G nested it; `licence` vs + `license`; a ceiling stale by one round). *A gate that returns 0 on an empty set is not a gate.* +3. **`#7a` would have passed vacuously.** F walked into The Vintage Record (real shop, real road) and the + crates filled with **real covers — from E's 350-item town-wide v2 pack**, not the crate. Zero requests + to `stock_godverse/`, ever. Eyeballed as written, the gate goes green and proves nothing. + +**R24 order — three gaps, none F-only:** **A+G** land a `godverse_id` (verified: *every* godverse shop +reports `godverse_id: null`; the schema has no such field, and C's rule is "C does not invent it") → +**E** builds `redhill_real` (one Overpass fetch — E's file, outward-facing; **not F's to invent**) → +**C** keys the pack cache by `type+base` (today a cache hit returns before `base` is read, so two stocked +shops collide *and fail-soft breaks*) → **F** passes the per-shop base and re-gates. F deliberately did +**not** build its half: untestable with no street and no identity field. Filed, not guessed. + +**Also:** A's spacing warn earned on day one — with toowoomba retired, **ballarat now warns at 255 m**. +The thin tail has a second member. + +--- + ## Round 22 (v4.0 — THE EPOCH CLOSE) — F closed it - **The blocking gate CLOSED.** F's R21 re-measure made the tri diet blocking; B diagnosed, the driver diff --git a/docs/LANES/LANE_F_NOTES.md b/docs/LANES/LANE_F_NOTES.md index 0497de5..3b97545 100644 --- a/docs/LANES/LANE_F_NOTES.md +++ b/docs/LANES/LANE_F_NOTES.md @@ -840,3 +840,123 @@ Toowoomba is a real city whose *secondhand* cache is 12 shops, spread across its isn't "≥N shops" — it's **shops-per-street-metre**. v4.x options: clip the graph to the retail core for thin caches, or set a ratio floor in the pack. The frame ships **labelled honestly** rather than swapped for a flattering town — same discipline as the R21 re-measure that got worse and said so. + +--- + +## 23. Round 23 — v5.0-alpha THE FIRST REAL CRATE. **F HELD the tag — the crate has no street.** + +**Verdict: `v5.0-alpha` NOT tagged.** The round's headline artifact is real and good — G's 120 real +records off a real shop's POS are in the tree, byte-identically re-bakeable. It cannot be reached from +the game. `#7a` (riffle the real crate, buy it) is not a gate that failed; it is a gate that **cannot be +run**. R18's law: *release rounds don't ship known breaches.* + +### What F did run + +| gate | result | +|---|---| +| **`qa.sh --strict --matrix`** | **7 passed · 0 failed · 0 warn** — QA GREEN | +| **town-matrix** | **MATRIX GREEN — 10 towns × 7 gates**, all green | +| citygen selfcheck | **ALL GREEN 152,015/152,015** (was 161,300 — E retired toowoomba) | +| flags harness (classic regression · default boot · STRICT) | **GREEN, 0 warnings** — the covenant holds through the merge | +| manifest validator · scaffold · consistency · no-giants | GREEN | +| tier 0 — `?noassets=1` | **zero fetches, zero console errors** — the offline law holds | +| tier 0 — default boot, godverse town | town loads (18 real Newtown shops), stock → parody | +| tier 1 (v2, town-wide) — `?stock=real` | 350-item pack resolves, real cover art | +| **tier 1 (v5, per-shop) — the round's deliverable** | **NEVER FETCHED** | +| tier 2 | N/A by law (no server code this round) | + +### The merge that never executed (F did it — charter law #5) +Fable's mid-round merge never ran: `main` had **no `web/assets/stock_godverse/**` at all**, so the branch +F was asked to gate and tag did not contain the round's headline. The review had happened (the shared +checkout was parked on `lane-G-godverse` for it) and C verified the atlas from a temp worktree — +deliberately pre-merge — and passed. Only the `git merge` was missing. F executed it as the integration +lane, disjointness **verified before merging, not assumed** (G: `G-progress`, `G3 doc`, +`pipeline/godverse_*`, `stock_godverse/**` · main-since-fork: `C-progress`, `LANE_C_PUB` · overlap: none). +Zero conflicts, exactly as law #5 predicted. → `43b035a`. + +### ⚠ FINDING 1 — the atlas contract contradicts itself. Nobody was wrong; the contract was. + +| | says the index is | +|---|---| +| **C's published contract** — `LANE_C_PUB:271` | `stock_shop__index.json` | +| **C's own runtime loader** — `stockpack.js:25` | `` fetch(`${base}stock_${type}_index.json`) `` | + +**These are mutually incompatible.** An atlas named per the published contract can *never* be loaded by +the code that is supposed to load it. G shipped `3962749/stock_record_index.json` — **runtime-compatible**, +which is exactly why C's base-override verification passed. E globbed `stock_shop_*_index.json` — +**contract-compatible**, which is why E's validator never saw the atlas. Two lanes implemented opposite +halves of a self-contradicting spec and both were correct. + +**F's recommendation (measured, not preferred):** amend the contract to G's shape — +`stock_godverse//stock__index.json`. It is the only shape the runtime can load, +it keys per-shop by directory, and it costs G nothing (already emitted). E's glob follows. C owns the +wording (LANE_C_PUB); this is the amendment ledger #3 anticipated. + +### ⚠ FINDING 2 — the gate built to catch this was blind, and green + +`validate_atlas.py` globs for a filename that cannot exist at runtime, finds nothing, prints *"no +per-shop atlases yet — nothing to validate"* and **`return 0`**. `validate_manifest.py:158` propagates +that green (its comment states the intent: *"No atlases yet ⇒ clean pass"*). So the round's QA gate passes +whether the atlas is **absent, misnamed, or perfect** — it has never once looked at one. E built it in +wave 1 with no atlas to test against; on first contact (F, at close) it was blind. + +The flaw is precise and the fix is a one-liner: the validator **conflates "no atlases exist" with "no +atlases matched my glob."** The first is a legitimate clean pass; the second is exactly the failure it +was written to catch. Cross-check the directory — if `stock_godverse/*/` is non-empty but no index +matched, that is an **ERR**, not a pass. *A gate that returns 0 on an empty set had better be certain the +set is empty.* + +Pointing it at G's index by hand (filename drift removed) shows the drift is **deeper than the name**: +- **`ERR missing/empty provenance ['license','attribution','generator','snapshot']`** — but G *carries* + `generator` and `snapshot`. E's line 68 reads `idx.get(f)` — **top-level** — while E's own docstring + (line 14) specifies them **nested under `provenance`**, which is where G put them. **E's code + contradicts E's doc**; G's atlas would fail even with E's exact field names. +- **`licence` vs `license`** — G used the British spelling; E's `REQUIRED_PROV` wants American. +- **`attribution`** — G folds the substance into `licence.covers`; E wants the field. +- **`WARN 2 atlases — C's rule is 1/shop`** — E built to C's *pre-correction* ceiling; C amended §7.2 to + `≤2 atlases @≤2048²` in the same wave. Stale by one round. + +### ⚠ FINDING 3 — `#7a` would have passed vacuously +The brief says: *"boot `newtown_godverse` with `?stock=real` … riffle — **real covers render**."* They do. +F walked into **The Vintage Record** (a real Newtown shop, on its real road) via `DBG.enterShop`, and the +crates filled with **real cover art** — from E's **350-item town-wide v2 pack** (`Sunburnt Milk Bar Vol. 2`, +`Midnight Departure`), the same pack every record shop in every town has had since v2. **Not** Monster +Robot Party's 120. Network confirms: every stock fetch goes to `assets/models/`; **zero requests to +`assets/stock_godverse/`, ever.** Had F eyeballed the gate as written, it would have gone green and proven +nothing. *Two vacuous gates in one round — same species: both test the presence of a thing rather than +the identity of it.* + +### The exact failure list for R24 — three gaps, none of them F-only + +1. **The crate has no street.** [E + G] No town cache contains shop `3962749`; `redhill_real` does not + exist. Needs a `build_towns.py` TOWNS entry (~`center (-27.4553, 153.0064), span_km 2.4`) + one + outward-facing Overpass fetch → `redhill_real`, then `godverse_town.py redhill_real redhill_godverse` + with monsterrobot injected into `shops[]`. **F did not do this: E's file, G's generator, and an + outward-facing fetch — inventing town data is not F's to invent.** +2. **No identity field exists to key an atlas by.** [A + G] Verified in the live runtime: *every* shop in + `newtown_godverse` reports `godverse_id: null` — the cache schema carries no such field at all. C's + rule is *"C consumes whatever identity field lands, C does not invent it"* — so nobody has landed it. + A owns the CityPlan/cache contract; G emits it. +3. **The runtime wire.** [C + F] `stockpack.js` keys `_packs`/`_resolved` by **type alone** and returns a + cache hit before `base` is ever read (`stockpack.js:24`), so two stocked shops collide **and fail-soft + breaks** — an unstocked shop of a cached type inherits another shop's crate. C specced the seam (key by + `type+base`, per-shop preload on entry, LRU=1 + dispose) and owns the file; F then passes the per-shop + base at `interior_mode.js:192` and drops the town-wide preload at `index.html:199`. + +**F deliberately did not build its half of #3 this round.** It is untestable while #1 and #2 are open +(no street to walk to, no identity field to pass), and F would be writing against three-quarters of a +spec that does not exist yet. Filed, not guessed. R24 order: **A+G (identity) → E (the town) → C (the +keying) → F (the wire + re-gate)**, and the crate walks. + +### Also found +- **The godverse town is in no gate.** `newtown_godverse` is a shipping town cache that boots fine (F + verified: 18 real shops, real roads) but the town-matrix covers `newtown_real`, not it — so the one + town the whole epoch is built on is ungated. F's matrix, F's gap; it lands with the R24 re-gate rather + than a held round. +- **A's spacing warn earns immediately:** with toowoomba retired, **`ballarat_real` now warns at median + 255 m > 150 m**. The thin tail has a second member — A's warn is doing exactly its job (warn, not error; + E curates). Filed for E's next curation pass. +- **`?noassets=1` + `&town=` silently boots a *different town*** (the fixture, not the cache) — F's + own R17 wiring gates the cache fetch on `!NOASSETS`, correctly (noassets = zero network), but the tier + ladder's *"same shop under `?noassets`"* can't mean the same shop for a real town. Tier 0 for **stock** + is provable on the default boot; tier 0 for the **town** is a fixture fallback by design. Wording, not a bug.