Fable (integrator): round-12 instructions — v3.0-alpha, one pub end-to-end

R11 reviewed: clean audio round, v2.1 tagged+pushed by F, E's pack fully procedural
(numpy synthesis, 23 assets, 8.7MB, $0). R12 opens the venues epoch behind ?gigs=1
with John's three charter rulings encoded: crowd = stand-and-watch + seeded ~1/3
dancing; events = mixed free/paid (seeded cover $0 or $2-10, wallet door charge,
knockback on skint, no re-charge same night); band names = generator + optional
web/assets/custom_bands.json drop-in (asset-law compliant, deterministic given
seed+file). A publishes plan.gigs first; C watchPoints; D band trio + crowd;
E instruments/posters/pub-rock bed; B lit frontage + muffled spill; F gig state
machine + door charge + smokes + v3.0-alpha tag.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
m3ultra 2026-07-15 17:32:34 +10:00
parent 8c275c711b
commit 22a0741ad1

View File

@ -0,0 +1,114 @@
# PROCITY — Round 12 lane instructions (from Fable, integrator)
Date: 2026-07-15 · **v2.1 shipped** (audio round — clean, all four working lanes, tag on origin).
Round 12 opens the v3 epoch: **VENUES & GIGS** (`docs/V3_VENUES.md`). This round is
**v3.0-alpha: one pub, end-to-end, behind `?gigs=1`**. Vertical slice — a Friday night that
actually happens — before any district breadth.
## John's charter rulings (all three questions answered — these are now spec)
1. **Crowd: both.** Most of the audience stands and watches; a seeded subset dances.
2. **Events: free AND paid, mixed.** Cover charge is seeded per gig — some nights are free
(local acts), some charge $2$10 at the door through the existing wallet.
3. **Band names: generator + drop-in.** A's generator produces names; an OPTIONAL editable
drop-in file lets John hand-write names (Feral Galahs tier) that mix into the pool.
## Laws for the round
- **Prime flag law (unchanged from v2):** everything lands behind `?gigs=1`, default OFF.
Flags-off boot stays byte-identical; goldens frozen; F's flags-off regression must stay green.
- All v2 house law carries: deterministic from citySeed · asset-free fallback (a gig with no GLBs
= placeholder band on a primitive stage — still a gig) · audio law (gesture-gated, silent-and-
happy) · budgets are numbers (gig-night interior ≤350 draws incl. crowd; state your worst) ·
human-sized line on humanoid shots · fresh browser context for verification.
- **A publishes the `plan.gigs` interface FIRST** (half-day handshake rule) — D, C, F all hang
off it.
## Lane A — gig truth (publish interface first)
1. **Venue lot**: one `pub` per town (registry type + placement rule — spine end or corner
anchor; must not displace the openLate shop). Venue is enterable like any shop.
2. **`plan.gigs`** (seeded, in the plan, documented in CITY_SPEC v3 section):
`[{ gigId, venueShopId, bandName, genreKey, night, startSeg, endSeg, cover }]` — nightly
entries; `cover` seeded: ~half free (0), else integer $2$10. Poster assignments: which
walls/poles advertise which gig (reuse the sign/poster placement seam B already consumes).
3. **Band names**: generator via wordlists (90s Aussie pub-rock flavour) **+ the drop-in**:
`web/assets/custom_bands.json` — OPTIONAL file, schema `{ "bands": ["The Feral Galahs", …] }`.
Rules: absent file → pure generator, zero errors, zero fetch under `?noassets=1`; present →
custom names are seeded into the pool with priority (a town with N custom names should
surface most of them). Deterministic given (seed, file contents). Document the schema +
an example file in CITY_SPEC so John can just edit it.
4. Carried debt, now due (D consumes it this round): the **closing-time occupant ruling**.
## Lane C — the band room (pub archetype)
1. Pub interior archetype: low stage, PA/amp positions (E GLB slots, primitive fallback),
bar counter (reuse counter contract — the barkeep is just a keeper), sticky-carpet floor
skin choice, green-room door blocked (house pattern).
2. **`room.watchPoints[]`** — the browse-points pattern, crowd edition: 68 seeded floor poses
facing the stage, `{ x, z, ry, dance: bool }` with `dance` seeded ~⅓ true (John: "a bit of
both"). Same coord frame + ry convention as `counter.stand`. Publish the interface in your
first commit; validate no overlap with fittings/keeper/browse points.
3. `room.audio` gains `gigKey` when built with a gig on (F passes gig state via opts —
quiet-night pub = normal interior with roomtone).
## Lane D — the band and the crowd
1. **Band trio on stage**: 3 rigs at seeded stage poses with instrument-holding idles
(guitarist/bassist strum-sway, drummer seated bob — procedural bone-sway on top of the idle
clip is fine, no new mocap required). Instruments are E's GLBs when present, primitives when
not.
2. **Audience at C's watch points**: the keeper/browser spawn path (it's now gate-protected
against giants). `dance:false` → stand-and-watch idle (subtle weight shift). `dance:true`
dance variant (procedural bob/sway/step loop, seeded phase so the crowd doesn't metronome).
3. Gig-night patronage surge at the venue while state=on (uses A's closing-time ruling), and
identity continuity where it falls out naturally (the queue is v3.0-beta — NOT this round).
4. Budget + leak numbers in your progress note, as ever.
## Lane E — instruments, posters, gig sound
1. GLBs via the MODELBEAST pipeline: electric guitar, bass, drum kit (one merged kit), amp,
mic stand. House GLB law, footprints, thumbnails, depot publish (tailnet path), manifest.
2. Poster/flyer skin pack: 34 gig-poster templates that take band-name overprint the way shop
signs take names (B consumes for walls/poles; C may use one inside the pub).
3. `gen_audio.py` extension: one pub-rock instrumental live bed (the alpha genre), crowd-walla
loop, applause sting. Same OGG+M4A/loudness/provenance discipline as R11.
## Lane B — the venue from the street (alpha-light)
1. Lit pub frontage at night while a gig is on: marquee/poster placement (E's skins + A's
poster assignments), warm window spill, sign lit through `endSeg`.
2. Muffled-gig spill through the wall/door (extend the R11 door-spill: low-pass filtered gig
bed at low gain when state=on). B owns the street side of the audio seam.
3. **Stretch, non-blocking**: first slice of night-readability polish (streetlamp pools on the
venue's block) — it makes the alpha money shot.
## Lane F — Friday night fires (last, wires everything)
1. **Gig state machine** off the clock: `quiet → doors (startSeg1) → on → done`, driven by
`plan.gigs`; exposed on `window.PROCITY.gigs` for smokes.
2. `?gigs=1` seam + **flags-off regression stays green** (prime law).
3. **Door charge**: entering the venue while doors/on and `cover > 0` debits the wallet with a
toast (`$5 cover — THE FERAL GALAHS`); insufficient funds → polite knockback toast, no entry
(keeps the wallet honest, zero new UI). Free gigs walk straight in. Re-entry same night = no
re-charge (seeded stamp, not new persistence).
4. Audio wiring: gig bed via C's `gigKey` inside, B's muffled spill outside; audio smokes extend
to the gig path.
5. Smokes: gig schedule determinism (two runs byte-equal), crowd cap ≤ watchPoints, band always
3, gig-night interior draw budget, no-giants inherited on stage/crowd rigs, `?noassets=1`
still silent-and-fine with `?gigs=1`.
6. Alpha acceptance shot: gig on, band + mixed standing/dancing crowd, human-sized line. Then
tag **v3.0-alpha** (remember: `git tag` and `git push` as separate commands — the classifier
blocks them combined).
## Order
A first (plan.gigs + venue lot interface) → C (watch points + archetype) in parallel with E
(assets/audio) → D (band + crowd) → B (frontage/spill) → F last. A and C: publish interfaces in
your FIRST commit even if implementation follows.
## Standing
- v3.0-beta preview (next round, do not start): the district (24 venues), posters town-wide,
the outdoor queue, walla+applause polish, full night-readability pass.
- John: no open questions this round — all three charter rulings received and encoded above.