# PROCITY — Round 15 lane instructions (from Fable, integrator) Date: 2026-07-16 · **Round-14 verdict: A–E landed and green; LANE F NEVER RAN.** The R14 release round produced excellent hardening from five lanes — D's continuity seam (8/8 surge + 4/4 queue identities, empty-roster byte-identical), B's alias-reader retirement + 19-bookmark tour audit + `queue_night` hero pose, A's 400-seed invariant sweep + §v3 freeze, C's adversarial venue audit (which caught a real amp defect), E's provenance freeze (Gate 3 green, 0 blockers) — **but v3.0 is NOT tagged.** F's whole release brief (continuity wiring, alias deletion, week soak, the tour, the tag) is untouched, and the round surfaced one live bug and one cosmetic defect that gate the money shots. **Round 15 closes the release.** F carries its R14 brief in full; A and D each land one small fix; B and C verify; E is on-call only. Nothing else — the freeze holds. ## The ledger (everything between here and the tag) 1. **Frontage posters are on the BACK WALL (A — live bug, gates John's hero shot).** `gigs.js:205` seats each playing venue's own-frontage poster at local **−Z** ("house convention"), but B's buildings canon puts the street facade on **+Z** — B measured the pub's poster 15.9 m behind the street face. Every venue's own poster has been invisible from the street since R13, and `queue_night` frames no poster because of it. Fix: flip item 1 of `buildPosters` to `+sin,+cos`. This moves `plan.posters` → **the gig golden moves — this is the round's ONE sanctioned golden move** (amendment law: re-pin `0x1f636349 → new` in the same commit, and amend the §v3 FROZEN marker's golden line in that commit too — the freeze allows exactly this, a recorded amendment). 2. **Alias deletion (F — B unblocked you, with a map).** B's sweep: cross-lane CLEAN — no A/C/D/E file reads the scalar alias; the only remaining readers are F's own ~20 tool lines. Delete `gig_state.js:141–151`, migrate `tools/flags_check.py` + `tools/qa/gig_shot.py` (`.venueShopId → venueShopIds[0]`/explicit id · `.state → stateOf(id)` · `.cover → coverOf(id)` · `.bandName → bandNameOf(id)`), and delete the two CITY_SPEC §v3 alias sentences (~lines 271–272 — A deliberately left them for you to avoid a doc-ahead-of-code race). While in that spec block, add the omitted **`nightOf(id)`** to the accessor list (A's note). One atomic commit. 3. **Continuity wiring + smoke (F — D handed you three touches).** `crew.spawn(…, { roster: citizens.tonightRoster(shop.id) })` at `interior_mode.js:239`; `onAdmit: id => citizens.recordVenueEntry(venueShopId, id)` in the shell's per-venue queue loop (`index.html` ~380–393); the clear is automatic on your existing `setGig(id,false)`. Smoke: assert **crowd ⊇ roster ∩ cap** on the seam (`crew.crewInfo.fromRoster`, `member.pedIndex ∈ tonightRoster(id)`), not pixels; re-run the determinism arm (empty roster must stay byte-identical to R13). 4. **`guitar_amp` reposition (D — C's ruling, not blessed as-is).** Your backline plant is 0.29 m from the bassist (interpenetrates; confirmed by render + three audit agents) and redundant with C's primitive ampStacks. Move to C's corrected pose (LANE_C_PUB §3): up-stage-right `(stage.x + stage.w·0.36, deckY, stage.z − stage.d·0.22)`. One-liner in `band.js _addBackline`; C verifies. (Full `stage.backline[]` unification stays v3.1.) 5. **Settled-tris honesty (F).** C caught that your gig smoke measures **before** the async instrument GLBs land: reported ~34k, settled reality ~182k tris (5×14k instruments + rigs). The interior gate is draws (passes at ≤71) so no violation — but measure **settled** (wait for fleet + instruments, or shoot-twice) in the smoke and the tour, and report both numbers in your notes. Same discipline for tour shots generally (B: orphan-chunk inflation — shoot from a clean load or twice). 6. **Drummer sit clip — deferral RATIFIED (v3.1).** D investigated properly: the clip exists (on the tailnet source box — Fable's `~/Documents/mixamo-fetch` path was stale), converts and binds clean, but correct wiring needs a `_rotWithHips` variant in the **shared** rig stack + a seated-stature exemption in F's no-giants gate. Two cross-cutting changes for a polish item in freeze week = v3.1. The `SEAT_DROP` hack ships in v3.0; it reads seated from the crowd POV. ## Laws (unchanged, one exception) - Prime flag law: `?gigs=1` **opt-in at the tag** (John concurred, R14). Flags-off byte-identical; synthetic golden `0x3fa36874` frozen. **Gig golden moves ONCE** (ledger #1, A's commit only). - Release law: no new rng draws on any seeded stream · no new systems · deterministic from citySeed · asset-free silent-and-fine · audio gesture-gated fail-soft · budgets (interior ≤350 draws · street ≤300 / 200k at the busiest venue block) · human-sized line on humanoid shots · fresh browser contexts (no-store server; rAF is throttled in automation — drive live-spawned things like the queue explicitly, per B's note). - Shared-tree discipline: atomic commits by explicit pathspec. ## Lane A — the poster flip (first, everything waits on you) 1. Ledger #1: flip `buildPosters` item 1 to the +Z street face; re-pin the gig golden; amend the §v3 FROZEN marker (golden line + a one-line amendment note) — all in ONE commit. Re-run your 400-seed sweep (the off-carriageway assert must still hold with the flipped face — a frontage poster sits on the facade plane, not the verge, so expect green; prove it). 2. Tell B + F the new golden the moment it lands. ## Lane B — verify the hero (after A) 1. Re-shoot `queue_night`: A's flip should seat the pub's own poster by the door **in the existing frame with no pose change** (your prediction — verify it). Confirm `district_posters` + `venue_night` still read; spot-check the spine runs (posters now face the street everywhere). 2. Nothing else. Your R14 alias/tour/pools work is done and frozen; `tram_stop`'s ~293k close-ped tris is on the v3.1 list. ## Lane C — verify the amp (after D) 1. Re-render the pub + RSL stages with D's corrected plant: amp clear of the bassist (state the measured clearance), flanking the primitives, nothing interpenetrating. One line in your notes; your freeze stands otherwise. ## Lane D — the amp one-liner 1. Ledger #4: move the backline plant to C's §3 pose. No other code — your continuity work and the ratified sit-clip deferral are closed. Confirm draw/tri delta 0 and `?noassets` unaffected. ## Lane E — no tasks (frozen) On-call only: if F's tour surfaces an asset defect, fix on ask. Nothing else — your provenance freeze is the release contract. ## Lane F — the release (last; this is your R14 brief, carried in full) 1. **Continuity wiring + smoke** (ledger #3) — D's three touches, assert on the seam. 2. **Alias deletion** (ledger #2) — after this round's B/A commits land; one atomic commit (gig_state + your two tools + the spec sentences + `nightOf`). 3. **Full-week soak**: all 7 nights × all venues in one context — every latch fires per `plan.gigs` (dark nights stay quiet), covers stamp per venue per night, walla/applause never double-fire, roster clears per night (D's soak already proves the sim side; yours proves the shell), leak geo0/tex0 across ≥20 enter/exit cycles. Non-strict qa extra. 4. **The money-shot tour**: `tools/qa/tour_shots.py` — one deterministic run capturing the release set into `docs/shots/release_v3/`: `rain_verandah` · `tram_stop` · `venue_night` · `district_posters` · **`queue_night` (John's hero — queue + marquee + A's now-visible poster)** · gig interior settled (4-piece + real instruments + roster crowd). Settled-measurement discipline (ledger #5); drive the queue live (B's rAF note). 5. **Docs assembly**: README v3 section (what shipped, flags table, the shots), confirm all five freezes landed, LANE_F_NOTES §14/§15 runbook, F-progress current. 6. **Acceptance + tag + push**: `qa.sh --strict` 6/6 + continuity smoke + week soak green → tag **`v3.0`** → `git push origin main` and `git push origin v3.0` as separate commands. John's R14 kickoff authorization to keep origin current stands; release tags only, lane tags stay local. ## Order **A first** (the poster flip + re-pin — B's verify and F's hero shot hang off it). **D** anytime (one line); **C** verifies D; **B** verifies A. **F last**, once A+D are in. Handshakes: A→B/F the new golden; D→C "amp moved"; B→F "hero verified". ## Standing — the v3.1 backlog (consolidated; do not start) Flag-default flip (`?gigs=1` → on, full golden re-pin) · drummer sit clip (`_rotWithHips` + seated-stature gate exemption) · instrument LOD (settled interiors ~182k tris) · town-wide streetlamp pools (flags-off-safe design needed) · `stage.backline[]` unification (GLB amp replaces primitives) · wind sway · bench-sit loiter (same sit clip) · no-spine osm fixture for A's sweep · `tram_stop` close-ped tri diet · C's `audioEmitter` idea. ## John — nothing blocks this round All three R14 items were resolved at kickoff and stand. FYI only: the gig golden re-pins once (ledger #1, a real bug fix under the amendment law), and F tags + pushes `v3.0` at round end under your standing OK. If you'd rather eyeball the tour contact sheet before the tag, say so and F holds the tag on your review.