PROCITY/docs/LANES/ROUND30_INSTRUCTIONS.md
2026-07-18 11:27:03 +10:00

85 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.