6960bdd279
4 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
6960bdd279 |
Lane C R27 (v5.0): the tier-2 seam ruling + LANE_C_PUB v5-FROZEN (ledgers #2, #6)
SEAM RULING (§8): bless the direct wire — NO lifecycle hook. F already holds currentAdapter (interior_mode.js:67) and passes it to dig.open() PER DIG (:111), so the live read lands, F updates the pack, the next riffle picks it up; not-landed/slow/dead => the adapter is simply the tier-1 pack => the dig never blocks (charter risk #1). No C lifecycle change. BUT THE QUESTION UNDERNEATH IT IS C'S, AND THE OBVIOUS WIRING IS WRONG. pickRealOffers indexes pack.items[(rr()*len)|0], so FILTERING THE ARRAY RESHUFFLES THE CRATE. Measured, 5 crates: one record selling changed 21 OTHER records (6/2/2/6/5 collateral). Pick-then-omit (draw from the stable full list, drop gone after) = 0 collateral: a crate with 3 sold shows 13, not a different 16. Selling one record must remove one record, not re-stock the shop. THE TRAP: both forms hide the sold record — so F's planned assertion ("a real gone item never renders") GOES GREEN ON THE WRONG WIRING. It cannot see the 21. -> F: assert on COLLATERAL (the survivors are unchanged across a gone delta), not absence. Vacuous-gate law, third application, and the cheapest to miss because it passes. LANDED (dig.js): pack.gone (Set|array) omitted at PICK time. F's invariant published: update item FIELDS in place (live price) freely; NEVER add/remove/reorder items[] — that identity+order IS the seeded pick's stability (R25's positional-id lesson, one layer up). DETERMINISM BOUNDARY sits exactly here: server down => byte-identical tier 1 (gate-able); server up => the crate legitimately changes (tier 2 is non-deterministic BY DESIGN), so no gate may assert dig determinism with the server up, and pack.gone never enters a seeded stream or golden. SCOPED: the bin fan is decorative (a different seeded pick from the dig's offers) — a sold cover may linger there until rebuild. That's when I'd publish a post-build hook; the epoch's claim doesn't need it, because the crate you RIFFLE is true. VERIFIED: pure-function measurement for the collateral claim, then end-to-end through the real dig's public surface (pull -> Esc -> scroll -> pull): sold record gone, survivors 4/4, collateral 0, items[] untouched at 120, live in-place price shows on the next pull. (My first harness returned the same title 4x — I never un-pulled — so its number was an artifact; re-ran it properly rather than report a metric I'd just watched lie.) DOCS FREEZE (§6): LANE_C_PUB is v5.0-FROZEN, whole document, with the case law at the top: three amendments here exist because a rule of mine met a case written AFTER it, and both times the lane building to my rule took the red. Header now states it: when a line meets a case it didn't foresee, the line is the stale thing — amend it, don't bend the case. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
4f0adf12d8 |
Lane C R26 (v5.0-beta): three contract lines + the dig price sticker (ledgers #1, #4, #6)
Wave 1 — contract lines published first; G and E build to them. #1 THE BRIEF SAID `tier`. IT CAN'T BE (§7.2b). G's atlases already emit tier: 1 = the CHARTER'S LADDER RUNG (0 parody / 1 static-real / 2 live), and `kind` is already the stock type. A mint atlas is ALSO rung 1 — same mechanism (a statically baked per-shop atlas); only the data's origin differs. Real-vs-mint is an orthogonal axis, not a rung — overloading `tier` puts two meanings in one name, the same species as the plan-id/godverse-id collision just standing-noted, and as R25's positional ids. RULING: top-level `sourcing: "real"|"mint"`, REQUIRED; `tier` stays the numeric rung. A mint index MUST NOT carry POS-snapshot fields (the separation is the honesty). Gates read `sourcing`; absent => FAIL. #4 `condition` ISN'T IN THE INDEX (§7.2c) — the ledger assumed it was. The index carries artist/title/price/price_band; G's SNAPSHOT has condition + sleeve_cond and drops them at emit, so pickRealOffers mapped cond:'' and the card rendered dangling separators around a hole. That WAS the "database row". Ruled optional index fields, emitted when the source has them; no invented grades on mint items (a plausible-but-fictional grade is what `sourcing` exists to prevent). #6 THE ATLAS MANIFEST (§7.2d): stock_godverse/index.json is the authority for which shops carry atlases — no entry => no fetch => zero 404s, so the zero-console-errors law holds with no attribution exception. Shape + both-ways consistency specified. No manifest + no atlases = a legitimate silent zero-shop state, not an error. THE PRICE STICKER (code): the pull panel is now the shop's price sticker — manila card, rotation + shadow, typewriter caps, italic title, a stamped condition grade, and the round yellow $ sticker the sleeve art already uses (the panel echoes dig.js's own canvas language instead of fighting it). Fields compose only when present: a missing field never leaves a stray separator. VERIFIED (fresh context, 5 card shapes, both star branches): real grail VG+/VG + ★GRAIL; real standard VG+ + STANDARD; real ungraded COLLECTOR (grade omitted cleanly); parody NM + 1973 PUNK; parody rare (seed 4) VG + 1973 POP + ★RARE. No dangling separators anywhere. The verification caught a defect in MY OWN card: a real grail read "GRAIL ★ GRAIL" — `s` carried the price_band AND `rare` derived from that same band (parody is immune: its `s` is a genre). Fixed at the mapping. And I didn't leave the parody-rare branch on assumption — scanned seeds until a rare pull appeared and asserted it says RARE, not GRAIL. An unexercised branch is an unproven one. Budgets: the card is DOM — zero draws, zero tris, no 3D change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
3724a65505 |
Lane C R7 C1: ?stock=real — real GODVERSE sleeves in the crates
The stockAdapter seam built in v1 finally eats. Lane E's stock pack (parody-
transformed Discogs metadata + cover atlas) feeds record-shop bins + the dig
riffle behind ?stock=real. Economy stays a stub (buying = toast).
- Contract handshake (task 1, unblocked E): confirmed E's index schema as-is
in LANE_C_NOTES (items[{id,title,artist,price,price_band,atlas,uv}]; uv
origin top-left, C flips V for WebGL; fail-soft; per-type packs).
- stockpack.js (new): preloadStockPack/getStockPack (cached) + makeStockAdapter.
Atlas texture + material are shared/cached (like depot GLBs); each sleeve is
a cover PLANE sampling the atlas at its baked UV, so all real sleeves in a
room batch to ONE draw (record: 59 draws).
- stock.js binFan: real cover planes (else parody canvas). dig.js: riffles real
covers, pull card shows title/artist/$price/band. interiors.js: opts.stock=
'real' wires the adapter (warn-once + parody fallback if pack absent). Test
page reads ?stock=real, preloads record/book/toy, passes the adapter to the dig.
Validated (E's staged 24-sample; real covers drop in unchanged when E gets the
DB): determinism 0/30, leak-free rooms + real dig (0/0 over 25 cycles), draws
<=139 all rooms (record 59), fail-soft on no-pack types, ?dig=1&stock=real
leak-free. Flag-off + ?noassets untouched (procedural path byte-identical).
qa.sh --strict GREEN. F smoke hook + E contract in LANE_C_NOTES. Shot
docs/shots/laneC/stock_real_r7.jpg.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
7131f530a4 |
Lane C R5 C2: crate-riffle dig behind ?dig=1 (v2)
Ported 90sDJsim/web/world/dig.js → web/js/interiors/dig.js. Walk to a record bin, press E, riffle its sleeves (scroll/drag), click the front sleeve to pull it, BUY IT. Faithful to the source: hinge-forward riffle, pull-and-inspect panel, procedural fwip/thunk audio. - Riffle items = seeded procedural sleeves per bin via the stockAdapter(shop, 'sleeve') seam (parody 90s-AU records now; real GODVERSE records feed the same seam in round 6+). Same bin ⇒ same order. - Buy is STUBBED (toast + remove-from-bin; getCash returns a constant) — economy is round 6+ per integrator decision #1. - Own scene + camera; leak-free: per-open GPU resources (sleeve textures/ materials, crate parts) freed on every close(), persistent set freed on dispose(). Dig soak (20× enter/leave) → leakGeo 0 / leakTex 0. - Flag-gated (?dig=1): buildInterior is UNTOUCHED, so ?dig=0 boot is byte-identical to v1 (prime law). The dig is wired only in the test page via an E-key raycast; F owns the shell input/mode seam — hook documented in docs/LANES/LANE_C_NOTES.md. Verified: riffle + pull + buy-stub work; dig soak leak-free; placement determinism unaffected; close returns to the interior. qa.sh --strict GREEN. Shot: docs/shots/laneC/dig_riffle_r5.jpg. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |