488067004c
7 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
cedc5872fb |
Lane G R27 (v5.0): tier 2 — the two read endpoints, the three fences, and the gate's missing subject
THE LIVE CRATE READS. godverse_server.py: /health, /shop/<gid>/stock, /shop/<gid>/crates, plus
start|stop|status (F's kill-the-server lifecycle), setup-role, make-fixture. Stdlib + psql. First
server code of the epoch, per the ratified G3.
Live against the real POS: crate 550 -> {baked:120, live:120, gone:0}, real prices, real VG+
grading, etag stable and ?since= -> 304. /crates returns 315 REAL crates with the shop's own
labels: TECHNO (57), $12-$15 TECHNO (46), DRUM N BASS (66).
THE THREE FENCES, each enforced by the machine, each measured:
- The credential: godverse_ro holds SELECT on inventory/crate/disc_cache and nothing else.
UPDATE inventory -> permission denied. SELECT FROM customer -> permission denied. ONE grant
carries both the §7 sandbox and the §9 PII fence — which is why §7 said enforce it at the
credential, not in a code review.
- Write verbs absent: POST /reserve -> 501, POST /buy -> 501, GET either -> 404.
- Metadata only: no cover, no pixels on the wire; a mint shop's /stock is 404 (no POS to be live
about), not an empty crate.
THE FINDING F NEEDS BEFORE IT WRITES THE GATE — `gone[]` has no subject in production. The
mechanism is right; the data has no movement. Monster Robot Party's POS records 5,567 sales ever
(400-800/month Dec->Jun) but 26 in July and NONE SINCE 2026-07-01, and hasn't been written since
2026-07-09 — the 07-16 dump is fresh, its data is stale (restored it to check: crate 550 holds 122
on both 07-15 and 07-16, identical). 0 of the crate's 120 records have ever sold. So `gone` is []
against the real POS, permanently, until the shop trades again — and an assert over it would pass
WITHOUT TOUCHING ITS SUBJECT, the exact species that has held four tags. So: make-fixture --sold 3
clones the POS (createdb -T) and marks 3 of the crate's OWN REAL SKUS sold -> verified
{baked:120, live:117, gone:3}, the three ids absent from items[]. F points at it via
GODVERSE_POS_DB for a deterministic gate; production reads the real POS untouched. A fixture is
not a lie; a green assert over an absent subject is.
LIFECYCLE (ledger #3): stop is a SIGKILL, not a graceful drain — the gate tests a death, not a
goodbye. Verified: stop -> connection refused (curl rc=7) -> status DOWN -> start -> live. No
admin verb was added to the API: a server whose whole point is "no write verbs" shouldn't grow a
remote kill.
THREE CORRECTIONS TO MY OWN G3 §4 (design -> as-built), all measured not reasoned:
1. gone:[sku] -> gone:[id]. §4 AS I RATIFIED IT said bare skus — wording that predates R25's sku
ids and R26's fence law, and a bare number crossing two id spaces is the precise bug that law
exists to stop. My doc was the stale rule meeting a case written after it: the epoch's
signature failure, this time in the doc I wrote.
2. items[] drops release_id and cover — cover edges the API toward serving pixels; release_id is
the pressing, and tier 2 speaks only in copies.
3. Write verbs answer 501, not the 404 my own docstring claimed — caught by running it. 501 is the
STRONGER proof: 404 means a handler declined; 501 means no write handler exists in the process.
-> F: assert 501.
Scoped: pathspec commit. web/assets/towns/index.json is another lane's live edit — left untouched.
Runtime pidfile moved out of the repo (it is not an artifact).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
36d10ca4ae |
Lane G R26 (v5.0-beta): the mint baker, the crate menu, the atlas manifest (ledgers #2, #6)
EVERY CRATE DIFFERENT — measured: 15/15 keyed crates distinct, max shared titles between any two = 0. 14 mint atlases (5 record, 6 book, 3 toy) + Monster Robot's real crate + the manifest. MINT (ledger #2): the G3 note promoted — random.Random(shop_id) over an ID-ORDERED pool of real dealgod listings. The shop id IS the seed, so two shops can never draw the same crate. No TABLESAMPLE, no unseeded random: the two things that disqualified thriftgod's own mint() from tier 1 (G3 §2). Re-mint + re-bake is byte-identical. Only keyed shops whose type the loader can fetch get one (record/book/toy, C §7.1); the 13 keyed opshop/video shops get none and stay parody — an atlas there could never load, and the manifest is what makes that silent instead of a 404. MANIFEST (ledger #6, C §7.2d): stock_godverse/index.json — 15 shops, 1 real / 14 mint. Derived by reading the atlases back off disk, so it cannot drift from them: the manifest IS the directory. Real crate re-emitted with sourcing:"real" + C §7.2c's condition/sleeve_cond (my snapshot always carried them; I dropped them at emit — that was the hole in C's price card). Atlas bytes unmoved. THE ONE RED — mint ids vs E's SLOT_ID_PREFIX (E, one line). E asserts `sku_` on every atlas under stock_godverse/; mint items have no POS sku and carry `mint_<dealgod listing id>`, so all 14 fail. C §7.2a's RULE is satisfied — derive from the source's own stable key, never position, unique across ALL packs (measured: 344 ids, 0 clash with the generic packs, 0 positional). What §7.2a specifies as sku_<POS sku> it specifies "for a real-stock (godverse) pack"; mint is §7.2b's other thing, written a round later, and the id form was never revisited. I did not just emit `sku_` to go green: a POS sku and a dealgod listing id are DIFFERENT NAMESPACES, and this round's own standing note says no code or gate may compare a bare number across two id spaces — it exists because enterShop(31) entered the wrong shop. Putting both under `sku_` recreates that bug inside the economy: tier-2's sold-means-gone looks up POS skus, and sku_6031122 (a dealgod id) is indistinguishable by shape from a sku a POS must resolve. §7.2a's own reason #2 is exactly about ids being looked up across snapshots. Fix: make the prefix sourcing-aware (sku_ for real, mint_ for mint) — E's constant and error text are the only places. THREE MORE FINDINGS, none blocking: [E] FITS_1024=64 cannot be satisfied — 1024²/256² = 16 cells, so 64 items need 4 atlases and C caps a shop at 2; any 33–64 item pack MUST be 2048². Latent (my packs are 16→1×1024² and 120→2×2048²); the honest bound is 32. [C/F] the ≤32 MB ceiling doesn't hold at beta scale because the LRU it assumes hasn't shipped — F's boot preload loads EVERY keyed shop's pack, measured 46.1 MB/town resident; it's why mint crates are 16 items on one 1024² sheet. [C] "the crate menu, baked statically" can only be metadata: one base = one index = ≤2 atlases = 128 items, and Monster Robot has 357 crates / 24,646 records — so crate_menu ships the real crate list (labels + counts) and per-crate STOCK needs a per-crate base, i.e. a C contract line. MINT HONESTY: sourcing:"mint", an attribution that says "not this shop's stock", and NO POS-claim field at all — structural, not editorial. Records require a real Discogs artist (dealgod's `brand` on a record listing is the SELLER — the first bake had "Red Eye Records" as an artist; a shop is not an act) and use discogs_master_title where present, so Egg Records reads "MC5 — High Time $50", not "Pre Loved Record - Elton John - Breaking Hearts". Books/toys take `brand` per C's author/brand convention — sometimes the maker, sometimes the listing store. Real, imperfectly typed, and never claimed as that shop's. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
4314622c1b |
Lane G R25: sku-derived slot ids — the re-emit (ledger #3), index-only
Per C §7.2a: items[].id = "sku_<POS sku>" (e.g. sku_20260314070442), never positional. One line at the emit — the snapshot already carried the sku, I was dropping it. MEASURED: id overlap with the generic pack 0/120, was 120/120 (F's finding). 120/120 unique, all sku_-prefixed, none left in the generic packs' rec_ namespace. Id equality discriminates again — verified through the live loader, not just the file. Index-only as briefed: the two atlas .webp files are sha-identical (bytes did not move), no town cache touched, no goldens moved. uv, one-material-per-atlas batching, and shop-pack/town-pack coexistence (120/350) all still hold. C's reason #2 is the one that outlives the gate: position is not identity. Sell one record out of crate 550 and rec_0050 silently becomes a DIFFERENT record on the next bake — so a wallet purchase, a saved dig, or above all tier-2's sold-means-gone would point at the wrong item. The sku is the shop's own identity for that copy (release_id is the pressing; the sku is the copy). So the positional ids were a latent correctness bug in the ratified §7 economy, not only a vacuous gate. Fixed while there are two atlases to migrate instead of fifty. Conflict #1 closed: E's R25 validator prints "LICENCE: ... FLAG BEFORE ANY PUBLIC/COMMERCIAL RELEASE" against the top-level US `license` and counts it — atlas-QA OK, 1 licence line shown, 0 warnings. The flag guarding real product photos is unmissable. Nothing owed either way. Scoped: committed by pathspec on main (G's first as a full lane). F's six staged files and E's in-flight validate_atlas.py left exactly as their sessions have them. -> F (your file, your call, not touched mid-flight): interior_mode.js:378's comment now reads false — ids are no longer positional and no longer collide (0/120). Your gate stays canonical regardless: a texture URL proves which file the GPU sampled, which id equality never could. Only the rationale is stale; id equality is now available as a second discriminator if you want it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
0608f9c8c1 |
Lane G R24: G3 §7 RATIFIED — John's write-back ruling, A then B (charter law #4 satisfied)
John ruled at the R24 kickoff: v5.0 ships on Option A (sandbox) — an in-game purchase never touches real monsterrobot/Square inventory; Option B (reservation via the POS's existing hold_expires_at) is CHARTERED as a v5.x upgrade behind a hold budget John sets; Option C is not chartered and happens only as a deliberate business launch, if ever. Recorded inline in §7 with the options preserved beneath it, since the trade-offs are the record of why A-then-B was chosen. Written in as binding, because a one-line ruling isn't a mechanism: /reserve + /buy stay ABSENT, not stubbed behind a flag (a sandbox a config typo can flip isn't a sandbox); the tier-2 reader connects read-only, enforced at the credential — a role with SELECT on inventory/crate/disc_cache and nothing else, which carries the §9 PII fence in the same grant; and the gate asserts the write verbs 404 and the role's grants are read-only, because "we didn't call buy()" proves nothing — the vacuous-gate law turned on ourselves. Option B's preconditions are stated so it can't slide in quietly: the hold budget (John's number, NOT YET SET — B is not startable until it is; a v5.x item, not a v5.0 blocker), the-shop-always- wins on a race with an in-store Square sale, a staff-visible `held: GODVERSE` reason code, and soak before ship. Doc header/§10 updated so the whole file tells one story: §7 ruled, the rest still DESIGN pending both Fables' sign-off, no server code before that. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
86e298531e |
Lane G R24 (v5.0-alpha): the crate's real street — redhill_godverse, the keyed re-emit, and two contract conflicts
THE SHOP HAS A STREET. redhill_godverse: Monster Robot Party seated on Musgrave Road (verified — lot 8, type record, godverseShopId 3962749), 37 shops on E's 884 real Red Hill roads. Its coordinate is John-supplied (Google Maps place /g/11g6rlbbc0 -> -27.4553791, 153.0076244) because it is derivable from nothing we hold: OSM doesn't know the shop, the census doesn't either, dealgod's stores/store_entity rows are NULL lat/lng, recordgod has no address. Verified inside E's bbox and on Musgrave Road's own geometry; my own estimate was ~120 m out. RE-EMIT (ledger #5 + #2): atlas keyed by godverseShopId with US `license` throughout (British retired, 0 occurrences) — atlas-QA OK, 120 real records, byte-identical re-bake (the .webp bytes did not move; only the index). newtown_godverse re-emitted with ids (18 keyed). godverse_town.py: psycopg2 -> psql, EXTRA_SHOPS roster, and Fable's R22 Ruling 2 finally implemented. RULING 2 WAS LOAD-BEARING, NOT COSMETIC (measured): census-only Red Hill is unshippable — 9 shops = 306 m spacing warn; +Monster Robot = 10 shops = 261 m warn AND a frontage poster seated INSIDE edge 1037's kerb (-2.95 m); + the donor's texture layer (37) = no warn, poster passes. 261 m is worse than the 255 m that retired ballarat this round: the alpha's headline town would have shipped flagged "scattered, not a high street, or retire the town". 9 donor heroes swapped for census entries (18 in Newtown), counted per the ruling. CONFLICT #1 — C §7.3 vs E's validator. C says lift provenance to TOP LEVEL, US `license`, British retired, "exactly what E's validator reads". Measured: it is not. validate_atlas.py:98 reads NESTED `provenance`; :105 reads `licence` British-first. Lifting-and-retiring as written FAILS the gate; my R23 atlas already passed it untouched. Same species as the bug that held the tag — a doc asserting what code does without running it. Resolved: E's check accepts `licence or license`, so US-nested passes; the four also ride at top level (C's contract + the town-cache convention) off one source of truth. -> E, one line: :198 PRINTS `licence` British-only while the check accepts both, so C's mandated US spelling silently stops printing the licence flag — which :199's own comment calls a human call. Gate passes; evidence line vanished. Fix: .get("licence") or .get("license"). CONFLICT #2 — Ruling 2 vs A's identity gate. NEEDS A RULING; it is why the tree is red (6 of 8). Ruling 2 makes a godverse cache mixed: a keyed GODVERSE layer + an inherited OSM texture layer. A's sweep asserts EVERY shop is keyed -> partial FAILs. Texture shops carry no godverseShopId deliberately: an OSM milkbar has no GODVERSE identity, and minting one from its OSM id pushes a third id space into a field that already carries two — A's validator calls a duplicate mis-stocking, charter risk #3's nightmare with Monster Robot's crate as the prize. And A's own two checks disagree: the validator says "Missing = tier 0 (soft). Duplicate = mis-stocked (hard). They are not the same failure", while the sweep fails partial keying because it "mis-stocks the rest" — conflating exactly those two. Proposed (A's call, Fable's ruling): assert coverage over the godverse layer, not the inherited texture layer. THE 8 RED CHECKS, ITEMISED: newtown_godverse base+gig goldens (2) moved by the re-emit exactly as ledger #2 intends — A re-pins, base 0xcf69b387 gig 0x1e266f60; godverse identity x3 per godverse town (6) = conflict #2. Nothing else. Classic covenant 0x3fa36874 intact. redhill_godverse pins: base 0xb2224939. Verified live: the shop's 120-record pack and the town-wide 350 pack now COEXIST through C's type+base fix. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
84f3641791 |
Lane G R23 (v5.0-alpha): THE FIRST REAL CRATE — 120 real records from a real crate + the G3 draft
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> |
||
|
|
223fbcaf72 |
Lane G (GODVERSE, ultra) R1: real-shop census adapter — 18 real Newtown shops on the real road graph
godverse_town.py marries a donor OSM cache's roads[] with thriftgod's DealGod-scraped shop census (2,928 real AU secondhand shops) -> <town>_godverse.json, schema v2 unchanged. First artifact newtown_godverse boots clean (?plansrc=osm&town=newtown_godverse). Lane brief + asks (Draco ruling, per-town bookmarks, enterShop selector) in docs/LANES/LANE_G_GODVERSE.md + G-progress.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |