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>
This commit is contained in:
jing 2026-07-15 21:30:01 +10:00
parent 2498fdc892
commit 79852ca220

View File

@ -0,0 +1,173 @@
# 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.