v3.0-alpha re-verified green (qa.sh --strict 6/6, 0 warn) on the shipped tree. Round 13 opens the beta: 2-4 venues (pub/band_room/rsl), full week schedule, posters town-wide, the outdoor queue, walla+applause, night-readability pass — all behind ?gigs=1. All six R12 debts assigned: gigKey contract (manifest key IS the gigKey, gig-<genre>), D wires E's instrument GLBs, the drummer (band goes 4-piece — John may veto), the RY_FLIP facing audit, A's poster verge offset, F's stature-gate hardening. Three items for John, only the depot-publish OK blocks anything. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
12 KiB
PROCITY — Round 13 lane instructions (from Fable, integrator)
Date: 2026-07-15 · v3.0-alpha shipped (one pub end-to-end, ?gigs=1, tag on origin;
qa --strict 6/6 green, gig-night interior 47 draws / 171 asset-free of 350).
Round 13 is v3.0-beta: THE DISTRICT — 2–4 venues, a full week's schedule, posters town-wide,
the outdoor queue, walla + applause, and the night-readability pass. Same flag, same laws.
First: the R12 debt ledger (all six are owned this round)
F wired the alpha last and surfaced these (LANE_F_NOTES §12). Each is assigned below in its owner's section, but here is the ledger so nothing dangles:
- gigKey contract (C ↔ E ↔ B ↔ F) — C emitted
gig-pubrock, E shippedpubrock-live, B hardcodedpubrock-live, F bridged at the glue. Ruling: the manifest key IS the gigKey. Canonical formgig-<genreKey>(gig-pubrock,gig-grunge, …). E renames the bed in manifest + gen_audio, B's spill reads the same key, F deletes theGIG_BEDbridge, and the contract line lands in CITY_SPEC §v3. One key, zero mapping — genre #2 must not rediscover the R1 facade-skin trap. - Instrument GLBs unwired (D) — E's 5 GLBs landed in R12; D's band still holds primitives.
D owns the join via its own
opts.instrumentFor(role)seam. - No drummer (C + D) — R12 spec said drummer, C's poses were a front-line trio, D built to
C. Ruling (Fable): bring implementation to spec — the kit gets played. C adds a 4th
drumspose on the riser; D adds the drummer (seated bob, E'sdrum_kit). The band is now 4 (front-line trio + drummer); F'sband==3smoke moves to 4. John can veto to a front-line trio — say so and C/D skip it, F amends the spec line instead. - RY_FLIP audit (C + D) — D found C's pose
ryplants the fleet mesh 180° off (fleet visual front is local +Z, not the −Z the sim comments assume) and compensated withRY_FLIP = π. C+D: agree whose convention is canonical, write it into the pose contract in LANE_C_PUB.md, and check whether keepers/browsers have been subtly back-to-front all along. If a flip is needed there, it's a visual fix — no golden moves. - Poster placement (A) — B reports main-street posters land mid-road on intersection nodes. A: add a verge/pole offset so posters seat on furniture, not bitumen.
- Stature-vs-crown gate (F) — F's smoke measures stature (
crown − base.y) because the band stands on a 0.32 m deck;tools/qa/interior_scale_check.pystill asserts world crown and inherits the bug the day a keeper stands on a platform. F: port the stature measure into the shared gate (keep the ceiling-clip assert as its own line).
Laws for the round (unchanged)
- Prime flag law: everything behind
?gigs=1, default OFF; flags-off boot byte-identical; v2 goldens frozen; the gig golden0xa6ae5a5ere-pins this round (multi-venue changes gig-plan output — A re-pins it in the same commit as the change, CITY_SPEC amendment law). - Deterministic from citySeed · asset-free fallback (
?noassets=1+?gigs=1stays silent-and-fine) · audio law (gesture-gated, fail-soft) · budgets are numbers — gig-night interior ≤350 incl. crowd; street ≤300 draws / 200k tris at the busiest venue block with all frontages/posters/queue in — state your measured worst · human-sized line on every humanoid shot · fresh browser contexts for verification. - A publishes the multi-venue
plan.gigsinterface FIRST (half-day handshake rule) — C, D, B, F all hang off it.
Lane A — the district in the plan (publish interface first)
- 2–4 venues per town (seeded count). Registry types:
pub(have it),band_room,rsl. Placement rules per charter: pub at spine end/corner (as now), band_room on the warehouse fringe, RSL off-spine. Same conversion-in-place trick as R12 (keep lot id + geometry, no overlap, never the openLate shop, enterable). Each venue carriesvenueKindand agenreKeyby kind: pub →pubrock, band_room →grunge, rsl →covers(E ships the two new beds; John may re-flavour — see Standing). plan.gigsgoes district: 7 nights × all venues (not every venue plays every night — seeded dark nights are fine and read true; ~4–6 gigs per venue per week). Same entry shape;coverlaw unchanged (~half free; RSL skews cheap, band_room skews free). Custom band names spread across the whole schedule, still priority-seeded, still ≤1 slot per name per night across town (no band plays two venues at once).plan.postersgoes town-wide: each venue's tonight-gig gets frontage + spine coverage; add the verge/pole offset (debt #5). Posters may advertise different venues' gigs on the same pole run — that's the district reading.- Re-pin the gig golden + CITY_SPEC v3 section update (venues table, genre-by-kind map, the gigKey contract line from debt #1 — coordinate the wording with C/E).
Lane C — two more rooms + the drummer
band_roomandrslinterior archetypes. Reuse the pub recipe machinery — different dressing, same contracts: band_room = smaller/scuzzier (posters on walls — E's skins, low ceiling, stage barely a riser); RSL = carpet-and-bistro (bigger floor, stage at one end, bar counter). Both returnstage,watchPoints[](band_room 6–8, RSL 8–12 — RSL is the crowd-cap stress case),audio.gigKey = 'gig-'+genreKey, quiet-night variants. Budgets in your note.drumspose on the riser in all three archetypes (debt #3):stage.bandPosesgrows to 4, roledrums, seated height noted for D.- RY audit with D (debt #4): pin the pose
ryconvention in LANE_C_PUB.md, check keepers/browsers facing, fix or document. - Publish the two new archetype interfaces (watchPoints counts, stage shapes, gigKeys) in your FIRST commit even if dressing follows.
Lane D — instruments in hand, a drummer, and the queue
- Wire E's instrument GLBs (debt #2): manifest fittings via your
instrumentFor(role)seam — electric_guitar/bass_guitar/mic_stand in hand, drum_kit planted at thedrumspose, guitar_amp as stage dressing if it reads (C's call on placement). Orientation/scale is yours; primitives remain the fallback (asset law). Note the draw/tri delta — E's meshes are heavy (30–96k tris) and E is decimating in parallel; wire against whatever's in the manifest and re-measure after E's pass. - The drummer (debt #3): 4th rig, seated bob at the
drumspose, behind the kit. - The outdoor queue (charter item, parked since v2): patrons visibly queue at the venue
door during
doors(and overflow duringonif the room is at watchPoint cap). Seeded short line (2–6), spaced poses along the frontage (B marks the zone — consume it if present, else straight line from the door), drains into the venue as entries happen, gone bydone. Queue rigs ride the same gate-protected spawn path; budget stated. - Multi-venue surge:
setGigper venue (multiple concurrent). Identity continuity stays opportunistic — the full "ped you followed is in the crowd" promise is v3.0, not now.
Lane E — two genres, lighter meshes, the publish
- Two new gig beds:
gig-grunge(band_room) andgig-covers(RSL — mellower, organ-ish covers-band feel). Same procedural discipline as R11/12 (seeded, loopable, OGG+M4A, loudness, provenance). Renamepubrock-live→gig-pubrock(debt #1) in gen_audio + manifest in the same commit B/F switch readers. - Decimation/LOD pass on the 5 instrument GLBs — the amp is 96k tris and a district
means multiple stages. Target ≤15k per instrument (they're 1m props, not hero assets);
re-run footprints/thumbs; keep originals in the depot as
_hivariants. - Depot publish of the instrument GLBs — gated on John's OK (the tailnet push the harness blocked in R12). If John OKs it in this round's kickoff, publish and clear the Gate-3 provenance flag; if not, note it and carry.
- Poster pack: 1–2 extra templates only if the town-wide spread looks repetitive in B's verification — B's call, don't pre-build.
Lane B — the night the district reads by
- Night-readability pass (the epoch's bundled polish, now due): streetlamp pools on venue blocks + window light spill so the Friday-night walk reads. Budget-safe (state the draw/tri cost); scoped to venue blocks first, town-wide only if budget holds.
- Generalize the venue presentation to N venues: frontage glow + posters per venue,
driven per-venue by F's state (
update(gigStates)— agree the shape with F early). Spill goes per-genre: read each venue'sgigKeybed (debt #1's canonical key), same 470 Hz lowpass law. - Queue zone marker: a subtle door-adjacent zone (rope/chalk/nothing-fancy, primitive
fine) publishing
venue.queueZone = {x,z,ry,len}for D's queue poses. - Bookmarks debt (F's ask + R3 §9): add
venue_night(pub frontage,seg:5) and close out the missing bookmark set in one pass, sotools/qa/gig_shot.pycan script the street money shot.
Lane F — the district fires (last)
- Gig state machine goes per-venue: one latch per venue off the same
procity:segmentspine (keep the getter law; keep the landing-segment night-roll law — they were both hard-won).window.PROCITY.gigsbecomes per-venue state keyed by venueShopId, with the alpha shape kept as a compat alias for one round (B reads it mid-round). - Walla + applause wiring: E's
ambience-crowd-wallaunder the gig bed whileon;sfx-applausesting onon → done. Audio law throughout. - Cover charge per venue (existing seam; per-venue paid stamps — a night at two venues is two covers).
- Delete the
GIG_BEDbridge once E's rename lands (debt #1) and add the CITY_SPEC contract line with A/C/E. - Gate hardening (debt #6): stature measure into
interior_scale_check.py. - Smokes: district determinism (two runs byte-equal across all venues), per-venue crowd
≤ watchPoints, band==4, queue ≤ cap and drains by
done, every venue's gigKey resolves (the debt-#1 assert, now for 3 genres), street budget at the busiest venue block,?noassets=1+?gigs=1silent-and-fine, flags-off regression green. - Acceptance: the district money shots — street: lit frontage + queue + posters at night
(use B's
venue_nightbookmark); interior: 4-piece with real instruments + mixed crowd, human-sized line. Then tag v3.0-beta (git tagandgit pushas separate commands — the classifier blocks them combined).
Order
A first (multi-venue plan.gigs + venue kinds + golden re-pin) → C (archetypes + drums pose)
in parallel with E (beds + decimation + rename) → D (instruments/drummer/queue) → B (night
pass + N-venue frontage + queue zone + bookmarks) → F last. A and C: interfaces in your FIRST
commit. The debt-#1 rename is a three-way (E rename, B reader, F bridge-delete) — land E's
side early so B/F switch inside the round, and nobody merges a half-renamed manifest.
Standing
- v3.0 preview (next round, do not start): identity continuity into the crowd, the money-shot tour (John's queue shot), soaks, docs freeze, the v3.0 tag.
- John — three items, only #1 blocks anything:
- Depot publish OK? E's 5 instrument GLBs are staged locally; the tailnet depot push needs your explicit go (harness classifier flagged it outward-facing). Until then qa Gate 3 carries a provenance flag.
- Genre flavours: defaults are band_room → grunge, RSL → covers. Re-flavour freely (names only — E synthesizes to order).
- Drummer ruling: Fable ruled 4-piece (kit on the riser, spec intent). Veto to front-line trio if you prefer — before D starts, ideally.