PROCITY/docs/LANES/ROUND16_INSTRUCTIONS.md
2026-07-16 12:01:26 +10:00

153 lines
10 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 16 lane instructions (from Fable, integrator)
Date: 2026-07-16 · **v3.0 SHIPPED** — tagged and on origin (`0490bdd`), qa `--strict --soak`
7 passed · 0 failed · 0 warn. R15 was a model close: A's poster flip (a real R13-era bug — every
venue's own bill was on the back wall), B's hero verify + the John-sanctioned poster
night-emissive, D's amp move, C's clearance verify, and F's five-commit release close
(continuity wired, alias retired, week soak, the tour, docs). The R15 gotcha ledger is closed;
the settled-measurement discipline and the Z/+Z convention write-ups are now durable law.
Round 16 is **v3.1: THE FLIP** — the town shows its best by default. `?gigs=1` has soaked through
alpha, beta, and release; the flag flips ON, and the mature v2 flags flip with it. Plus the parked
polish that's earned its slot: the drummer finally sits, the streetlamps go town-wide, the backline
unifies, and the corner-poster tweak. Tag **`v3.1`** at close.
## The flip (Fable's ruling — John may veto any part at kickoff, see Standing)
**Defaults flip ON: `gigs`, `weather`, `winmap`, `tram`.** All four are mature (weather/winmap/tram
soaked since v2; gigs through three v3 stages). Each keeps an individual opt-out (`?gigs=0`,
`?weather=0`, `?winmap=0`, `?tram=0`), and a new **`?classic=1`** forces all four off at once.
**The prime law is REWRITTEN, not repealed — the covenant moves to `?classic=1`:**
- **Classic law:** the `?classic=1` boot is byte-identical to the v2 baseline **forever**
synthetic fingerprint `0x3fa36874`, zero gig layer, zero fetch delta vs the documented baseline.
This is the new frozen regression target; the old "flags-off" gate becomes the "classic" gate.
- **Default law:** the default boot is the full experience — plan fingerprint pins to the gig
golden (`0x4f4a549d`, or A's re-pin below), deterministic from citySeed, and every existing
smoke (district, continuity, cover, noassets) runs against the DEFAULT boot.
- `?noassets=1` composes with the default boot and stays silent-and-fine (custom_bands fetch and
all asset fetches gated exactly as today).
Everything else stands: determinism from citySeed · audio gesture-gated fail-soft · budgets
(interior ≤350 draws · street ≤300 / 200k) **now measured on the default boot, all four flags on,
at the busiest venue block — B re-baselines** · human-sized line · fresh contexts / no-store
server / drive live-spawned things explicitly · atomic commits by pathspec.
## The ledger
1. **The flip itself (F).** Shell defaults + `?classic=1` + the individual `=0` opt-outs, then the
harness: `flags_check.py`'s "flags-off regression" arms swap to **classic regression**
(`?classic=1` → byte-identical v2), a new **default-boot gate** (default fingerprint == gig
golden; gig layer present; 0 errors), and every smoke re-pointed at the default boot. qa.sh
gate names updated. This is the round's structural change — land it FIRST.
2. **The drummer sits (E produces, D wires).** E: fetch `Sitting_Idle.fbx` from the tailnet source
box (D's documented recipe, LANE_D_NOTES — the local `~/Documents/mixamo-fetch` path is stale),
convert to a mesh-free `sit.glb` (65-bone, raw `mixamorig:` naming is already canonical),
manifest + provenance + depot publish under John's R13 authorization. D: the shared-rig-stack
wiring — a `_rotWithHips` variant (keep `Hips.quaternion` + hip descent) + post-pose foot
re-plant in `spawnRig`, used ONLY by seated spawns; keepers/browsers/walkers must be
byte-identical (prove it — this touches the shared stack). Drummer retires `SEAT_DROP` and the
`m.seated` sink. **Bench-sit loiter from the same clip is the stretch goal** — only if the
drummer lands clean with round to spare.
3. **Seated-stature gate contract (F publishes in this brief — no mid-round handshake).** A seated
figure fails the no-giants floor by design. Contract: D tags seated figs
`fig.userData.procitySeated = true`; F's `interior_scale_check.py` + `flags_check.py` stature
asserts accept seated figs at **stature ∈ [0.9, 1.5] m** (still < ceiling, feet planted). F
lands the gate change in commit #1 so D can verify against it immediately.
4. **Town-wide streetlamp pools (B).** Ruling: the pools ride the **gig layer** (they're the v3
nightlife look classic boot stays pool-free, parity preserved by construction). Extend the
R13 instanced-pool pass from venue blocks to the town's streetlight/shelter positions
(furniture positions are in the plan read them, don't touch `furniture.js`). Night-driven as
now. Budget-stated: this is the likely draw-cost item of the round; if town-wide busts the
street budget at the busiest block, scope to main-street + venue blocks and say so.
5. **`stage.backline[]` unification (C, then D).** C exposes seeded backline poses (amp/spare-cab
positions up-stage, clear of all four bandPoses) and drops its primitive ampStacks from venue
recipes; D plants E's `guitar_amp` GLB (primitive fallback under `?noassets`) at `backline[]`
instead of its own hardcoded pose. One venue render each archetype to verify no
interpenetration (C's R15 clearance discipline).
6. **Corner-poster tweak (A).** R15 finding: a corner venue's frontage poster can sit near a
crossing street's kerb (seed 1 band_room, 1.58 m). Nudge the frontage poster ALONG the facade
away from the crossing-street end (stay on the facade plane, keep the `ry+π` read-from-street
fix). Moves `plan.posters` **the round's one sanctioned gig-golden re-pin** (amendment law,
same commit, tell B/F). Re-run the 400-seed sweep; keep the frontage-poster exemption honest
(assert distance-to-crossing-kerb some floor now that you control it).
7. **No-spine osm fixture (A).** The R14 sweep's honest gap: both osm fixtures have a main spine,
so `pickVenues`' no-spine branch is unproven. Build the minimal single-row fixture and add it
to the sweep.
Parked still (v3.2 backlog do not start): instrument `_lo` LOD (interior gate is draws; 182k
settled tris breaches nothing), `tram_stop` close-ped tri diet, wind sway, C's `audioEmitter`.
## Lane F — the flip, first and last (you bookend the round)
**Opening commit(s), before other lanes need the tree:**
1. Ledger #1 the shell flip + `?classic=1` + harness rework. The default boot is now the gig
boot; prove classic byte-identical (`0x3fa36874`), prove default == gig golden, all smokes
green on the default boot, `?noassets` silent-and-fine on the default boot.
2. Ledger #3 the seated-stature gate contract, same opening push.
**Closing, after all lanes land:**
3. Re-run everything: `qa.sh --strict --soak` (gates now classic+default), the week soak on the
default boot, and re-shoot the tour `tour_shots.py` shots become DEFAULT-boot shots (drop the
per-shot flag juggling where the default now covers it; keep `?classic=1` as one comparison
shot in the contact sheet "the town before/after v3"). New shots into `docs/shots/release_v3_1/`.
4. Docs: CITY_SPEC gets the v3.1 amendment (flip + classic law, coordinate with A), README flags
table updated (defaults + opt-outs + classic), LANE_F_NOTES §16.
5. Tag **`v3.1`**, push main + tag (standing authorization).
## Lane A — corner posters + the no-spine fixture
Ledger #6 (the flip-adjacent placement fix + golden re-pin) and #7 (the fixture). CITY_SPEC v3.1
amendment wording with F (you own the spec; F owns the flags table). Nothing else your sweep and
freeze machinery is exactly right as-is.
## Lane B — town-wide pools + the default re-baseline
1. Ledger #4 the pools, town-wide, gig-gated, night-driven, instanced.
2. **Default-boot re-baseline**: with F's flip landed, measure the busiest block on the DEFAULT
boot (gigs + weather-rain-worst-case + winmap + tram all live) worst draws/tris, stated in
your notes. This is the number the budget law now means. If rain + district + pools compose
over 300 draws, say so loudly that's a Fable scope call, not silent trimming.
3. Bookmark spot-check on the default boot (poses were framed against opt-in flags; weather/tram
now show up in old frames confirm nothing letterboxes or blocks).
## Lane C — the backline handoff
Ledger #5, C's half: `stage.backline[]` poses (seeded, clear of bandPoses + watchPoints), drop the
primitive ampStacks from the three venue recipes, publish the shape in LANE_C_PUB §3 (amend the
frozen doc v3.1 marker, same discipline as A's spec amendments). Verify with D once wired.
## Lane D — the drummer sits
Ledger #2 (wiring half) + ledger #5 (plant the amp at C's `backline[]`). The shared-stack proof is
the load-bearing part: keepers/browsers/walkers byte-identical before/after `_rotWithHips` (it
must be a parallel path, not a change to `_rotOnly`). Tag seated figs per ledger #3. Bench-sit is
stretch drummer first, prove it, then decide.
## Lane E — the sit clip + provenance
Ledger #2 (asset half): fetch convert `sit.glb` manifest + provenance + depot publish
(John's R13 authorization stands; flag it in your notes). Update the frozen provenance table with
a v3.1 amendment marker. On-call for B if the pool sprite needs anything (it shouldn't it's
procedural).
## Order
**F first** (the flip + gate contract the round's foundation; nothing else lands meaningfully
until the default boot exists). Then **A, B, C, E in parallel** (disjoint files; C before D on the
backline shape, E before D on the clip). **D** once C's backline + E's clip + F's gate are in.
**F last** (re-baseline acceptance, tour, docs, tag `v3.1`). Handshakes: Fall "flip landed, gates
renamed"; AB/F the new golden; CD the backline shape; ED "sit.glb on depot"; BF the default
worst-case numbers.
## Standing
- **John one decision, veto-by-kickoff:** the flip scope. Fable flips **gigs + weather + winmap
+ tram** ON by default (`?classic=1` preserves the exact v2 boot forever; every flag keeps an
individual `=0` opt-out). If you want any of the four to stay opt-in most plausibly `tram`
say so before F's opening commit; F implements whatever's standing when they start. FYI: the
gig golden re-pins once (A's corner-poster fix), and E publishes `sit.glb` to the depot under
your R13 authorization.
- **v3.2 backlog (parked):** instrument `_lo` LOD · tram_stop close-ped tri diet · wind sway ·
`audioEmitter` · full flag retirement (deleting the `=0` opt-outs once classic has soaked).