The blocking gate is CLOSED, and the epoch closes green. - #1b THE BLOCKING RE-MEASURE: F's R21 re-measure made the tri diet blocking; B diagnosed layer-by-layer, the driver traced A -> E (A's own commit: "B's numbers say the fix is E's"), E fixed it, F re-measured: katoomba venue_night 221,935 (+11%) -> 108,365 (-51%); bendigo 201k -> 124,682; fremantle -> 88,397. Worst 124,682 — the 200k stress edge is closed. The measure-first loop worked end to end. - #3 DBG.enterShop(selector) (Lane G's ask): id · registry type · exact name · name substring, resolved most-specific-first so an id-shaped string can't be shadowed. One-liner QA on any of 23 towns. - #4 The release tour -> docs/shots/release_v4/: the Fremantle hero · the Fitzroy mecca · the Toowoomba thin tail · the synthetic control · the ?classic=1 covenant. Every real-town frame poses through F's R21 cluster primitive; B's R22 bookmarks anchor on the same retail heart, so tour and bookmarks agree by construction. HUD hidden throughout (F's R21 ruling corollary). The primitive earned itself twice: the first cut posed via street_noon and the MECCA CAME OUT AS BARE BITUMEN — the same trap as R21. Re-posed through the cluster, Fitzroy reads. - HONEST FINDING (filed v4.x): the brief asked for the thin tail as "proof the floor holds". It does not, and the frame says so — Toowoomba reads as an empty road. The floor is a RATIO, not a count: 0.008 shops/edge vs the heroes' 0.06-0.08. Shipped labelled honestly rather than swapped for a flattering town. - #6 Docs: README v4 section (the towns ARE the product), LANE_F_NOTES §22, F-progress. qa.sh --strict --matrix GREEN 7/7; MATRIX GREEN — 10 towns × 7 gates (the budget gate green everywhere for the first time); selfcheck 161,300/161,300 (A's 36 goldens + the 23-town pack). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
106 lines
7.3 KiB
Markdown
106 lines
7.3 KiB
Markdown
# PROCITY
|
||
|
||
A standalone, procedurally generated, fully walkable 90s-Australian shopping town — every
|
||
building enterable (the Vuntra City trick), every interior seeded and themed: record stores,
|
||
op shops, toy shops, book barns, video rental, pawnbrokers, milk bars, market stalls. Built on
|
||
the proven house stack (three.js r175 vendored, plain JS, no build step) and the asset DNA of
|
||
90sDJsim + thriftgod. v1 is the *system*; the GODVERSE/BaseGod real-item content plugs in later.
|
||
|
||
## Run
|
||
|
||
```
|
||
cd web && python3 -m http.server 8130
|
||
# http://localhost:8130 (game shell — Lane B)
|
||
# http://localhost:8130/map.html (2D plan debugger — Lane A)
|
||
```
|
||
|
||
## Read first
|
||
|
||
- **`docs/CITY_SPEC.md`** — the treaty: schema, units, seeds, budgets, file ownership.
|
||
- **`docs/RESEARCH.md`** — what the parent repos already solved, with exact paths to port from.
|
||
|
||
## The lanes (parallel Opus 4.8 sessions)
|
||
|
||
Each lane is a self-contained prompt. To run one, start an Opus session in this repo and say:
|
||
**"Read docs/LANES/LANE_X_….md and execute it."** A–E are parallel-safe (disjoint files,
|
||
standalone test pages); F integrates after they land.
|
||
|
||
| lane | mission | owns |
|
||
|---|---|---|
|
||
| [A — CITYGEN](docs/LANES/LANE_A_CITYGEN.md) | seed → CityPlan data (streets, blocks, lots, shops) + 2D map | `js/citygen`, `js/core/registry.js`, `map.html` |
|
||
| [B — STREETSCAPE](docs/LANES/LANE_B_STREETSCAPE.md) | chunk-streamed instanced 3D town + game shell | `index.html`, `js/world` |
|
||
| [C — INTERIORS](docs/LANES/LANE_C_INTERIORS.md) | every door opens: seeded themed shop interiors | `js/interiors`, `interior_test.html` |
|
||
| [D — CITIZENS](docs/LANES/LANE_D_CITIZENS.md) | rigged-near / impostor-far NPCs + shopkeepers | `js/citizens`, `citizens_test.html`, `models/` |
|
||
| [E — ASSETS](docs/LANES/LANE_E_ASSETS.md) | audit ultra's library, normalize GLBs, skins, manifest | `pipeline/`, `assets/` |
|
||
| [F — INTEGRATION](docs/LANES/LANE_F_INTEGRATION.md) | wire A–E into one seed-to-town game + QA gates | (after A–E) |
|
||
|
||
## Already in the repo
|
||
|
||
- `web/vendor/` — three.js r175 + addons (vendored from 90sDJsim; no CDN at runtime).
|
||
- `web/assets/gen/` — 69 generated texture skins (25 shopfront facades, 10 skies, 10 grounds,
|
||
8 wallpapers, 16 interior surfaces) inherited from thriftgod + 90sDJsim, style-locked.
|
||
- `web/js/core/` — frozen shared modules: `prng.js` (seeded-everything law), `loaders.js`
|
||
(fail-soft promise-cached GLB/texture + 3GOD depot), `canvas.js` (text planes).
|
||
|
||
## House laws (short form — CITY_SPEC has the fine print)
|
||
|
||
Seeded everything, `Math.random` banned in gen code · the game must run with zero assets ·
|
||
instancing from day one · canvas text, no font files · characters = shared base rigs + one
|
||
clip bank, canonical sources live outside this repo · 🟢 web-ok licensing only.
|
||
|
||
## v3.1 — THE FLIP: the town shows its best by default
|
||
|
||
The Friday-night layer soaked through alpha, beta, and the v3.0 release — so **v3.1 flips it on by
|
||
default**, and the mature v2 flags flip with it. Boot the plain URL and each town seeds **2–4 venues**
|
||
(pub, band room, RSL) with a **full seeded week of gigs**, town-wide **posters**, and a Friday night that
|
||
reads: a **4-piece band** (trio + a **seated drummer**) with real instruments, a mixed **crowd**, an
|
||
outdoor **queue**, a per-venue **cover charge**, muffled **gig spill** + **walla and applause**,
|
||
town-wide **streetlamp pools**, and **identity continuity** — the ped you followed in is in the crowd.
|
||
Plus **weather**, the **tram**, and the parallax interior-**window shader**, all live by default.
|
||
|
||
**The covenant moved, it didn't disappear.** `?classic=1` boots the **exact v2 town** — byte-identical
|
||
forever (synthetic golden `0x3fa36874`, zero gig layer, zero fetch delta). That is the new frozen
|
||
regression target; the default boot is deterministic to the gig golden `0xb1d48ea1`. Asset-free
|
||
(`?noassets=1`) composes with the default boot and stays silent-and-fine.
|
||
|
||
**Flags** — the four headliners are **ON by default**, each with a `=0` opt-out; `?classic=1` is the
|
||
master off:
|
||
|
||
| flag | default | what |
|
||
|---|---|---|
|
||
| `?classic=1` | off | **the exact v2 boot** — all four below off, byte-identical to the frozen baseline |
|
||
| `?gigs=0` | **on** | the gig district — venues, week schedule, band/crowd/queue, cover, posters, night pass |
|
||
| `?weather=0` · `?tram=0` · `?winmap=0` | **on** | seeded weather · the tram loop · the parallax interior-window shader |
|
||
| `?roster=v1` · `?pop=N` | stream | chunk-streamed citizen density is the baseline; `?roster=v1` restores the fixed roster |
|
||
| `?dig=0` · `?stock=real` | dig on | crate-riffle on record bins · real GODVERSE sleeves in the stock |
|
||
| `?noassets=1` · `?plansrc=osm` · `?mute=1` · `?dbg=1` | off | asset-free (zero network) · OSM plan source · silence · the `window.DBG` capture/soak harness |
|
||
| `?plansrc=osm&town=<key>` | — | boot a **real Australian town**: fixtures `melbourne`/`katoomba`/`silverton`, or a real OSM cache `bendigo_real`/`castlemaine_real`/`fremantle_real`/`katoomba_real`/`newtown_real` (ODbL, `web/assets/towns/SOURCES.md`). **REAL ROADS:** a cache with `roads[]` (schema v2) builds the CityPlan street graph from the town's **actual OSM streets**; without `roads[]` a cache marches onto synthetic avenues. Or just **pick a town from the HUD selector** — no URL needed |
|
||
|
||
## v4.0 — THE REAL MAP: the towns *are* the product
|
||
|
||
**23 real Australian towns — 1,210 real shops, every state and territory — on their actual streets.** Not
|
||
"inspired by": Fitzroy's shops sit on Fitzroy's roads, at their real positions, because the pipeline eats
|
||
OpenStreetMap and marches it through the same CityPlan contract the procedural town uses. **Pick one from
|
||
the in-HUD selector and walk it.** Everything built across v1–v3 comes along unchanged — the venues and their
|
||
seeded week of gigs, the 4-piece band with the seated drummer, the crowd that follows you into the pub, the
|
||
interiors behind every door, weather, the tram — because they all hang off the plan contract and never had
|
||
to know the geography got real.
|
||
|
||
The towns run from **meccas** (Fitzroy, 160 shops) to the **thin tail** (12), at real retail density: the
|
||
secondhand heroes keep their footfall while the street around them gets ~4× busier — texture, never a
|
||
takeover. Venues bias to the retail heart. The tram only runs where it fronts a real high street (elsewhere
|
||
it was honestly "a highway bus", so it's fenced). Everything stays **deterministic from the seed**, silent
|
||
under `?noassets=1`, and **`?classic=1` still boots the exact v2 town, byte-identical forever** (`0x3fa36874`).
|
||
|
||
**The tour:** [`docs/shots/release_v4/contact.html`](docs/shots/release_v4/) — the Fremantle hero, the
|
||
Fitzroy mecca, the thin tail (labelled honestly: the floor is shops-per-street-metre, and Toowoomba is
|
||
below it), the synthetic control, and the `?classic=1` covenant made visible. Charter:
|
||
[`docs/V4_REAL_MAP.md`](docs/V4_REAL_MAP.md) · data + licences (ODbL):
|
||
[`web/assets/towns/SOURCES.md`](web/assets/towns/SOURCES.md).
|
||
| `?seed=N` | `20261990` | town seed |
|
||
|
||
**Release tour:** [`docs/shots/release_v3_1/contact.html`](docs/shots/release_v3_1/) — the money shots on
|
||
the default boot, plus a `?classic=1` before/after. **QA:** `tools/qa.sh --strict` (classic regression +
|
||
default-boot gate + smokes + no-giants) `--soak` (the full-week soak); the seated drummer passes the
|
||
no-giants gate at the seated stature band `[0.9,1.5] m`.
|