PROCITY/web/js/citygen
m3ultra e4a49b5bc8 Lane F R17 (v3.2): real towns boot in the engine + the town-matrix scout gate (ledger #7)
F wired the last mile of the real-map scout and gated the whole matrix.

- index.js barrel re-exports registerTownCache/validateTownCache; the shell fetches + registers
  assets/towns/<key>.json before generatePlanFor when the town isn't a checked-in fixture — so
  ?plansrc=osm&town=bendigo_real boots a REAL AU town in the engine (the gap: E's caches were on disk +
  in the node selfcheck, but the shell never loaded them → silent Melbourne fallback). Fail-soft
  (404 / invalid / ?noassets -> fixture fallback); opt-in, never on the default or ?classic path.
- tools/qa/town_matrix.py (opt-in qa.sh --matrix): boot / determinism / budget / district / ?noassets
  across 10 towns (2 synthetic hero seeds + 3 osm fixtures + E's 5 real AU caches). ALL 5x10 GREEN —
  Castlemaine at the 6-shop floor still lands a 3-venue district. The existing CityPlan contract eats real
  Australian geography: the evidence John charters v4 = THE REAL MAP on.
- docs: LANE_F_NOTES §17 (the town x gate table), README real-town row, F-progress R17.

qa.sh --strict --soak GREEN 7/7. Verified: ?plansrc=osm&town=bendigo_real -> Bendigo, 9 shops, 3 venues, 0 errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 15:23:15 +10:00
..
gigs.js Lane A round 16: v3.1 corner-poster clearance bias (#6) + no-spine osm fixture (#7) 2026-07-16 12:35:30 +10:00
index.js Lane F R17 (v3.2): real towns boot in the engine + the town-matrix scout gate (ledger #7) 2026-07-16 15:23:15 +10:00
names.js Lane A round 13: v3.0-beta the district (?gigs=1) — 2–4 venues, week schedule, town-wide posters, verge fix 2026-07-15 22:35:05 +10:00
osm_fixture.js Lane A round 16: v3.1 corner-poster clearance bias (#6) + no-spine osm fixture (#7) 2026-07-16 12:35:30 +10:00
plan_osm.js Lane A round 17: v3.2 the town-cache contract (published first) + plan_osm hardened for real data 2026-07-16 14:32:14 +10:00
plan.js Lane A round 12: v3.0-alpha gig layer (?gigs=1) — venue, plan.gigs, band names, closing-time debt 2026-07-15 18:33:53 +10:00
selfcheck.js Lane A round 17: v3.2 the town-cache contract (published first) + plan_osm hardened for real data 2026-07-16 14:32:14 +10:00
wordlists.js Lane A round 12: v3.0-alpha gig layer (?gigs=1) — venue, plan.gigs, band names, closing-time debt 2026-07-15 18:33:53 +10:00