godverse_stock.py splits at THE SNAPSHOT BOUNDARY: `snapshot` (runs where the DBs are; freezes every source row + every cover's sha256) -> `pack` (pure: snapshot + bytes -> atlas, no DB, no network). That split is what lets E's validate_atlas gate G's output on m3 without dealgod. Artifact: web/assets/stock_godverse/3962749/ — crate 550 "DEEP HOUSE", 120 real records, 2 atlases (2048^2, 256px cells, E's contract verbatim). Byte-identical re-bake verified; resolves through C's untouched stockAdapter (120 items, real titles/prices, one material per atlas => one draw); missing atlas -> null -> parody, zero console noise. THE BRIEF'S PREMISE DIDN'T HOLD (measured): no Newtown record shop has stock in any database (Egg Records / Papa Disquo / Haze Guitars / Vintage Record / Downtown Music: 0 items each). dealgod.stores is not a census — 8,754 of 9,285 are Discogs seller accounts, zero Newtown. thriftgod.item is a demo seed (2,221 items, 29 shops, all Brisbane/Newcastle charity, zero record shops). mint() cannot produce tier 1: TABLESAMPLE SYSTEM (0.5) + unseeded random.* — random.seed appears nowhere in server.py — and it assigns other sellers' listings to shops that never owned them, voiding the licence law's "the stores' own product shots" green and making write-back meaningless. Not risk #3's fuzzy matching: a population mismatch, nothing to match to. What we shipped instead is truer: monsterrobot (147 Musgrave Rd, Red Hill, Brisbane — John's ruling) is one 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), dealgod store 3962749 (the cover cache + the godverse id; clear of the census space, thriftgod max shop id = 2992). 99.3% of its crate stock joins to a cached cover by Discogs release_id. Drops counted: 120 of 122 baked, 2 lacked an own photo. John's R23 rulings recorded: the crate ships as the shop it really is (Red Hill, not Newtown); real titles/artists at tier 1 — an amendment to the no-real-trademarks law build_stock_pack.py enforces, same shape as the licence law (in-house green, flagged before anything public). G3_ECONOMY_DESIGN.md drafts the API surface, async enrichment (the dig never blocks), failure modes, identity, the PII fence (recordgod holds real customer/staff/sales — pipeline reads only inventory/crate/disc_cache), and frames the write-back question for John (§7) against a real trading shop with Square sync and an existing hold_expires_at primitive. No default, per law #4. Asks in G-progress (both outside G's namespace, both gate the crate reaching a room): per-shop packs aren't wired (stockpack.js caches by type alone — confirmed live: a base override is silently ignored, so two stocked shops collide; C owns the wording, G re-emits), and redhill_real doesn't exist (needs E's build_towns.py + one Overpass fetch; G touched neither). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
9.2 KiB
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'svalidate_atlasgate 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.storesis 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.itemis 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, andrandom.seedappears nowhere inserver.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):
- The crate ships as the shop it really is — Red Hill, Brisbane, not Newtown.
- Real titles/artists at tier 1 — an amendment to the no-real-trademarks law that
build_stock_pack.pyenforces (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:
- [C + F] Per-shop packs aren't wired at runtime.
stockpack.jscaches bytypealone (_packs/_resolved), andinterior_mode.js:192doesgetStockPack(shop.type)withbasefixed toassets/models/. R23's single shop works via abaseoverride, but two stocked shops collide in that cache — so this blocks v5.0-beta, not just ledger #3. Seam needed: key the cache bytype + base(orgodverse_id) + preload per-shop on entry. C owns the wording (LANE_C_PUB); G re-emits to whatever lands. - [E, via Fable] The crate has no street.
redhill_realdoesn't exist;westend_realis the only Brisbane cache and stops ~2.3 km south. Needs abuild_towns.pyTOWNS entry (~center: (-27.4553, 153.0064), span_km: 2.4) + one Overpass fetch, thengodverse_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'sshops[]as id 3962749 (it's not in the census);godverse_town.pytakes 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 →<key>_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 fromnewtown_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):
- Per-town bookmarks:
DBG.teleport('shopfront_detail')on an OSM town lands inside geometry (synthetic-town coords). Suggest bookmarks resolve against the active plan. 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/shotmade this round's verification trivial.)- Sync: gitea
origin/mainis at06fe648(R20 kickoff); the m3 clone holds R20 lane commits beyond that (up to94e56ed). 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_upscaleall 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).