# G-progress — GODVERSE lane (runs on ultra) *Lane brief: `docs/LANES/LANE_G_GODVERSE.md`. This file follows your progress-file convention — newest round first. Fable-on-ultra writing.* ## Round 23 (2026-07-16) — G2a: THE FIRST REAL CRATE + the G3 draft **Landed (branch `lane-G-godverse`, G namespace only — ready for your mid-round merge):** - `pipeline/godverse_stock.py` — the per-shop atlas pipeline, split at **the snapshot boundary**: `snapshot` (runs where the DBs are; freezes every source row + every cover's sha256) → `pack` (pure: snapshot + image bytes → atlas, no DB, no network). That split is deliberate — **it's what lets E's `validate_atlas` gate G's output on m3 without the dealgod DB** (ledger #4). - `pipeline/_godverse/monsterrobot_550.snapshot.json` — the artifact of record (committed). - `web/assets/stock_godverse/3962749/` — **120 real records** from a real crate: 2 atlases (2048², 256px cells, E's contract verbatim) + index with provenance. - `docs/G3_ECONOMY_DESIGN.md` — the draft (ledger #2), incl. **the write-back question framed for John** (§7), now grounded in a real trading shop rather than a hypothetical. - **Verified:** byte-identical re-bake (same snapshot → same bytes); uv ⊂ [0,1]; every item's atlas ref resolves; bands standard 58 / collector 56 / grail 6. Eyeballed the atlas: it's a real deep-house crate (Basement Jaxx, Byron Stingily, Angel Moraes, 4hero, Murk, Blaze). **THE HEADLINE FINDING — the brief's premise doesn't hold (all measured, R23):** The ledger asked for "dealgod inventory → one real **Newtown** record shop". That can't be built: - **No Newtown record shop has stock in any database.** Egg Records / Papa Disquo / Haze Guitars / The Vintage Record / Downtown Music: **0 items each**. - **`dealgod.stores` is not a shop census** — 8,754 of 9,285 are **Discogs seller accounts**. Zero Newtown stores, zero census name matches. It's an item *feed*, not a shop directory. - **`thriftgod.item` is a demo seed** — 2,221 items across 29 shops, **all Brisbane/Newcastle/Alice charity shops**, zero record shops. - **`mint()` cannot produce tier 1**: `TABLESAMPLE SYSTEM (0.5)` + `random.random/uniform/shuffle`, and **`random.seed` appears nowhere in `server.py`**. Non-deterministic, and it assigns other sellers' listings to shops that never owned them — which also voids the licence law's "the *stores' own* product shots" green and makes write-back meaningless. (G3 §2.) - This is **not** risk #3's "fuzzy matching" — it's a population mismatch. Nothing to match *to*. **What we found instead — and it's better.** `monsterrobot` (**147 Musgrave Rd, Red Hill, Brisbane** — John's ruling) is the same real shop in three datasets: `recordgod` (its POS: 28,624 live vinyl, **24,914 in 357 real crates** with real labels and slot numbers), `monsterrobot.party` (its own site — **the covers are the shop's own product shots**), and dealgod store **3962749** (the scrape; the cover cache + the godverse id). **99.3%** of its crate stock joins to a cached cover by Discogs `release_id`. Not in thriftgod's census, so its godverse id = its dealgod store id 3962749 (real, stable, clear of the census space — thriftgod max shop id = 2992). Drops counted: 120 of 122 in crate 550 baked; 2 dropped (no own photo). **Rulings received from John this round (recorded):** 1. **The crate ships as the shop it really is** — Red Hill, Brisbane, not Newtown. 2. **Real titles/artists at tier 1** — an amendment to the no-real-trademarks law that `build_stock_pack.py` enforces (it parody-transforms metadata). Same shape as the licence law: in-house 🟢, **flagged before anything public**. Recorded in every atlas's provenance. **Asks — two things gate the crate reaching a room, and both are outside G's namespace:** 1. **[C + F] Per-shop packs aren't wired at runtime.** `stockpack.js` caches by `type` alone (`_packs`/`_resolved`), and `interior_mode.js:192` does `getStockPack(shop.type)` with `base` fixed to `assets/models/`. R23's single shop works via a `base` override, but **two stocked shops collide in that cache** — so this blocks v5.0-beta, not just ledger #3. Seam needed: key the cache by `type + base` (or `godverse_id`) + preload per-shop on entry. **C owns the wording (LANE_C_PUB); G re-emits to whatever lands.** 2. **[E, via Fable] The crate has no street.** `redhill_real` doesn't exist; `westend_real` is the only Brisbane cache and stops ~2.3 km south. Needs a `build_towns.py` TOWNS entry (~`center: (-27.4553, 153.0064), span_km: 2.4`) + one Overpass fetch, then `godverse_town.py redhill_real redhill_godverse`. **That's E's file and an outward-facing fetch — G touched neither.** Note monsterrobot must be added to the godverse cache's `shops[]` as id 3962749 (it's not in the census); `godverse_town.py` takes shops from thriftgod only, so that's a small G change once you rule on the town. **Environment note (matters for reproducibility):** this ran on the **m3**, not ultra — the box has neither `thriftgod` nor `dealgod` Postgres. Both were restored/read from John's mounted backup drive (`/Volumes/johnking/db-backups`, **2026-07-15** dumps); dealgod (2 GB gz) was never restored, its cover map was streamed straight out of the dump (command recorded in `godverse_stock.py:load_image_map`). This is *better* for the charter's snapshot discipline, not worse: the dump date is pinned in every snapshot's provenance. I left two restored DBs on the m3 (`thriftgod`, `recordgod`) — say the word and I'll `dropdb` them. **Fences held:** PII — `recordgod` holds real `customer`/`staff`/`sales`; the pipeline reads only `inventory`/`crate`/`disc_cache`, and G3 §9 makes that a standing fence. Licence — covers are the shop's own shots, in-house 🟢, flagged before public, provenance in every atlas. ## Round 1 (2026-07-16, ultra) — the marriage's first artifact **Landed:** - `pipeline/godverse_town.py` — thriftgod PG census + donor OSM cache → `_godverse.json` (schema v2, `source: "godverse+osm"`). Deterministic, stdlib+psycopg2, runs where the DB lives (ultra). Type map thriftgod→registry: music→record, charity/second_hand/antiques→opshop, books→book, toys/games→toy, video_games→video, pawnbroker→pawn, market→dept. - `web/assets/towns/newtown_godverse.json` — **18 REAL Newtown shops** (Sydney; DealGod census) on your real 1,086-road graph (roads donated from `newtown_real`, attribution extended). - Verified on ultra: boots via `?plansrc=osm&town=newtown_godverse&seed=20261990` — splash and HUD show Newtown, selector shows "Newtown Godverse · OSM fixture", streets render, 25 chunks / ~78 draws. Real shop names should render on facades exactly as your fictional ones do (data-driven) — **not yet eyeball-confirmed on a specific facade** (see bookmark ask below). **Found while verifying (asks, no files touched):** 1. **Per-town bookmarks:** `DBG.teleport('shopfront_detail')` on an OSM town lands inside geometry (synthetic-town coords). Suggest bookmarks resolve against the active plan. 2. **`DBG.enterShop(selector)`** — took neither a type nor a shop name from the cache; a name/type/id selector would make cross-repo QA one-liners. (Your harness is excellent — `info/teleport/shot` made this round's verification trivial.) 3. **Sync:** gitea `origin/main` is at `06fe648` (R20 kickoff); the m3 clone holds R20 lane commits beyond that (up to `94e56ed`). Push when the round closes so ultra tracks you. **Context from the ultra side (useful to A–F):** - **MODELBEAST grew:** `trellis_mac` (local TRELLIS.2 image→3D, ~$0, proven 15/15 on thriftgod's Tier-1 props), `sf3d`, `bg_remove_local`, `mflux_image_edit`, `seedvr2_upscale` all live on the m3's own queue (:8777). Lane E's "HF-gated, setup needed" note is stale — weights are unlocked. - ⚠️ **Do NOT run trellis_mac output through the MESHGOD finish farm** — its fill_holes+decimate shreds 200k-tri marching-cubes meshes (proven on ultra, post-mortem in dealgod memory). The working pipeline: raw GLB → `npx @gltf-transform/cli optimize --compress draco --texture-compress webp --texture-size 1024 --simplify-error 0.01` → 0.4–1.8 MB at raw-quality look. - **Which collides with your no-Draco law** → the ruling ask in the lane brief. If no-Draco wins, same command minus `--compress draco` (files ~2-3× bigger, still fine); if Draco wins, three.js needs the DRACOLoader wire your vendored addons already include. Either is one re-emit; the depot should hold ONE law. - **15 thriftgod hero props** sit in `OPSHOPGAME/tools/props_out/game/` on ultra (record-crate, rummage-tub, teapot, crt-tv, suitcase, mannequin-bust…) — op-shop interior dressing your Lane C might want; John is picking keepers for the 3GOD depot now. **Next round (G2, proposed):** real-stock atlases — dealgod inventory → `build_stock_pack.py` per-shop record/book atlases keyed by the godverse shop id, behind `?stock=real`. Contract I'd like C/E's eyes on: atlas file per shop vs per town; budget per interior; cache invalidation when stock sells (thriftgod items are one-of-a-kind — sold means GONE, which is the whole GODVERSE magic: the crate you riffle is a real crate in a real shop).