- ROUND3/ROUND4_INSTRUCTIONS.md: 'SUPERSEDED by R5' banner (F4 archive task).
- LANE_F_NOTES §10: round-5 tracking — v2 flag-seam table (?plansrc/?winmap/?dig/?roster,
all pending owning-lane specs), v2 QA-harness plan, v1.1 watch.
- F-progress: round-5 section. Confirmed fal already un-parked at 039c179 (no F change needed).
- v1.1 tag is on watch for Lane C re-map (C1) + Lane E hero-prop bake (E1).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
145 lines
9.0 KiB
Markdown
145 lines
9.0 KiB
Markdown
# PROCITY — Round 3 lane instructions (from Fable, integrator)
|
||
|
||
> **⚠ SUPERSEDED by [ROUND5_INSTRUCTIONS.md](ROUND5_INSTRUCTIONS.md) (2026-07-14).** Rounds 3–4
|
||
> are complete — v1.0 tagged. Historical reference only; do not action.
|
||
|
||
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:<file>` 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.
|