diff --git a/README.md b/README.md index 53ec7fe..707aca5 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,32 @@ cd web && python3 -m http.server 8130 # http://localhost:8130/map.html (2D plan debugger — Lane A) ``` +## The manual — how to play (private test) + +Click **START** to lock the mouse. Then: + +| input | does | +|---|---| +| **W A S D** + mouse | walk / look (first person) | +| walk into a shop door | enter the interior (open shops only — check the hours tooltip) | +| **E** (inside a shop) | open the crate at a record bin — then it's cursor-driven: click sleeves to riffle, click BUY | +| click a book spine / toy box | pull-and-buy card (real price stickers in godverse shops) | +| walk out the door / **Esc** | leave the shop (Esc also frees the mouse anywhere) | +| **M** | 2D town map (street only) | +| **[** / **]** | step time of day back / forward · **T** pauses the clock | +| **P** | capture screenshots (street) | +| HUD dropdown (top-left) | switch towns — synthetic, fixtures, 23 real AU towns, godverse | + +Worth trying: `?classic=1` (the original v2 town, byte-identical forever) · `?noassets=1` +(zero-network boot) · `?stock=real` in a godverse town (Monster Robot Party's actual crate) · +`?seed=` (any number = a different town). Night is when the gigs happen — step time with `]`. + ## Read first - **`docs/CITY_SPEC.md`** — the treaty: schema, units, seeds, budgets, file ownership. +- **`docs/V7_THE_GAME.md`** — the CURRENT epoch (ratified): persistence, the collection, the + gem thrill. `docs/V6_LIVING_STREET.md` runs in parallel (mocap NPCs, footpaths, cars). +- **`docs/THE_FRONTIER.md`** — the honest map of what is not figured out yet. - **`docs/RESEARCH.md`** — what the parent repos already solved, with exact paths to port from. ## The lanes (parallel Opus 4.8 sessions) diff --git a/docs/LANES/ROUND30_INSTRUCTIONS.md b/docs/LANES/ROUND30_INSTRUCTIONS.md new file mode 100644 index 0000000..25840fd --- /dev/null +++ b/docs/LANES/ROUND30_INSTRUCTIONS.md @@ -0,0 +1,84 @@ +# PROCITY — Round 30 lane instructions (from Fable, integrator) + +Date: 2026-07-17 · **V7 THE GAME is RATIFIED** ([docs/V7_THE_GAME.md](../V7_THE_GAME.md) — +read it first, it is the epoch's truth). Round 30 opens **v7.0-alpha: THE SAVE AND THE CRATE** +— wave 1 of the smallest set that makes one town play as a complete small game. *(Housekeeping: +the phantom R30 that two lanes were spun up for never had a brief — that was Fable's miss, now +fixed. If your session finds prior R30 work anywhere, it doesn't exist; this document is R30.)* + +## The ledger (v7.0-alpha wave 1) + +1. **THE SAVE CORE (F — the foundation everything consumes; publish the contract FIRST).** + - `web/js/world/save.js` (F-owned): versioned localStorage save implementing **the delta + law** — cash · owned items (each = `{townKey, godverseShopId|shopId, sku|slotId, pricePaid, + dayFound}` — the sku IS the identity, per the R25/26 fences) · current town · **day + number** · schema `procity-save/1`. Save on SLEEP (see #3) and on `beforeunload`; + export/import as JSON (John moves machines). + - **The published contract** (`window.PROCITY.game`): `{ day, cash, collection[], save(), + load(), sleep(), export(), import(json) }` — B builds UI on this, C reads it at the + counter. Publish the shape in LANE_F_NOTES §30 in your FIRST commit, implementation after. + - **Laws wired from birth:** `?classic=1` → NO save layer constructed, zero localStorage + touches (the covenant stays a pure v2 boot); `?game=0` opt-out; a corrupted/foreign save + → rejected loudly, fresh start, the town NEVER breaks (delta law: world state is not in + the save, so it can't). +2. **THE SELL COUNTER CONTRACT (C — publish first, implement second).** Walk to a keeper's + counter with items → a sell card (mirror of the buy card): item, offer price, SELL. + **Offer = below the buy-side band, structurally** (the no-pump law — C picks the multiplier, + documents it in LANE_C_PUB §9). v7.0-alpha sells at any shop of the item's type (record + shop buys records); the fancy stuff (per-keeper taste, haggling) is beta+. C consumes + `PROCITY.game.collection` read-only; the debit/credit goes through the wallet exactly like + buying (the proven seam). +3. **SLEEP = SAVE = TOMORROW (F + B).** v7.0-alpha's day-advance: the HUD gains a SLEEP action + (B's surface; enabled any time for the alpha — home-base gating is beta) → `game.sleep()`: + save, `day+1`, **stock rotation** (the parody/mint pick streams re-seed as + `rng(citySeed, shopId, 'stock', day)` — F threads `day` into the existing stock seeding; + REAL stock never rotates, it's real), gig night = `day % 7` (plugs into the existing week + schedule), wake at dawn (segment 0). +4. **THE COLLECTION UI (B — after F's contract lands).** A collection panel in hud.js (your + selector/HUD patterns): cover thumb, title/artist, price paid, where + day found; count in + the standing HUD; the SLEEP button + day/cash readout. Money-shot-grade is beta; readable + and correct is alpha. +5. **THE GATES (F, last).** + - **Save/load determinism:** play a scripted session (buy 2, sell 1, sleep 2×) → export → + fresh boot → import → assert byte-equal game state AND the world untouched (fingerprint + unchanged — the delta law's falsifiable form). + - **The no-pump gate v0:** script buy-then-immediately-sell N times → assert monotonic cash + LOSS (the spread is the house's). The full adversarial playtest-bot is beta. + - **Classic purity:** `?classic=1` → zero localStorage reads/writes (measure, don't trust), + no HUD additions, fingerprint frozen. + - **Rotation determinism:** same seed, same day → byte-identical shop stock; day N ≠ day + N+1 (actually different, not just asserted different). + - `qa.sh --strict --matrix` green throughout. **No tag** — the alpha tags when it plays + (likely R31, after the loop closes end-to-end). +6. **A — the rotation boundary verify (small).** F threads `day` into stock seeding — A + verifies it rides RUNTIME streams only: plan generation never sees `day`, all goldens + frozen, selfcheck proves it. One note, one line. **D, E, G — rest** (E's guide-band bake + and G's GodBay open in beta; D's rumors likewise. If footage lands in the MOCAPGOD queue + meanwhile, v6's Spike 2 takes priority for E/D — the epochs interleave, Fable sequences). + +## Laws + +The charter's five (delta · no-pump · game-money · classic-pure · seeded-rotation) + everything +inherited. No goldens move this round (rotation is runtime; A verifies the boundary). The +vacuous-gate law applies to every new gate above — each names its subject and proves it touched +it. + +## THE EXACT RUN ORDER + +1. **Start together: F (save core — contract in first commit) + C (sell contract first, + implementation second).** +2. **When F's contract is published: B (collection UI + SLEEP surface).** F continues + (sleep/rotation threading) in parallel — disjoint files. +3. **When F + B + C are in: F gates (#5), A verifies the boundary (#6).** +4. Fable reviews; R31 charters the rest of the alpha (or its close, if it plays). + +Waves: **[F, C] → [B, F-cont] → [F-gate, A]**. D/E/G rest unless footage arrives. + +## Standing + +- **John — nothing blocks this round.** The deploy to digalot.fyi/procity still waits on your + VPS-access pick (grant me the ssh rule / run the script yourself) — worth doing THIS round: + testing the save loop in a real browser on the real URL is exactly the alpha's acceptance + environment. And the MOCAPGOD queue still wants your footage whenever. +- **The drive question stands:** say "run it" and Fable spawns these lanes as subagents in the + wave order above, reviews between waves, and reports once at the end. diff --git a/docs/V7_THE_GAME.md b/docs/V7_THE_GAME.md index f49e70d..11899ff 100644 --- a/docs/V7_THE_GAME.md +++ b/docs/V7_THE_GAME.md @@ -1,4 +1,6 @@ -# PROCITY v7 — THE GAME (epoch charter — DRAFT for John) +# PROCITY v7 — THE GAME (epoch charter — **RATIFIED by John, 2026-07-17**) + +*(Ratified as drafted; the fantasy stands. R30 opens the epoch — v7.0-alpha wave 1.)* *Fable (m3), 2026-07-17. From THE_FRONTIER's headline gap: the world is built, the game isn't. v7 is the smallest set of systems that makes a stranger play twice. Design principle: every