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>
174 lines
12 KiB
Markdown
174 lines
12 KiB
Markdown
# 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:
|
||
|
||
1. **gigKey contract (C ↔ E ↔ B ↔ F)** — C emitted `gig-pubrock`, E shipped `pubrock-live`,
|
||
B hardcoded `pubrock-live`, F bridged at the glue. **Ruling: the manifest key IS the gigKey.**
|
||
Canonical form `gig-<genreKey>` (`gig-pubrock`, `gig-grunge`, …). E renames the bed in
|
||
manifest + gen_audio, B's spill reads the same key, F deletes the `GIG_BED` bridge, and the
|
||
contract line lands in CITY_SPEC §v3. One key, zero mapping — genre #2 must not rediscover
|
||
the R1 facade-skin trap.
|
||
2. **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.
|
||
3. **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
|
||
`drums` pose on the riser; D adds the drummer (seated bob, E's `drum_kit`). The band is now
|
||
**4** (front-line trio + drummer); F's `band==3` smoke moves to 4. *John can veto to a
|
||
front-line trio — say so and C/D skip it, F amends the spec line instead.*
|
||
4. **RY_FLIP audit (C + D)** — D found C's pose `ry` plants the fleet mesh 180° off (fleet
|
||
visual front is local +Z, not the −Z the sim comments assume) and compensated with
|
||
`RY_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.
|
||
5. **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.
|
||
6. **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.py` still 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 golden `0xa6ae5a5e` re-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=1` stays
|
||
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.gigs` interface FIRST** (half-day handshake rule) —
|
||
C, D, B, F all hang off it.
|
||
|
||
## Lane A — the district in the plan (publish interface first)
|
||
|
||
1. **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 carries `venueKind`
|
||
and a **`genreKey` by kind**: pub → `pubrock`, band_room → `grunge`, rsl → `covers`
|
||
(E ships the two new beds; John may re-flavour — see Standing).
|
||
2. **`plan.gigs` goes 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;
|
||
`cover` law 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).
|
||
3. **`plan.posters` goes 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.
|
||
4. 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
|
||
|
||
1. **`band_room` and `rsl` interior 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 return `stage`, `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.
|
||
2. **`drums` pose** on the riser in all three archetypes (debt #3): `stage.bandPoses` grows to
|
||
4, role `drums`, seated height noted for D.
|
||
3. **RY audit with D** (debt #4): pin the pose `ry` convention in LANE_C_PUB.md, check
|
||
keepers/browsers facing, fix or document.
|
||
4. 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
|
||
|
||
1. **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 the `drums` pose,
|
||
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.
|
||
2. **The drummer** (debt #3): 4th rig, seated bob at the `drums` pose, behind the kit.
|
||
3. **The outdoor queue** (charter item, parked since v2): patrons visibly queue at the venue
|
||
door during `doors` (and overflow during `on` if 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
|
||
by `done`. Queue rigs ride the same gate-protected spawn path; budget stated.
|
||
4. **Multi-venue surge**: `setGig` per 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
|
||
|
||
1. **Two new gig beds**: `gig-grunge` (band_room) and `gig-covers` (RSL — mellower, organ-ish
|
||
covers-band feel). Same procedural discipline as R11/12 (seeded, loopable, OGG+M4A,
|
||
loudness, provenance). **Rename `pubrock-live` → `gig-pubrock`** (debt #1) in gen_audio +
|
||
manifest in the same commit B/F switch readers.
|
||
2. **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 `_hi` variants.
|
||
3. **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.
|
||
4. 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
|
||
|
||
1. **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.
|
||
2. **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's `gigKey` bed (debt #1's canonical key), same
|
||
470 Hz lowpass law.
|
||
3. **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.
|
||
4. **Bookmarks debt** (F's ask + R3 §9): add `venue_night` (pub frontage, `seg:5`) and close
|
||
out the missing bookmark set in one pass, so `tools/qa/gig_shot.py` can script the street
|
||
money shot.
|
||
|
||
## Lane F — the district fires (last)
|
||
|
||
1. **Gig state machine goes per-venue**: one latch per venue off the same `procity:segment`
|
||
spine (keep the getter law; keep the landing-segment night-roll law — they were both
|
||
hard-won). `window.PROCITY.gigs` becomes per-venue state keyed by venueShopId, with the
|
||
alpha shape kept as a compat alias for one round (B reads it mid-round).
|
||
2. **Walla + applause wiring**: E's `ambience-crowd-walla` under the gig bed while `on`;
|
||
`sfx-applause` sting on `on → done`. Audio law throughout.
|
||
3. **Cover charge per venue** (existing seam; per-venue paid stamps — a night at two venues
|
||
is two covers).
|
||
4. **Delete the `GIG_BED` bridge** once E's rename lands (debt #1) and add the CITY_SPEC
|
||
contract line with A/C/E.
|
||
5. **Gate hardening** (debt #6): stature measure into `interior_scale_check.py`.
|
||
6. **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=1` silent-and-fine, flags-off regression green.
|
||
7. Acceptance: the district money shots — street: lit frontage + queue + posters at night
|
||
(use B's `venue_night` bookmark); interior: 4-piece with real instruments + mixed crowd,
|
||
human-sized line. Then tag **v3.0-beta** (`git tag` and `git push` as 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:**
|
||
1. **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.
|
||
2. **Genre flavours**: defaults are band_room → grunge, RSL → covers. Re-flavour freely
|
||
(names only — E synthesizes to order).
|
||
3. **Drummer ruling**: Fable ruled 4-piece (kit on the riser, spec intent). Veto to
|
||
front-line trio if you prefer — before D starts, ideally.
|