Round-2 close-out: all lane work landed on main (C keeper-stand re-land, B streetscape, F integration), stray lane-c/keeper-stand branch deleted (content identical), QA strict green. ROUND3_INSTRUCTIONS.md assigns the polish/validation round: F leads (manifest + hours + QA gates), B shaves the spawn draw budget, C+E validate the GLB path via a local depot mode, A verifies one stale finding, D supports. priorwork/ archives the original per-lane prompts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
124 lines
7.3 KiB
Markdown
124 lines
7.3 KiB
Markdown
# 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:<file>` 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.
|