# PROCITY — Round 14 lane instructions (from Fable, integrator) Date: 2026-07-16 · **v3.0-beta shipped** (the district, `?gigs=1`, tag local; qa `--strict` 6/6, 0 warn — the queue assert went live after D landed). Seed 20261990 = Boolarra Heads: 3 venues, 14 gigs/week, tonight Screaming Utes @ The Exchange Hotel $10 + The Dead Ringers @ the RSL free. Round 14 is **v3.0: THE RELEASE** — identity continuity into the crowd (the one remaining charter promise), the money-shot tour, the soaks, docs freeze, and the `v3.0` tag. **No new systems this round** — if it isn't continuity, hardening, or documentation, it's v3.1. ## First: the R13 debt ledger (all owned this round) R13 closed its six debts cleanly (gigKey contract landed everywhere, instruments wired, drummer seated, RY convention fixed **at the source** — D's `buildFigure` normalisation also silently fixed keepers/browsers/walkers that had been back-to-front whenever the GLB fleet loaded; good catch, C+D). What carries: 1. **Alpha alias retirement (B → F, ordered).** F kept the R12 single-venue `window.PROCITY.gigs` shape (`.state/.on/.venueShopId/.cover/.paid`) as a one-round compat alias; that round is over. **B first** removes its fallback readers (`audio.js` alias→clock chain, `venue.update()` bare-string arm — keep the clock fallback, drop the alias hop), **then F** deletes the alias so `byVenue` + the per-venue accessors are the only surface. CITY_SPEC §v3 runtime block loses the alias line in the same commit (F). 2. **Drummer sit hack (D).** The 4th member is a standing rig sunk `SEAT_DROP` behind the kit — reads seated only from the front. `~/Documents/mixamo-fetch/out/` holds **34 clips incl. `sit`** (LANE_D_NOTES wishlist #1 — **check what exists first, never re-download**). Wire the real clip, retire `SEAT_DROP` + the `m.seated` branch. 3. **Town-wide streetlamp pools (B) — RULING: stays venue-scoped for v3.0.** Town-wide needs always-on `furniture.js` changes and that fights flags-off parity in release week. Venue blocks read fine (F's `venue_night` shot proves it). Document as a v3.1 candidate in LANE_B_NOTES; no code. 4. **Poster repetition (B judges, E executes).** B: during the tour audit, eyeball the spine poster runs — if the per-gig instanced skins read repetitive, ask E for 1–2 more templates. E: build only on B's ask (R13 law, unchanged). Closed for good, for the record: depot publish (John OK'd mid-R13; Gate-3 provenance flag cleared, `digalot.fyi` serves the 14k instruments + `_hi` originals). ## Laws for the round (unchanged, plus release discipline) - **Prime flag law holds through the tag**: `?gigs=1` stays **opt-in for v3.0** (Fable's default — John may overrule, see Standing #2). Flags-off boot byte-identical, synthetic golden `0x3fa36874`, gig golden `0x1f636349` — **neither moves this round**. Any diff that would move a golden is out of scope by definition; park it. - Deterministic from citySeed · asset-free (`?noassets=1&gigs=1` silent-and-fine) · audio law (gesture-gated, fail-soft) · budgets: gig-night interior ≤350, street ≤300 draws / 200k tris at the busiest venue block · human-sized line on every humanoid shot · **fresh browser contexts** (the stale-module trap bit B in R13 — `cache:'reload'` + hard nav, or the no-store server). - **Shared-tree discipline**: commit atomically by explicit pathspec; lanes land concurrently. - **Release-round law: no new rng draws on any seeded stream.** Continuity work must ride new sub-streams or consume existing identities — if two runs of R13 code and R14 code disagree on any golden or any R13 smoke, the change is wrong. ## Lane D — identity continuity: the ped you followed is in the crowd (the headline) The last charter promise, deferred at R12 and R13 ("opportunistic, not now"). Now. 1. **Continuity contract.** The sim already knows who enters a venue (queue `admitOne()` drains + surge occupants). Record a per-venue **tonight roster** of entered identities ({pedIndex, height, …whatever pins "the same person"}), and have `GigCrew.spawn` consume it: crowd slots fill from the roster first, seeded strangers only for the remainder. Design is yours; the acceptance is behavioural: **follow a punter from the queue through the door, walk in behind them, and find them in the crowd — same ped, same height.** Works across exit/re-enter (roster persists for the night, not per interior build). 2. **Determinism**: the roster is a consequence of seeded sim behaviour; interior crowd identity for a given (seed, night, entry time-segment) must be stable enough for F's smoke — expose `window.PROCITY.citizens.tonightRoster(venueShopId) → [{pedIndex, …}]` (or your preferred name — tell F) so the smoke can assert crowd ⊇ roster ∩ cap without screenshot forensics. 3. **The sit clip** (debt #2 above). Data task, not rig work — clips bind through the canonical `mixamorig` skeleton like walk/idle. 4. **Sim soak**: 30+ min equivalent (accelerated segments fine) with gigs on — full week roll, repeated surge/drain/queue cycles at all venues; assert leak geo0/tex0, roster bounded, no identity churn. Numbers in your notes. Budget note: continuity is bookkeeping, not new rigs — draw/tri delta should be ~0; state it. ## Lane B — alias retirement + the tour audit 1. **Drop the alias readers** (debt #1 — you go first, tell F when landed). 2. **Bookmark/tour audit**: every bookmark (16 v2 + `venue_night` + `district_posters`) still frames un-letterboxed, 0 errors, with `?gigs=1` on — the district changed the streetscape under some of the old poses. Fix poses, don't touch world code. 3. **`queue_night` bookmark** — John's queue shot: close framing on the pub door at `doors`/`on`, queue line + marquee + poster in frame, punters facing the door. This is the release hero shot; F scripts it into the tour. 4. **Poster repetition call** (debt #4): judge, and either "fine" in your notes or a one-line ask to E. ## Lane C — venue audit + docs freeze (light round, by design) 1. **Interior release audit**: one pass over the three venue archetypes against CITY_SPEC §v3 + LANE_C_PUB — watchPoint caps, stage/riser numbers, gigKey resolution, quiet-night variants — and re-run your 60-room soak + drawSweep against D's continuity changes (crowd identities change; geometry must not). Fix only regressions. 2. **`guitar_amp` placement ruling** (R13 left it "C's call"): D planted it as stage dressing — bless the placement or give D the corrected pose; one line in LANE_C_PUB either way. 3. **Docs freeze**: LANE_C_PUB.md + LANE_C_AUDIO.md are the durable contracts — final wording pass, mark them v3.0-frozen. ## Lane E — provenance close-out (light round, by design) 1. **`publish.py --verify` drift check** against the live depot post-R13-publish; qa Gate 3 must be green with zero flags for the tag. 2. **Poster templates** only on B's ask (debt #4). 3. **Docs freeze**: provenance table + audio/GLB inventories in LANE_E_NOTES current and v3.0-frozen. No new synthesis this round unless John re-flavours a genre (Standing #3, R13 — still open, still names-only). ## Lane A — invariant sweep + CITY_SPEC freeze 1. **District seed sweep**: 400-seed run asserting the district invariants — 2–4 venues, ≥1 pub, never the openLate shop, no band twice in one night town-wide, every poster behind `poleOffset`, per-venue 4–6 nights — plus **one osm town** proving graceful placement (no spine/warehouse district). Promote any invariant not already in `selfcheck.js` into it. 2. **CITY_SPEC v3 freeze**: you own the spec — final pass over §v3 (venues table, genre map, gigKey contract, gig golden `0x1f636349`, F's runtime block minus the retired alias), then mark the section frozen for the tag. Coordinate the alias-line deletion with F (debt #1). ## Lane F — soaks, the tour, the tag (last) 1. **Delete the alpha alias** once B lands (debt #1) + the CITY_SPEC line (with A). 2. **Continuity smoke**: extend `smoke_gigs` — queue identities admitted at `doors` appear in the interior crowd via D's roster seam (assert on the seam, not pixels); crowd ⊇ roster ∩ cap; determinism arm re-run. 3. **Full-week soak**: drive the segment spine through all 7 nights × all venues in one context — every latch fires per `plan.gigs` schedule (dark nights stay quiet), covers stamp per venue per night, walla/applause never double-fire, leak geo0/tex0 across ≥20 enter/exit cycles. Wire it into qa as a non-strict extra (strict stays the 6 gates). 4. **The money-shot tour**: `tools/qa/tour_shots.py` — scripted capture of the release set in one deterministic run: `rain_verandah` (winmap+rain hero) · `tram_stop` · `venue_night` · `district_posters` · **`queue_night` (John's shot)** · gig interior (4-piece + instruments + crowd). Contact sheet into `docs/shots/release_v3/`. 5. **Docs assembly**: README v3 section (what shipped, the flags table, the shots), confirm every lane's freeze landed, LANE_F_NOTES §14 runbook. 6. **Acceptance + tag**: `qa.sh --strict` 6/6 + continuity smoke + week soak green → tag **v3.0**. Tag and push are separate commands; the push itself waits on John (Standing #1). ## Order **B first** (alias readers out — F is blocked on it for the deletion) and **D first** (continuity — F's smoke and the tour hang off the roster seam); they're disjoint files, run in parallel. A, C, E anytime, independent. **F last**, as always. Mid-round handshakes: B→F "readers gone", D→F the roster accessor name, C→D the amp ruling. ## Standing - **v3.1 preview (do not start):** flag-default flip (if John rules it), town-wide lamp pools, tram-gig composition (ride to the gig), wind sway, bench-sit loiter from the same `sit` clip. - **John — three items:** 1. **The push.** The R13 epoch (7 commits + `v3.0-beta`) and everything R14 lands are **local only**. F is ready to `git push origin main` + tags on your word — it's the one outward-facing step every lane held. 2. **Flag default at v3.0**: Fable's call is `?gigs=1` stays **opt-in** for the tag (prime-flag discipline through release; flip considered at v3.1 after the soak bakes). Overrule if you want the district on by default at v3.0 — that becomes an F task with a full golden re-pin, and it goes FIRST in the round, not last. 3. **Genre re-flavour** (carried from R13, names-only, A+E coordinated): defaults pubrock/grunge/covers stand unless you say otherwise — last call before the docs freeze.