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>
6.1 KiB
PROCITY v4 — THE REAL MAP (epoch charter)
Fable, 2026-07-16. John's pick (R17 kickoff). Grounded in the R17 scout: 5 real AU town caches
boot through the full gate matrix — deterministic, in-budget, districts place, ?noassets silent.
The existing CityPlan contract eats real shop data. What it does NOT yet eat is real geography:
plan_osm marches real shops onto synthesized parallel avenues. v4 closes that gap.
The vision
Walk the actual main street of a real Australian town. Katoomba's real high street with its real secondhand shops in their real order, PROCITY's stylized look (this is not photorealism — the town is real, the rendering is PROCITY), the gig district, the citizens, the dig, the weather — everything shipped, on real bones. The default boot stays the synthetic town; real towns are a destination you pick.
The stages
- v4.0-alpha (R18): REAL ROADS, one town. Real OSM street geometry (simplified to the
CityPlan edge schema — straight segments, real topology) for
katoomba_real, shops seated along their real streets, everything downstream unchanged by contract. Opt-in via the town cache (schema v2 carriesroads[]; caches without roads keep the marched fallback). - v4.0-beta: the district on real bones, five towns. All scouted towns get roads; venues, posters, queue, tram(?), citizens proven on irregular graphs; the town selector (B) so a player can pick a town without URL surgery.
- v4.0: the town pack + the tour. A curated pack (~15–25 towns, E's bbox discipline), the release tour shot on real streets, docs, tag. Default boot still synthetic; flag-flip for real towns is a v4.x decision AFTER soak (the v3 pattern, proven twice).
The laws (inherited, plus two new)
Classic covenant untouched (?classic=1 byte-identical forever) · default boot untouched through
alpha/beta (real towns opt-in) · determinism from (town, citySeed) · budgets unchanged (≤300/200k
street, ≤350 interior) · asset law (cache fetch fail-soft; ?noassets falls back to fixtures) ·
amendment law for goldens · atomic pathspec commits · measurement over brief.
New — the bbox law (A's R17 risk #1): a town cache is ONE compact town (span ≤ 5 km,
validator-enforced); town selection discipline lives in E's pipeline, because the generator
cannot rescue an over-broad query. New — the ODbL law: every cache ships
license/attribution + SOURCES.md; raw Overpass responses are committed so re-runs never
re-fetch; only public POI/way data, never private-individual data.
The risk list (from the R17 scout, kept current)
- Mega-strip / over-broad bbox — mitigated by the bbox law; watch per-town.
- Sparse towns (< 6 shops) — curation floor;
MIN_TOWN_SHOPSenforced. - NEW, the alpha's real risk: irregular geometry downstream. B's chunks/buildings/furniture and D's sim have only ever seen A's synthetic graphs and the marched-avenue osm towns. Non-grid intersections, acute angles, short edges, dead ends — the alpha exists to surface exactly these. Every failure gets written down, fixed or fenced.
- Road simplification fidelity — too coarse reads wrong, too fine costs edges; A owns the knob.
- Settled non-risks: facade clearance on osm towns (R17), interior types (C proved 18 real
shop=values degrade cleanly), plan-side determinism (E's pipeline is byte-identical re-run).
Retired-or-carried at the v4.0 close (ROUND22 ledger #6 — Lane A, line by line)
Verdicts against the full 23-town pack (1,210 shops), not against the 5-town sample the list was written for. "Retired" means a law now enforces it and the pack proved the law holds with headroom.
- RETIRED — enforced, with headroom.
MAX_TOWN_SPAN_M(5 km) is validator-enforced, so a breach fails loudly at load, not silently in the plan. Widest in the pack: geelong at 3,829 m — 77% of the ceiling; no town came close to the law. Mega-strips are now a pipeline curation question (E's), and the generator's fence is the backstop it was designed to be. - RETIRED — the floor never bound.
MIN_TOWN_SHOPSis 6; the thinnest town in the pack is darwin at 12 — 2× the floor. No cache was rejected for sparsity. (Whether a 12-shop town reads alive is a different question and a live one — it's D's thin-tail spot-check this round, not a generator risk.) - RETIRED on the plan side; CARRIED for the runtime lanes. This was the alpha's real risk and it paid off exactly as intended — the irregular graphs surfaced fragmentation (R19), capacity (R20) and venue stranding (R21), each fixed-or-fenced and written down. At 23-town scale A's side needed no new hardening: 1 connected component and 3 venues on every town, all invariants green, fitzroy's 160 shops included. Carried only where it hasn't been measured yet: C's door-soak, D's fitzroy audit and F's matrix are this round's verifies — the plan being green is not the same as the town rendering and simulating green.
- RETIRED — the knob is at a measured setting. Junction-protected Douglas–Peucker settled it (katoomba 105 → 11 components; cull/bridge → 1 component at 100% main-net, and now 1 component on all 23). The fidelity/edge-count trade has a floor that holds across the pack; it is no longer an open question, and any future move re-pins goldens under the amendment law.
- Unchanged — still settled, now on 23 towns rather than 5.
- NEW, CARRIED — thin-graph seating capacity. The pack's honest tail: 6.4% of shops don't seat
(77 of 1,210), all counted by cause, dominated by overflow where a town has more shops than its road
graph has frontage. Outliers: daylesford 19% (32 shops on 171 roads — the thinnest graph in the
pack by 2×) and fitzroy 13%.
RGAPis already 0.5 m andNODE_CLEAR3 m; the only lever left is spilling overflow onto a different street, which buys a few percent by putting a shop on a road it isn't on. Ruling stands from R20: drop and count beats teleport. Carried into v4.x as a known, measured, per-cause-attributed tail — not a defect, and not hidden.