Go to file
m3ultra 9c9ad730a3 Lane A round 22: CITY_SPEC v4 amendments final + charter risk-list retired-or-carried (ledger #6)
Docs-only; no output change, no golden moves (selfcheck 161,300/161,300 green before and after).

THE DRIFT THIS CLOSES. Three gig-layer behaviour changes had reached only my lane notes, never the
spec — the amendment law says the spec is where they live:
- ROUND20 ledger #2: the R16 facade-clearance bias WIDENED from band_room/rsl to every venue kind (line
  312 still claimed band_room/rsl). A real road graph at E's density can put a PUB's facade over a cross
  street; synthetic pubs always clear, so it stayed a no-op there.
- ROUND21 ledger #1: the venue cluster bias was never written down at all. Now recorded with the
  measurement (11 of 15 venues under the floor -> 0; Newtown's RSL 2,228m -> 29m from the hub) and the
  by-construction gate (, which synthetic never sets — measured, not assumed).
- ROUND22 ledger #2: the graded fallback (densest-available where the floor is unreachable).
Also documented the pick ORDER, which no lane could have inferred: cluster field -> kind flavour ->
clearance filter -> farthestFirst -> seeded pick, each degrading to the previous set.

CITY_SPEC v4 section marked FINAL at the tag: the alpha's five towns became the epoch's 23 (1,210
shops) and every ruling held with no new hardening. 'All five towns' now reads as the measurement of
record when the ruling was written; the ruling is pack-wide.

THE RISK LIST, line by line, judged against the full pack rather than the 5-town sample it was written
for (V4_REAL_MAP.md):
1. RETIRED — bbox law enforced with headroom: widest is geelong at 3,829m, 77% of the 5km ceiling.
2. RETIRED — the floor never bound: thinnest is darwin at 12 shops, 2x MIN_TOWN_SHOPS. (Whether 12
   shops READS alive is D's thin-tail check, not a generator risk — different question, still live.)
3. RETIRED plan-side; CARRIED for the runtime lanes. The alpha's real risk paid off exactly as
   intended (it surfaced fragmentation, capacity, stranding — each fixed-or-fenced). But a green plan
   is not a green town: C's soak, D's fitzroy audit and F's matrix are the verifies that close it.
4. RETIRED — the DP knob is at a measured setting: 1 component on all 23.
5. Unchanged, now on 23 towns not 5.
6. NEW, CARRIED — thin-graph seating capacity: 6.4% of shops don't seat (77/1,210), all counted by
   cause; daylesford 19% (32 shops on 171 roads), fitzroy 13%. Levers are spent at RGAP 0.5m /
   NODE_CLEAR 3m; the only one left puts a shop on a road it isn't on. R20 ruling stands: drop and
   count beats teleport. Carried into v4.x measured, not hidden.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 22:01:31 +10:00
docs Lane A round 22: CITY_SPEC v4 amendments final + charter risk-list retired-or-carried (ledger #6) 2026-07-16 22:01:31 +10:00
pipeline Lane E R22 (v4.0): MODELBEAST notes refresh + provenance v4-final + G2a atlas review 2026-07-16 21:54:49 +10:00
priorwork Fable (integrator): round-3 lane instructions + archive round-1 lane prompts 2026-07-14 14:30:36 +10:00
tools Lane F R21 (v4.0-beta close): the beta gate — tram dimension, the re-measure, the beta shot 2026-07-16 21:37:04 +10:00
web Lane A round 22: absorb the town pack — 23 towns, 36 goldens pinned in one commit (v4.0, ledger #2) 2026-07-16 21:55:05 +10:00
.gitignore Fable: R14 kickoff rulings recorded (push done, flag stays opt-in, genres final) + gitignore local session files 2026-07-16 00:59:42 +10:00
B-progress.md Lane B (Streetscape): round-12 v3.0-alpha — venue frontage + posters + muffled-gig spill (?gigs=1) 2026-07-15 20:15:40 +10:00
C-progress.md Lane C R21 (v4.0-beta): the five-town density door-soak (ledger #3) 2026-07-16 21:05:17 +10:00
D-progress.md Lane D round 12: gig band + crowd + patronage surge (?gigs=1) 2026-07-15 19:49:07 +10:00
E-progress.md Lane E R12 (v3.0-alpha gig layer): 5 instruments + 4 posters + 3 gig audio 2026-07-15 19:44:48 +10:00
F-progress.md Lane F R21 (v4.0-beta close): the beta gate — tram dimension, the re-measure, the beta shot 2026-07-16 21:37:04 +10:00
G-progress.md Lane G (GODVERSE, ultra) R1: real-shop census adapter — 18 real Newtown shops on the real road graph 2026-07-16 20:19:14 +10:00
README.md Lane F R21 (v4.0-beta close): the beta gate — tram dimension, the re-measure, the beta shot 2026-07-16 21:37:04 +10:00

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." AE are parallel-safe (disjoint files, standalone test pages); F integrates after they land.

lane mission owns
A — CITYGEN seed → CityPlan data (streets, blocks, lots, shops) + 2D map js/citygen, js/core/registry.js, map.html
B — STREETSCAPE chunk-streamed instanced 3D town + game shell index.html, js/world
C — INTERIORS every door opens: seeded themed shop interiors js/interiors, interior_test.html
D — CITIZENS rigged-near / impostor-far NPCs + shopkeepers js/citizens, citizens_test.html, models/
E — ASSETS audit ultra's library, normalize GLBs, skins, manifest pipeline/, assets/
F — INTEGRATION wire AE into one seed-to-town game + QA gates (after AE)

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 24 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-beta — the five towns, at density

Five real Australian towns (Katoomba, Newtown, Fremantle, Bendigo, Castlemaine — 292 shops) boot on their actual OSM street graphs, at real retail density: secondhand heroes keep their footfall while the street around them gets ~4× busier (texture, never a takeover). Venues bias toward the retail cluster, the tram runs only where it fronts a real high street (Newtown/Castlemaine — elsewhere it was "a highway bus", so it's fenced), and the in-HUD town selector reads the towns index, so you can just pick one. Every town: deterministic, districted, silent under ?noassets, ?classic=1 still byte-identical to v2. See docs/shots/v4_beta/ and the charter, docs/V4_REAL_MAP.md. | ?seed=N | 20261990 | town seed |

Release tour: docs/shots/release_v3_1/contact.html — 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.