153 lines
10 KiB
Markdown
153 lines
10 KiB
Markdown
# 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: F→all "flip landed, gates
|
||
renamed"; A→B/F the new golden; C→D the backline shape; E→D "sit.glb on depot"; B→F 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).
|