# 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. **The depot publish is DONE** (2026-07-14): all 16 GLBs + thumbs live on 3GOD, verified `validate_manifest.py --depot` → 0 errors. The depot is now reachable **passwordless over tailnet** from allowlisted boxes: `GOD3_DEPOT=http://100.94.195.115:8788` (this box `100.89.131.57` is allowlisted; `GOD3_PW` only needs any non-empty placeholder). Public `digalot.fyi/3god` stays read-only+locked. Gotchas fixed in the pipeline scripts: `/api/thumb` wants JPEG keyed by the **GLB** name; Cloudflare 403s the `Python-urllib` user-agent. **Lane F: add `--depot` to the qa.sh manifest gate now.** 5. **Hero props: free-first on MODELBEAST — the local path is READY, no setup needed.** The round-2 "HF-gated, setup needed" note is stale: `sf3d` (3.7 GB) and `TRELLIS.2-4B` (14 GB) weights are already cached on this box with working venvs. Do not spend the ~$2.70 fal.ai batch up front; it's the fallback for local rejects only. ## 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) — hero props on MODELBEAST + local depot mode Publish is **authorized** but John runs it himself (`GOD3_PW`): record the per-asset provenance list in AUDIT.md first, then hand him the two-liner. Your new headline task: 1. **Hero props, free, on-device.** The `meshgod_batch.json` gap list (glass case, fridge, till, listening booth, …) now goes through MODELBEAST instead of fal.ai: `gen_skins.py`-style concept images via `flux_local` (proven on the facades) → `trellis_mac` image→GLB (`1024_cascade`, ~3–5 min/gen; use `sf3d` for seconds-fast drafts to iterate the concept image before committing to a TRELLIS run) → `normalize.py` house law → thumbnails → manifest. Weights are already cached (verified 2026-07-14); both operator venvs exist under `~/Documents/MODELBEAST/server/operators/`. **Eyeball every thumbnail**; anything unusable after 2 local attempts goes on the fal.ai fallback list (still gated, ask John — budget ≤$2.70 total). First check the DealGod cache / depot for reuse (cash-register + glass-case may exist). 2. **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/without the depot. Keep the placeholder-on-miss behaviour. 3. Support Lane C's visual validation — fix any origin/footprint mismatch they report (your normalize.py now handles hierarchies; re-run per asset). 4. 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. ## 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~~ — **done** (2026-07-14, Fable). - ~~Run the depot publish~~ — **done** (2026-07-14, John + Fable, via the tailnet path). - **fal.ai spend**: only if MODELBEAST hero-prop rejects need it (≤$2.70, per-prop go). - **A real pointer-lock playtest** (after the current Opus round, per John) — `cd web && python3 -m http.server 8130` → http://localhost:8130?seed=20261990.