diff --git a/docs/LANES/ROUND41_INSTRUCTIONS.md b/docs/LANES/ROUND41_INSTRUCTIONS.md new file mode 100644 index 0000000..948f288 --- /dev/null +++ b/docs/LANES/ROUND41_INSTRUCTIONS.md @@ -0,0 +1,160 @@ +# PROCITY — Round 41 instructions (from Fable, integrator) + +Date: 2026-08-07 · **R40 closed green** (12/12 gates, `c3384b9` pushed, goldens `0x5f76e76`). +**Theme: THE LIBRARY LANDS.** John: *"we have heaps new furniture clothes ppl animations +heapppppppps animations in our library — take a look and mega update our game."* Fable surveyed +the fleet. The survey is the ground truth for this round; its numbers are quoted below and must be +re-measured, not re-quoted, before anyone acts on them. + +## The finding that defines the round + +**PROCITY ships 8 animation clips.** `idle · walk · sit · look · dance_drink · dance_medium · +dance_party · dance_sway` — skeleton-only GLBs, 66 mixamorig nodes, loaded by +`rigs.js:69 loadPedFleet()`. + +**The fleet holds 6,866 licence-clean clips** in ultra's `~/Documents/MOTIONLIB/green/` +(2,394 Mixamo FBX · 2,548 CMU BVH · 1,620 100STYLE BVH · 304 ACCAD BVH), and +**`~/Documents/MIRPAMO/` is a working local Mixamo** (`./bin/mirpamo batch .glb -o +out/`, headless Blender, no cloud). **The skeletons match 1:1** — 66 mixamorig nodes both sides; +retarget output is byte-shaped like the existing `idle.glb`. The Mixamo bank alone holds **237 +idle variants · 270 walks · 140 sits · 163 greet/point/wave · 113 dances · 112 push/pull/pick/reach +· 63 carry**. Every non-walking citizen in the game today plays the same idle. + +Plus: **45 record-shop fittings that pass the house law untouched** (`~/Documents/3dstore/`, +~300 tris median, metre-correct), **60 DJ-gear GLBs, 45 of them control-rigged** (working +`Fader_CROSS` / `Platter_SPIN` / `Btn_STARTSTOP` node contracts), **48 pub/venue props** at 200k +tris needing a 40× decimation, and **441 hand-prompted 1990–99 Australian garment PNGs** from +wardrobegod (174 tops / 119 bottoms / 69 shoes / 66 hats / 12 bags). + +## INTEGRATOR RULINGS — binding, no lane may reinterpret them + +1. **🔴 THE BANDAI HAZARD IS CLOSED BEFORE ANY RETARGET RUNS.** m3ultra holds 3,077 **CC BY-NC** + (non-commercial, never shippable) Bandai-Namco BVH at + `~/Documents/MIRPAMO/library/downloads/bandai_namco_1/` — in a neutrally-named path, outside + ultra's `red/` zone system, with nothing in the filename marking it. It is **one + `mirpamo batch` away from a shipped build.** Lane E-motion's FIRST action, before touching any + clip: zone it (rename with the `_NC-research` suffix per the house rule, or delete in favour of + ultra's correctly-zoned `red/bandai/`) and reconcile `MIRPAMO/library/manifest.json`'s wrong + `CC-BY-NC-ND` label against ultra's corrected `SOURCES.md`. Report it done with the paths. +2. **R41 clips come from the MIXAMO bank only.** Mixamo is usable inside games with **no + attribution requirement** — the only rule is never redistributing clip packs, and retargeted + per-character clips inside the game are explicitly fine. CMU/100STYLE/ACCAD are all attribution- + bearing; they are a later round's work, after the credits surface exists (41.5). One licence + regime this round. +3. **A DENY-LIST enters the repo law.** These never enter `web/` under any circumstance: + `character_kit_modular/exports/bodies/**` (44 bodies, 30 named `-nsfw`, 465k tris each, broken + 0×0×0 bboxes) · any `anatomy/` dir · `elsa_coronation_hair_wig_kh3.glb` (Disney/Square Enix IP + rip) · `daphne_sexy.glb` (unverified rip) · `~/Documents/mocaponline/**` (vendor demo packs, + licence unread, includes Epic's EULA-bound `SK_Mannequin.fbx`). No wildcard copies from any + library — every asset enters by name. +4. **THE STREET BUDGET IS SPENT: 291/300 at night, nine draws.** No lane adds a street-side prop + this round. Every asset in R41 lands **interior** (margin 162) or is **zero-draw** (clips are + skeleton-only, 0 tris). Any street-side proposal gets measured and filed to R42, not shipped. +5. **Never run `gltf-transform optimize` on the DJ gear.** It collapsed a 696-node mixer to 25 + nodes and deleted `Fader_CROSS`. Decimate only, and verify the node contract survives. +6. **Clip delivery is GROUPED, not 40 files.** A GLB holds many animations; boot fetch count is a + budget. Deliver **≤6 grouped clip GLBs by category** with a documented index, not one file per + clip. + +## The ledger + +### 41.1 — THE MOTION LIBRARY *(Lane E, motion half — the critical path, starts first)* +Ruling 1 first, then: pick and retarget **~40–48 clips** from `green/mixamo_full` through MIRPAMO +onto PROCITY's ped rig. Pick for what this game actually is — a shopping town with shops, benches, +a pub, and citizens who currently only walk and stand: +- **Idles (8–10 distinct)** — `Breathing_Idle`, `Big_Yawn_While_Standing`, `Sit_With_Fidgeting_Feet`, + cocky/hip-lean variants: the clone-army killer. +- **Browse/shop (6–8)** — `Examine_Forwards`/`_Backwards`, `Holding_An_Object_Idle`/ + `_While_Walking`/`_While_Turning_Left`/`_Right`, `Closing_Cabinet_Door`, `Carrying_A_Box`. +- **Sit/lean (6–8)** — `Little_Girl_Sitting_On_A_Bench_Swinging_Her_Legs`, + `Leaning_Against_A_Wall_With_Various_Postures`, `Legs_Crossed_Leaning_On_Object`. +- **Social (6–8)** — `General_Conversation`, `Having_A_Chat_At_The_Watercooler`, + `Greeting_While_Standing`, `2_People_Shaking_Hands_Part_1/2` (a matched pair — keep them paired), + `Nodding_Head_Yes`, `Shaking_Head_No_Dismissively`. +- **Locomotion (4–6)** — walk variants + the `45/90/135/180_Degree_{Left,Right}_Turn` set. +- **Venue (4–6)** — better dances, clapping standing/seated, cheering. +Deliver: ≤6 grouped GLBs under `web/models/clips/`, a **new** `web/assets/motion_manifest.json` +(new file — no race with props' manifest.json) indexing clip→group→category→duration→loopable, +provenance in AUDIT.md, and MIRPAMO's `make smoke` green. Watch the documented gotcha: Blender 5 +FBX export flattens slotted actions — feed GLB/BVH or use `strip_skin.py`. + +### 41.2 — THE FITTINGS *(Lane E, props half — parallel with 41.1, disjoint files)* +1. **`~/Documents/3dstore/` — 45 of 46 GLB pass the house law as-is** (~300 tris median, metre + scale, no Draco, no textures). Re-verify with `glb_stat.py`, bring them in by name, manifest + them with footprints for C. Reject `3dmrp.glb` (499,948 tris). **This is the round's cheapest + win — do it first.** +2. **DJ gear (ultra `3D=models/dj-gear/`, 60 GLB)** — 18 already ≤5k; normalize the rest + (decimate only, ruling 5), **verify the `Fader_*`/`Platter_SPIN`/`Btn_STARTSTOP` node contract + survives on every rigged model** and state the check. Manifest them with their control-node + names so C/D can drive them later. +3. **Pub/venue props (`~/Documents/not-tonight/art_incoming/`, 48 GLB @ ~200k tris)** — 40× + decimation through `normalize.py`. Content is exactly pub/cafe/milkbar (pokie, jukebox, keg, + bain-marie, pie warmer, banquettes, ashtrays, sandwich board). Skip the 6 `staff*.glb` — they + are 200k-tri statues with no skin, no anims, no materials. +Publish to the depot over the tailnet path, sha1-verify, run the R40 transmission gate over every +new asset (it now scans all four surfaces — prove it stays green). + +### 41.3 — THE CITIZENS COME ALIVE *(Lane D — after 41.1 lands)* +Wire the clip library into the fleet. `rigs.js loadPedFleet()` and the sim's state machine are +yours. +- **Per-citizen deterministic idle** from the new pool — seeded by identity, so the same citizen + always stands the same way and the street stops looking like one person copy-pasted. +- **A real BROWSE state** for the interior browsers (they currently stand): examine/hold/reach at + C's browse points, seeded per browse point. +- **Sit and lean** on the street furniture that already exists (benches, shopfronts) — this is + where sit/lean clips earn their keep; keep it zero-draw (a seated ped is a ped that was already + drawn). +- Keep memory bounded and **state the numbers**: clips resident, fetch count at boot, heap delta. + Determinism law holds — same seed, same crowd, same postures, byte-equal across two runs. +- Everything gated so `?noassets=1` still runs (the 8-clip path must survive as the fallback). + +### 41.4 — THE SHOPS GET THEIR STOCK *(Lane C — after 41.2 lands)* +Place the new fittings. Interior margin is 162 draws — spend it deliberately and report the worst +room after every change. +- **Record/opshop/book/video/pawn/stall**: the `3dstore` tubs, crates, wooden racks, stackable + `mos-japhop` units, library trolley, `vinylsleeve_v5`, window booth. +- **Pub/cafe/milkbar**: the decimated venue props — this is the set that finally furnishes the pub. +- **Record shop + gig venue**: the DJ gear (turntables, mixers, the 808/SP-1200/MPC) as hero props. +- **The wardrobe PNGs** (441 garment layers, `90sDJsim/web/world/media/doll/`): route R5 — use them + as op-shop rack textures and shelf stock art at **zero geometry cost**. Period-correct Australian + 1990s naming is the whole point; keep the names visible where the game shows item text. +- Every recipe change re-runs your sweep + soak: 0 throws, 0 path-fails, 0 leaks, draws ≤350. + +### 41.5 — THE CREDITS SURFACE *(Lane B — small, and it unlocks future rounds)* +PROCITY has no attribution surface. R41 ships Mixamo only (no attribution debt, ruling 2) — but +CMU/100STYLE/ACCAD are 4,472 more clips waiting behind exactly this. Build it now: a credits panel +(the flag/selector UI idiom you already own), fed by a data file lanes append to, listing asset +sources and their licences. Zero draws in-game, classic-gated by construction. Then R42 can spend +the CC-BY libraries the day it wants them. +**Also yours, filed from R40:** A's D3 — `SHOP_REGISTRY` is missing pub/band_room/rsl, so 81 venue +lots corpus-wide wear op-shop signage (`buildings.js:465`). Cosmetic, measured, and it will show in +every pub shot this round takes. + +### 41.6 — INTEGRATION AND PROOF *(Lane F — last)* +Wire what needs wiring, gate what needs gating, and **prove the round with pictures** — this is the +first round in a long time whose whole point is visible. New/extended gates: clip-manifest +integrity (every referenced clip resolves), citizen-posture determinism (two runs byte-equal), +interior draw budget with the new fittings, `?noassets=1` still clean, deny-list compliance (no +banned path ever referenced from `web/`). Re-shoot the tour: a busy street with citizens in +*different* postures, a browsing interior, the furnished pub, the record shop with real gear. +`qa.sh --strict` green, budgets restated, goldens unmoved. **No tag** — John's playtest session +rules on the epoch. + +## Laws + +Everything standing, plus rulings 1–6 above. Highlights: measure the thing, not the note about the +thing · pathspec-atomic commits, **no git commands from lanes** — the integrator commits at close · +fresh browser contexts · human-sized line on humanoid shots · every gate ships its control +demonstrated · budgets are numbers. + +## Order + +1. **Wave 1 (parallel):** E-motion (41.1, ruling 1 first) · E-props (41.2) · B (41.5). +2. **Wave 2 (parallel, after their inputs land):** D (41.3, needs 41.1) · C (41.4, needs 41.2). +3. **Wave 3:** F (41.6). + +## For John + +Nothing blocks this round. Still parked for the playtest session: the op-shop bin's contents · fog +default-on vs mode · v9's third layer · **the audio listen pass** (nobody in this loop has ears). +The F8 notepad and `?bugtour=1` are live and waiting.