PROCITY/web/js/citygen
m3ultra e5d4679471 Lane A round 9: freeze CityPlan v2 contract in CITY_SPEC + closing-time occupant ruling
Ship round. Docs + one selfcheck log-line only; no generator change ⇒ all three goldens
unchanged (synthetic 0x3fa36874, osm/melbourne 0x34cfdec0, osm/katoomba 0x0f652510).

1. CITY_SPEC v2 contract FROZEN — new "CityPlan v2 — frozen producer contract" section: producer
   API, goldens table (keyed seed/plansrc/town) + how to pin a new one, town-key mechanism, osm
   normalization rules, hours/openLate/storeys laws. Matches code as shipped (F diffs claims vs
   code). Refreshed the stale round-6 Plan-sources blockquote to multi-town reality. Layer-1
   changes now require a CITY_SPEC amendment + golden re-pin in the same commit.
2. Recipe sanity — DRY-RAN end-to-end: appended a throwaway Newtown (42 shops), selfcheck auto-ran
   the full parity suite (1931/1932, only golden unpinned) and printed a paste-ready
   `newtown: 0x9045e577,`. Reverted; no 3rd town shipped. Added the selfcheck `⚠ UNPINNED — add to
   OSM_GOLDENS` line so the recipe is mechanical; fixed the recipe wording to match.
3. Closing-time occupant ruling (D's on-call Q) — ratifies + freezes what D's sim.js already does:
   half-open hours, no new entry when closed, occupants DRAIN (finish bounded dwell) never popped,
   player not force-ejected, openLate video is the night crowd. In CITY_SPEC + LANE_A_NOTES. No
   code change asked of D.

qa.sh --strict GREEN; selfcheck 1727/1727.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 10:56:19 +10:00
..
index.js Lane A round 8: OSM to parity + a second town (Katoomba) — carried R7 brief, full 2026-07-15 04:15:12 +10:00
names.js Lane A (CityGen): deterministic town generator, registry, names, 2D map, self-check 2026-07-14 12:06:41 +10:00
osm_fixture.js Lane A round 8: OSM to parity + a second town (Katoomba) — carried R7 brief, full 2026-07-15 04:15:12 +10:00
plan_osm.js Lane A round 8: OSM to parity + a second town (Katoomba) — carried R7 brief, full 2026-07-15 04:15:12 +10:00
plan.js Lane A round 4: harden openLate contract (hours>=22 ⟺ openLate == the video), confirm F2 2026-07-14 18:26:30 +10:00
selfcheck.js Lane A round 9: freeze CityPlan v2 contract in CITY_SPEC + closing-time occupant ruling 2026-07-15 10:56:19 +10:00
wordlists.js Lane A (CityGen): deterministic town generator, registry, names, 2D map, self-check 2026-07-14 12:06:41 +10:00