PROCITY/docs/LANES/ROUND14_INSTRUCTIONS.md
m3ultra e4e16c34ed Fable (integrator): round-14 instructions — v3.0 release round
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 00:56:00 +10:00

158 lines
10 KiB
Markdown
Raw 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 14 lane instructions (from Fable, integrator)
Date: 2026-07-16 · **v3.0-beta shipped** (the district, `?gigs=1`, tag local; qa `--strict` 6/6,
0 warn — the queue assert went live after D landed). Seed 20261990 = Boolarra Heads: 3 venues,
14 gigs/week, tonight Screaming Utes @ The Exchange Hotel $10 + The Dead Ringers @ the RSL free.
Round 14 is **v3.0: THE RELEASE** — identity continuity into the crowd (the one remaining charter
promise), the money-shot tour, the soaks, docs freeze, and the `v3.0` tag. **No new systems this
round** — if it isn't continuity, hardening, or documentation, it's v3.1.
## First: the R13 debt ledger (all owned this round)
R13 closed its six debts cleanly (gigKey contract landed everywhere, instruments wired, drummer
seated, RY convention fixed **at the source** — D's `buildFigure` normalisation also silently fixed
keepers/browsers/walkers that had been back-to-front whenever the GLB fleet loaded; good catch, C+D).
What carries:
1. **Alpha alias retirement (B → F, ordered).** F kept the R12 single-venue
`window.PROCITY.gigs` shape (`.state/.on/.venueShopId/.cover/.paid`) as a one-round compat
alias; that round is over. **B first** removes its fallback readers (`audio.js` alias→clock
chain, `venue.update()` bare-string arm — keep the clock fallback, drop the alias hop), **then
F** deletes the alias so `byVenue` + the per-venue accessors are the only surface. CITY_SPEC §v3
runtime block loses the alias line in the same commit (F).
2. **Drummer sit hack (D).** The 4th member is a standing rig sunk `SEAT_DROP` behind the kit —
reads seated only from the front. `~/Documents/mixamo-fetch/out/` holds **34 clips incl. `sit`**
(LANE_D_NOTES wishlist #1**check what exists first, never re-download**). Wire the real clip,
retire `SEAT_DROP` + the `m.seated` branch.
3. **Town-wide streetlamp pools (B) — RULING: stays venue-scoped for v3.0.** Town-wide needs
always-on `furniture.js` changes and that fights flags-off parity in release week. Venue blocks
read fine (F's `venue_night` shot proves it). Document as a v3.1 candidate in LANE_B_NOTES;
no code.
4. **Poster repetition (B judges, E executes).** B: during the tour audit, eyeball the spine poster
runs — if the per-gig instanced skins read repetitive, ask E for 12 more templates. E: build
only on B's ask (R13 law, unchanged).
Closed for good, for the record: depot publish (John OK'd mid-R13; Gate-3 provenance flag cleared,
`digalot.fyi` serves the 14k instruments + `_hi` originals).
## Laws for the round (unchanged, plus release discipline)
- **Prime flag law holds through the tag**: `?gigs=1` stays **opt-in for v3.0** (Fable's default —
John may overrule, see Standing #2). Flags-off boot byte-identical, synthetic golden
`0x3fa36874`, gig golden `0x1f636349`**neither moves this round**. Any diff that would move
a golden is out of scope by definition; park it.
- Deterministic from citySeed · asset-free (`?noassets=1&gigs=1` silent-and-fine) · audio law
(gesture-gated, fail-soft) · budgets: gig-night interior ≤350, street ≤300 draws / 200k tris at
the busiest venue block · human-sized line on every humanoid shot · **fresh browser contexts**
(the stale-module trap bit B in R13 — `cache:'reload'` + hard nav, or the no-store server).
- **Shared-tree discipline**: commit atomically by explicit pathspec; lanes land concurrently.
- **Release-round law: no new rng draws on any seeded stream.** Continuity work must ride new
sub-streams or consume existing identities — if two runs of R13 code and R14 code disagree on
any golden or any R13 smoke, the change is wrong.
## Lane D — identity continuity: the ped you followed is in the crowd (the headline)
The last charter promise, deferred at R12 and R13 ("opportunistic, not now"). Now.
1. **Continuity contract.** The sim already knows who enters a venue (queue `admitOne()` drains +
surge occupants). Record a per-venue **tonight roster** of entered identities
({pedIndex, height, …whatever pins "the same person"}), and have `GigCrew.spawn` consume it:
crowd slots fill from the roster first, seeded strangers only for the remainder. Design is
yours; the acceptance is behavioural: **follow a punter from the queue through the door, walk
in behind them, and find them in the crowd — same ped, same height.** Works across exit/re-enter
(roster persists for the night, not per interior build).
2. **Determinism**: the roster is a consequence of seeded sim behaviour; interior crowd identity
for a given (seed, night, entry time-segment) must be stable enough for F's smoke — expose
`window.PROCITY.citizens.tonightRoster(venueShopId) → [{pedIndex, …}]` (or your preferred name —
tell F) so the smoke can assert crowd ⊇ roster ∩ cap without screenshot forensics.
3. **The sit clip** (debt #2 above). Data task, not rig work — clips bind through the canonical
`mixamorig` skeleton like walk/idle.
4. **Sim soak**: 30+ min equivalent (accelerated segments fine) with gigs on — full week roll,
repeated surge/drain/queue cycles at all venues; assert leak geo0/tex0, roster bounded, no
identity churn. Numbers in your notes.
Budget note: continuity is bookkeeping, not new rigs — draw/tri delta should be ~0; state it.
## Lane B — alias retirement + the tour audit
1. **Drop the alias readers** (debt #1 — you go first, tell F when landed).
2. **Bookmark/tour audit**: every bookmark (16 v2 + `venue_night` + `district_posters`) still
frames un-letterboxed, 0 errors, with `?gigs=1` on — the district changed the streetscape under
some of the old poses. Fix poses, don't touch world code.
3. **`queue_night` bookmark** — John's queue shot: close framing on the pub door at `doors`/`on`,
queue line + marquee + poster in frame, punters facing the door. This is the release hero shot;
F scripts it into the tour.
4. **Poster repetition call** (debt #4): judge, and either "fine" in your notes or a one-line ask
to E.
## Lane C — venue audit + docs freeze (light round, by design)
1. **Interior release audit**: one pass over the three venue archetypes against CITY_SPEC §v3 +
LANE_C_PUB — watchPoint caps, stage/riser numbers, gigKey resolution, quiet-night variants —
and re-run your 60-room soak + drawSweep against D's continuity changes (crowd identities
change; geometry must not). Fix only regressions.
2. **`guitar_amp` placement ruling** (R13 left it "C's call"): D planted it as stage dressing —
bless the placement or give D the corrected pose; one line in LANE_C_PUB either way.
3. **Docs freeze**: LANE_C_PUB.md + LANE_C_AUDIO.md are the durable contracts — final wording
pass, mark them v3.0-frozen.
## Lane E — provenance close-out (light round, by design)
1. **`publish.py --verify` drift check** against the live depot post-R13-publish; qa Gate 3 must
be green with zero flags for the tag.
2. **Poster templates** only on B's ask (debt #4).
3. **Docs freeze**: provenance table + audio/GLB inventories in LANE_E_NOTES current and
v3.0-frozen. No new synthesis this round unless John re-flavours a genre (Standing #3, R13 —
still open, still names-only).
## Lane A — invariant sweep + CITY_SPEC freeze
1. **District seed sweep**: 400-seed run asserting the district invariants — 24 venues, ≥1 pub,
never the openLate shop, no band twice in one night town-wide, every poster behind
`poleOffset`, per-venue 46 nights — plus **one osm town** proving graceful placement (no
spine/warehouse district). Promote any invariant not already in `selfcheck.js` into it.
2. **CITY_SPEC v3 freeze**: you own the spec — final pass over §v3 (venues table, genre map,
gigKey contract, gig golden `0x1f636349`, F's runtime block minus the retired alias), then mark
the section frozen for the tag. Coordinate the alias-line deletion with F (debt #1).
## Lane F — soaks, the tour, the tag (last)
1. **Delete the alpha alias** once B lands (debt #1) + the CITY_SPEC line (with A).
2. **Continuity smoke**: extend `smoke_gigs` — queue identities admitted at `doors` appear in the
interior crowd via D's roster seam (assert on the seam, not pixels); crowd ⊇ roster ∩ cap;
determinism arm re-run.
3. **Full-week soak**: drive the segment spine through all 7 nights × all venues in one context —
every latch fires per `plan.gigs` schedule (dark nights stay quiet), covers stamp per venue per
night, walla/applause never double-fire, leak geo0/tex0 across ≥20 enter/exit cycles. Wire it
into qa as a non-strict extra (strict stays the 6 gates).
4. **The money-shot tour**: `tools/qa/tour_shots.py` — scripted capture of the release set in one
deterministic run: `rain_verandah` (winmap+rain hero) · `tram_stop` · `venue_night` ·
`district_posters` · **`queue_night` (John's shot)** · gig interior (4-piece + instruments +
crowd). Contact sheet into `docs/shots/release_v3/`.
5. **Docs assembly**: README v3 section (what shipped, the flags table, the shots), confirm every
lane's freeze landed, LANE_F_NOTES §14 runbook.
6. **Acceptance + tag**: `qa.sh --strict` 6/6 + continuity smoke + week soak green → tag **v3.0**.
Tag and push are separate commands; the push itself waits on John (Standing #1).
## Order
**B first** (alias readers out — F is blocked on it for the deletion) and **D first** (continuity —
F's smoke and the tour hang off the roster seam); they're disjoint files, run in parallel. A, C, E
anytime, independent. **F last**, as always. Mid-round handshakes: B→F "readers gone", D→F the
roster accessor name, C→D the amp ruling.
## Standing
- **v3.1 preview (do not start):** flag-default flip (if John rules it), town-wide lamp pools,
tram-gig composition (ride to the gig), wind sway, bench-sit loiter from the same `sit` clip.
- **John — three items:**
1. **The push.** The R13 epoch (7 commits + `v3.0-beta`) and everything R14 lands are **local
only**. F is ready to `git push origin main` + tags on your word — it's the one
outward-facing step every lane held.
2. **Flag default at v3.0**: Fable's call is `?gigs=1` stays **opt-in** for the tag (prime-flag
discipline through release; flip considered at v3.1 after the soak bakes). Overrule if you
want the district on by default at v3.0 — that becomes an F task with a full golden re-pin,
and it goes FIRST in the round, not last.
3. **Genre re-flavour** (carried from R13, names-only, A+E coordinated): defaults
pubrock/grunge/covers stand unless you say otherwise — last call before the docs freeze.