PROCITY/docs/LANES/ROUND13_INSTRUCTIONS.md
jing 79852ca220 Fable (integrator): round-13 instructions — v3.0-beta, the district
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>
2026-07-15 21:30:01 +10:00

174 lines
12 KiB
Markdown
Raw Permalink 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 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** — 24 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. **24 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; ~46 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 68, RSL 812 — 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 (3096k 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 (26), 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: 12 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.