# PROCITY — Round 3 lane instructions (from Fable, integrator) Date: 2026-07-14 · Written after all six lanes finished round 2 and Lane F's first two integration passes landed. Repo state as of these instructions: **everything committed on `main`**, `tools/qa.sh --strict` **GREEN** (4/4 gates, selfcheck 1283/1283, manifest 0 errors). ## Where we are v1 is **integrated and playable**: the game boots on Lane A's generated town (seed 20261990 → "Boolarra Heads", 493 shops), Lane B streams/renders it under budget, doors enter Lane C interiors, Lane D keepers greet at counters and peds walk the streets, Lane E's 48 facades + manifest are live, Lane F's bridge + QA harness tie it together. What remains is **polish, validation, and the last two integration steps** (LANE_F_NOTES §3.4/§3.5). ## Integrator decisions (so nobody blocks on them) 1. **Retail density stays at ~493 shops/core.** Lane B's facade atlas got the worst view to ~261 draws with citizens; no need to thin the town for v1. 2. **True closed residential ring → v2** (stays in V2_IDEAS). 3. **F finding #4 (doubled possessives) is CLOSED** — verified 0 across 2,418 shop names / 5 seeds on current main. It predated Lane A's round-1 fix. 4. **Depot publish and the ~$2.70 MeshGod hero batch remain gated on John** — do not publish, do not spend. Local validation paths below unblock everything else. ## Process rules (unchanged, they matter) - Lanes share ONE working tree. Never bare `git add .` / `git commit -a`. Stage **only your files by exact path** and commit immediately. Check `git status` first; touch nothing another lane has modified. - Real repo path is `/Users/m3ultra/Documents/procity` (old prompts say /Users/jing — wrong). - Update your `*-progress.md` at the end of your session; leave notes for other lanes in `docs/LANES/`. - Dev server: `cd web && python3 -m http.server 8130`. - Run `bash tools/qa.sh --strict` before you finish; leave it green. --- ## Lane A (CityGen) — on-call + one verification Small round. Priority order: 1. **Verify F finding #5**: "some shops have storeys outside the registry type range (e.g. video at 2, range [1,1])". Your round-1 `cornerBoost` gate (registry max ≥ 2) may already have fixed it — prove it on current main across ≥5 seeds. If real, fix + add a selfcheck assertion; if stale, mark it closed in A-progress. 2. Confirm the committed `GOLDEN.hash` matches the current selfcheck fingerprint (`0x098eec2b`). 3. Otherwise standby: answer contract questions from F's §3.5 hours work (your `openLate` / `hours=[open,close]` contract is about to get its first real consumer). ## Lane B (Streetscape) — draw-budget shave + hooks 1. **F finding #3 (the one open budget item): ~334 draws at spawn with radius 3.** Your radius-2 auto measure is ~261. Make the compliant configuration the default at spawn (radius 2 auto, or more merging if you'd rather keep 3) and re-measure the worst continuous-walk view **with citizens at pop 140** via `window.DBG`. Target: ≤300 everywhere, documented in LANE_B_NOTES. 2. **Confirm `scene.environment` is set** in all modes — Lane D's PBR peds go dark without it (F verified street mode works; check night + interior-return edge cases). 3. Support F's §3.4: when the manifest GLB upgrade lands, verify street furniture GLBs (benches, streetlight, food cart) place on their manifest footprints without collision regressions. 4. Optional polish: fresh `docs/shots/laneB/` stills of the *generated* city; wire `map` mode to Lane A's map.html. ## Lane C (Interiors) — GLB path visual validation Your `glb.js` path is wired but never seen pixels. Lane E's 16 normalized GLBs exist locally in `pipeline/_normalized/` — you don't need the depot publish. 1. Coordinate with Lane E's local-depot mode (below); flip `useGLB` on and **visually validate every fitting GLB in real rooms**: correct scale on footprint, base on floor, facing −Z, no z-fighting with primitive decor. 2. Re-run your sweep + soak with `useGLB` on: 0 throws / 0 path-fails / 0 leaks, perf still <50ms warm. GLB textures must dispose correctly on room exit. 3. Report any footprint/origin mismatches to Lane E by file name (they have 3 known near-miss assets already excluded). 4. Screenshot evidence into `docs/shots/` (a laneC dir is fine). ## Lane D (Citizens) — small support round 1. When F's §3.4 fleet upgrade lands, verify keepers upgrade from placeholder to shared GLB rigs and remain leak-free over enter/exit cycles (your dispose contract, F's loop). 2. Wire/document `ImpostorLayer.setExposure()` to the shell's day/night segment so mid-tier billboards match rigs at dusk (one paragraph + one verified call site with F). 3. Write the **chunk-streamed roster design note** (keyed `chunkKey+i`, stream with Lane B's chunk build/dispose) — design only, no implementation; it's the v1.5 fix for big-town street emptiness. ## Lane E (Assets) — local depot mode + near-misses Publish stays gated (needs `GOD3_PW` + provenance recording — John's call). 1. **Unblock local validation**: make `core/loaders.js` (or a manifest/URL flag, e.g. `?localdepot=1`) resolve `depot:` to the locally staged GLBs so Lanes B/C/F can validate before publish. Keep the placeholder-on-miss behaviour. 2. Support Lane C's visual validation — fix any origin/footprint mismatch they report (your normalize.py now handles hierarchies; re-run per asset). 3. Optional: manual Blender re-origin pass on the 3 near-misses (garage_shelves, radiogram, market_stall) if C wants more variety; otherwise leave to primitives. 4. Have the publish command + per-asset provenance list **staged and documented** so the moment John says go it's a 5-minute job. ## Lane F (Integration) — lead lane this round Priority order, per your own §3 plan: 1. **§3.4 Manifest + `?noassets`**: GLB upgrades from manifest.json through B (street furniture) and C (`useGLB`), using E's local-depot mode; includes the **rig-fleet upgrade** so keepers/peds share GLB meshes (then try raising `?pop=`). Verify `?noassets=1` still runs 100% primitive/fallback with zero network. 2. **§3.5 Hours / closed shops**: consume Lane A's contract — `hours=[open,close]` 24h ints, **exactly one `openLate:true` landmark per town** (closes ≥22:00). Closed shops: door locked + toast, lights/sign off after close; the openLate shop is the night destination. 3. **Browser QA gates 1–4,6**: `tools/shots.py` + `tools/soak.py` against `window.DBG` (B's dbg.js is committed). Capture the `docs/shots/v1_tour/` set. Re-measure budgets after B's shave; update the gate table in LANE_F_NOTES. 4. Keep the findings table current; anything cross-lane goes through a note in `docs/LANES/` + a line in the target lane's instructions, not silent edits (inline seam edits marked `[Lane F integration]` are fine where they're your seam). ## Needs a human (John) - **Push to origin** — main is now 10 commits ahead of origin/main (only the scaffold is pushed). - **Depot publish go/no-go** (needs `GOD3_PW`; E will have it staged). - **~$2.70 MeshGod hero-prop batch** go/no-go (pure polish; primitives cover everything). - **A real pointer-lock playtest** — automation can't engage pointer lock; `cd web && python3 -m http.server 8130` → http://localhost:8130?seed=20261990.