From 0490bdd07e9da78329df8ea11496a0b045933cf7 Mon Sep 17 00:00:00 2001 From: m3ultra Date: Thu, 16 Jul 2026 11:38:37 +1000 Subject: [PATCH] =?UTF-8?q?Lane=20F=20R15=20(v3.0):=20docs=20assembly=20?= =?UTF-8?q?=E2=80=94=20README=20v3,=20LANE=5FF=5FNOTES=20=C2=A714/=C2=A715?= =?UTF-8?q?,=20F-progress,=20freezes=20confirmed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README: a v3.0 'venues & gigs, THE DISTRICT' section — what shipped, the flags table, the release tour - LANE_F_NOTES §14 (R14: F never ran, brief carried) + §15 (the R15 release-close runbook, numbers, gotcha ledger) - F-progress: R15 release-close summary at the top - confirmed all five freezes committed (A a3911a4/35da83c, B eee60e0/a0b5784, C 62e38c5/2446ae3, D 9a65f51/66aec0f, E 55f6698) Co-Authored-By: Claude Opus 4.8 --- F-progress.md | 20 +++++++++++ README.md | 28 +++++++++++++++ docs/LANES/LANE_F_NOTES.md | 71 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+) diff --git a/F-progress.md b/F-progress.md index 5134a67..e1f61c0 100644 --- a/F-progress.md +++ b/F-progress.md @@ -4,6 +4,26 @@ --- +## Round 15 (v3.0 RELEASE CLOSE, `?gigs=1`) — F ran last; the release is closed + +R14 landed A–E's hardening but **F never ran**, so v3.0 stayed untagged. R15 = the close. All deps were in +before F ran (A's poster flip + new golden `0x4f4a549d`, D's amp + R14 continuity seam, B/C verifies). The +six-item brief, each committed atomically: + +- **Continuity wiring + smoke** (`687d23f`) — the ped you followed is in the crowd: `crew.spawn({roster})` + + the queue `onAdmit → recordVenueEntry` relay; `smoke_continuity` asserts the seam on identities + settled tris. +- **Alias deletion** (`146b5f3`) — the R12 scalar alias retired; every read keyed by `venueShopId`; tools + spec migrated. +- **Full-week soak** (`edc0c47`, `tools/qa/week_soak.py`) — 7 nights × all venues: cover/roster per night, leak-free (plateau), 28 cycles. +- **Money-shot tour** (`6a35b29`, `tools/qa/tour_shots.py`) — `docs/shots/release_v3/` + contact.html; hero `queue_night` shows A's now-visible poster; settled measurements. +- **Docs** — README v3 section, LANE_F_NOTES §14/§15, this note, five freezes confirmed. +- **Acceptance + tag** — `qa.sh --strict` 6/6 + continuity smoke + week soak green → tag **`v3.0`**. + +**Ledger #5 vindicated C:** the gig interior settles to **~182k tris** after the 5 instrument GLBs load (not +the ~34k measured pre-load); the interior gate is **draws** (≤56), so no budget violation — the tour + smoke +now measure settled. Full runbook: [`LANE_F_NOTES.md §15`](docs/LANES/LANE_F_NOTES.md). + +--- + ## Round 13 (v3.0-beta — THE DISTRICT, `?gigs=1`) — WIRED + VERIFIED + TAGGED A–E landed, then D (4-piece + instruments + queue + RY fix). F wired the district together and it fires. diff --git a/README.md b/README.md index 150d428..c26dd71 100644 --- a/README.md +++ b/README.md @@ -47,3 +47,31 @@ standalone test pages); F integrates after they land. Seeded everything, `Math.random` banned in gen code · the game must run with zero assets · instancing from day one · canvas text, no font files · characters = shared base rigs + one clip bank, canonical sources live outside this repo · 🟢 web-ok licensing only. + +## v3.0 — venues & gigs, THE DISTRICT (`?gigs=1`) + +The Friday-night layer, shipped behind a flag so the default boot stays byte-identical to v2 (the +synthetic golden `0x3fa36874` never moves). Turn it on and each town seeds **2–4 venues** — a pub, a +band room, an RSL — with a **full seeded week of gigs** (`plan.gigs`), town-wide **posters**, and a +Friday night that reads: a **4-piece band** (front-line trio + drummer) with real instruments on the +stage, a mixed standing/dancing **crowd**, an outdoor **queue** at the door, a **cover charge** per +venue (paid & free nights), muffled **gig spill** through the wall + **walla and applause** inside, +**streetlamp pools** and lit frontages for the night walk, and **identity continuity** — the ped you +followed in off the street turns up in the crowd. Deterministic from the seed; asset-free +(`?noassets=1`) it all still happens with placeholders and zero fetches. + +**Flags** (all default-off unless noted; compose freely): + +| flag | what | +|---|---| +| `?seed=N` | town seed (default `20261990`) | +| `?gigs=1` | the v3.0 gig layer — venues, week schedule, band/crowd/queue, cover, posters, night pass | +| `?weather=rain` · `?tram=1` · `?winmap=1` | wet strip · tram loop · parallax interior-window shader | +| `?roster=stream` | chunk-streamed citizen density (**on by default**) · `?pop=N` tunes it | +| `?dig=1` · `?stock=real` | crate-riffle on record bins · real GODVERSE sleeves in the stock | +| `?noassets=1` | asset-free — zero network, 100% placeholders, still legible | +| `?plansrc=osm` · `?mute=1` · `?dbg=1` | OSM plan source · silence · the `window.DBG` capture/soak harness | + +**Release tour:** [`docs/shots/release_v3/contact.html`](docs/shots/release_v3/) — the six money shots +(`queue_night` is the hero) with settled measurements. **QA:** `tools/qa.sh --strict` (6 gates) + +`tools/qa/week_soak.py` (the full-week soak) + the continuity/gig smokes in `tools/flags_check.py`. diff --git a/docs/LANES/LANE_F_NOTES.md b/docs/LANES/LANE_F_NOTES.md index 56e0843..d125a2b 100644 --- a/docs/LANES/LANE_F_NOTES.md +++ b/docs/LANES/LANE_F_NOTES.md @@ -523,3 +523,74 @@ line in `smoke_gigs §2b`.) (`queueInfo`) so the queue smoke goes live, and (b) the band polish (E's instrument GLBs in hand, drummer facing/RY_FLIP) — the band already lands at 4, human-sized, 0 errors, so this is polish not a blocker. Once D commits: re-run the gates, flip the queue assert, capture the district money shots, tag **v3.0-beta**. + +*(R13 epilogue: D landed mid-session; F wired the queue (D shipped `VenueQueue`, left the street-side +lifecycle to F), the queue smoke went live, both money shots shipped, and **`v3.0-beta`** was tagged + +pushed. The `queueInfo` proposal above was superseded by D's `VenueQueue.count()` + F's shell `queueCountOf`.)* + +--- + +## 14. Round 14 — F never ran; the brief carried in full to R15. + +R14 was the "v3.0 release round." A–E landed excellent hardening (D's identity-continuity seam, B's +alias-reader retirement + `queue_night` hero + 19-bookmark tour audit, A's 400-seed invariant sweep + §v3 +freeze, C's adversarial venue audit, E's provenance freeze) **but Lane F never ran** — so v3.0 was not +tagged and F's whole release brief (continuity wiring, alias deletion, week soak, the tour, the tag) was +untouched. Fable carried it verbatim into R15. Nothing F-authored landed in R14. + +## 15. Round 15 — THE v3.0 RELEASE CLOSE (`?gigs=1`). F ran last; the six-item brief, all green. + +A first (poster flip + golden re-pin) → B/C verify → D one-line amp move → **F closes**. All deps were in +before F ran (verified against origin). The six F items (ROUND15 §Lane F), each committed atomically by +pathspec: + +1. **Continuity wiring + smoke** (ledger #3) — D published the seam in R14; F wired its three touches: + `crew.spawn(…, { roster: rosterOf(shop.id) })` in `interior_mode.js` (front crowd slots become tonight's + roster), `rosterOf:(id)=>citizens.tonightRoster(id)` + `onAdmit:(e)=>citizens.recordVenueEntry(id,e)` on + the queue in the shell (the clear is automatic on `setGig(id,false)`). New `smoke_continuity` asserts the + seam on **identities** (crowd ⊇ roster ∩ cap · every `member.pedIndex ∈ tonightRoster` · `crewInfo.fromRoster`), + the empty-roster path injects nobody (shell side of D's byte-identical law), and **settled tris** + (ledger #5). Commit `687d23f`. +2. **Alias deletion** (ledger #2) — the R12 single-venue scalar alias is **gone**; every read is keyed by + `venueShopId`. Deleted the alias block + `primaryId`/`P` in `gig_state.js`; migrated `flags_check.py` + + `gig_shot.py` (`.venueShopId→venueShopIds[0]` · `.state→stateOf(id)` · `.cover→coverOf(id)` · + `.bandName→bandNameOf(id)`); deleted the two CITY_SPEC §v3 alias sentences + added the omitted + `nightOf(id)`. B's R14 sweep left the cross-lane readers clean; only F's tools remained. One atomic + commit `146b5f3`. +3. **Full-week soak** (`tools/qa/week_soak.py`, opt-in `qa.sh --soak`, non-strict) — 7 nights × every playing + venue in one context: latch state per `plan.gigs` (dark venues quiet), cover **stamped per venue per + night** (debited once, re-entry free, due again next night), roster **clears per night** (no + accumulation), and geo/tex return to a **warmed baseline** across ≥20 cycles — a leak is unbounded + per-cycle growth; warm-up cache residue **plateaus** (the memTrail proves it). Commit `edc0c47`. +4. **The money-shot tour** (`tools/qa/tour_shots.py`, ledger #4/#5) — one deterministic run → `docs/shots/ + release_v3/` + `contact.html`: `venue_night`, `district_posters`, **`queue_night` (John's hero — A's + flipped frontage poster now reads from the street)**, `gig_interior` (4-piece + real instruments + a + roster crowd), `rain_verandah`, `tram_stop`. **Settled discipline**: measured after the async instrument + GLBs / posters / chunks land (shoot-twice), clean per-group loads; queue driven **live** (explicit admits, + not throttled rAF auto-drain). Commit `6a35b29`. +5. **Docs assembly** — README v3 section (what shipped · flags table · the tour), this §14/§15 runbook, + F-progress current, the five freezes confirmed committed (A `a3911a4`/`35da83c`, B `eee60e0`/`a0b5784`, + C `62e38c5`/`2446ae3`, D `9a65f51`/`66aec0f`, E `55f6698`). +6. **Acceptance + tag** — `qa.sh --strict` 6/6 + `smoke_continuity` + `week_soak.py` green → tag **`v3.0`**. + +### Numbers (measured, seed 20261990 → "Boolarra Heads", 3 venues) +| thing | number | +|---|---| +| district | 3 venues — 2 playing (The Exchange Hotel `gig-pubrock` + an RSL `gig-covers`), 1 dark | +| gig interior, settled | 4-piece · crowd 8 (2 from the roster) · **56 draws** · **35k→182k tris** (pre-load→settled; gate is draws ≤350) | +| street @ venue block, night | `queue_night` 121 draws / 62k tris · `district_posters` 186 / 134k (busiest) — all ≤300/200k | +| week soak | 28 enter/exit cycles · $60 covers · geo/tex flat across the back half (115/86→115/84) · 0 errors | +| continuity seam | 2 queue admits carried into the crowd · empty roster 0-injected · `member.pedIndex ∈ tonightRoster` | +| **settled-tris honesty** (ledger #5) | C was right: the interior settles to **~182k** tris after the 5 instrument GLBs load, not the ~34k measured pre-load | + +### The gotcha ledger closed this round +- **Alias retirement is a three-party move**: B swept cross-lane readers (R14), A left the spec sentences + for F (avoiding a doc-ahead-of-code race), F deleted the code + migrated its own tools + the spec in ONE + commit. No half-renamed state ever existed. +- **Settled measurement** (ledger #5): a headless smoke that reads `renderer.info` right after `enterShop` + sees the room BEFORE its async instrument GLBs decode — ~34k, not the ~182k settled truth. The tour + the + continuity smoke both wait/shoot-twice now; the interior gate stays on **draws** (which is load-order + stable), so there was never a budget violation, only a dishonest number. +- **Drive live-spawned things explicitly**: automation throttles rAF, so the queue's seeded auto-drain may + not fire on schedule — `smoke_continuity`/`week_soak`/`tour_shots` all call `admitOne()` / step the loop + explicitly rather than trust the timer.