PROCITY/web/assets/towns/SOURCES.md
m3ultra 8a383e494e Lane E R21 (v4.0): the town pack — 22 towns, 1192 shops (DATA-ONLY, non-gating)
Ledger #5 pull-forward. Nothing here touches a golden until A absorbs in R22; F tags v4.0-beta with
or without it. selfcheck ALL GREEN 154141/154141, synthetic 0x3fa36874 unmoved, all 22 byte-identical
on re-run.

- Curated 18 candidates on secondhand density first (heroes are the game), a walkable 2-3.4km centre,
  and a national spread; 17 survived -> 22 towns, 1192 shops, 298 heroes, all 8 states/territories.
  fitzroy is the mecca (40 heroes/160 shops, 2x katoomba); thin tail toowoomba/darwin (3 heroes) left
  in as honest data -- A/Fable may drop them in R22.
- FINDING: the 3x-hero cap is a CURATION FILTER, not just a density knob. Wollongong had ~62 real
  shops but 1 hero -> capped to 4 -> dropped by the >=6 floor. A town without a secondhand strip
  cannot inflate into a retail strip; John's SUBTLE directive does quality control for free.
- Newcastle: my centre was wrong, not the town (CBD held 2 heroes; the strip is Hamilton/Beaumont St).
  Re-centred: 2 -> 9 heroes, 8 -> 36 shops.
- BUG (mine, shipped R18, caught here): fetch_roads_raw had no query-comparison while fetch_raw did,
  so re-centring refetched shops but silently reused the OLD CBD roads -> Hamilton shops seated against
  a graph 2.5km away -> the town marched out with ZERO shops (surfacing as 32 bogus 'open-late
  invariant' failures; ten other no-video towns passing is what proved it wasn't the open-late rule).
  Fixed: the roads path now compares its query too -- the bbox lives in the query, so a re-centre must
  invalidate BOTH snapshots. Newcastle rebuilt: 34 shops seated, openLate=1.
- Discipline: bounded bboxes, raw snapshots committed (shops+roads), C's §6 mapping, SUBTLE guardrails
  (heroes never subsampled, texture 3x, 2392 drops counted), ODbL. Overpass rate-limits hard at pack
  scale (batch 1 died on a fatal 504 after 25 retries) -- courtesy sleep 4s, two polite batches.

-> Lane A (R22): 34 goldens to pin (17 new towns x base+gig); sizes 12->160 shops load-test your
   capacity/overflow fences. -> Lane B: index.json now lists 22 towns (your selector already reads it).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 21:06:46 +10:00

4.2 KiB
Raw Blame History

Town-cache data sources & licence (web/assets/towns/)

Lane E owns this file (ROUND17 ledger #6). Every real-town cache here is derived from OpenStreetMap data and ships under OSM's licence. This notice + the license/attribution fields on every <key>.json are the attribution that travels with the data.

Licence — OpenStreetMap, ODbL 1.0

© OpenStreetMap contributors. Data available under the Open Database License (ODbL) 1.0. https://www.openstreetmap.org/copyright · https://opendatacommons.org/licenses/odbl/1-0/

The caches are a produced work derived from OSM via the Overpass API (overpass-api.de), filtered to on-theme shop=* points, deduped, suburb-filled, and type-mapped by pipeline/build_towns.py. Attribution ships in-repo (this file) and in every cache ("license":"ODbL 1.0", "attribution":"© OpenStreetMap contributors"). If a rendered/public build surfaces this data, keep the "© OpenStreetMap contributors (ODbL)" credit visible.

Provenance table

index.json is the machine-readable roster (key/town/state/shops/roads) — read it rather than hardcoding a list. Every cache carries the same terms; per-town numbers live in each cache's counts.

The v4.0 pack (R21): 22 towns · 1192 shops · 298 heroes, every one fetched from OSM Overpass with a bounded per-town bbox, ODbL 1.0, raw snapshots in _raw/ (shops + roads per town), fetched 2026-07-16.

state towns
NSW (6) katoomba · newtown · glebe · marrickville · newcastle (Hamilton strip) · bowral
VIC (7) fitzroy · brunswick · geelong · bendigo · ballarat · castlemaine · daylesford
WA (2) fremantle · northbridge
QLD (2) westend · toowoomba
TAS (2) hobart · launceston
SA (1) adelaide
ACT (1) braddon
NT (1) darwin

The density widening (v4.0-beta, ROUND20 ledger #2)

The fetch covers the secondhand heroes plus the everyday main-street texture (bakery/cafe/deli/ newsagent/chemist/clothes/hardware/greengrocer/…), mapped to existing registry types per C's LANE_C_PUB §6 table. Tasteful staples only — no vehicle/fuel, funeral, storage, industrial, or pure services. cafe rides amenity=*; everything else is shop=*. Per John's subtle directive the heroes are never subsampled and texture is capped at 3× the hero count (deterministic sha256(townKey:osmId) rank); every drop is counted in each cache's counts.textureDropped.

index.json — the towns roster

{schema:"procity-towns-index/1", generated, license, attribution, towns:[{key, town, state, shops, roads}]}. Same ODbL terms as the caches. Consumers (B's selector) derive the town list from this rather than hardcoding.

Raw responses (_raw/)

The raw Overpass JSON is cached in-repo (wrapped with fetchedAt, endpoint, query, bbox): _raw/<key>.overpass.json (shops) and _raw/<key>.roads.overpass.json (OSM highway ways, schema v2). Re-runs reuse the raw cache and never re-hit Overpass — the fetch is outward-facing network (John-authorized scout, once per town). --refetch forces a deliberate re-fetch. selfcheck.js reads only top-level *.json, so _raw/ is never loaded as a cache.

Roads — schema v2 (ROUND18, v4.0-alpha REAL ROADS)

A v2 cache carries roads[] — the town's real OSM street geometry (highway=* ways), same ODbL licence and attribution as the shops. Fidelity cut (charter risk #4): the raw fetch grabs every ROAD_KIND tier, but the emitted roads[] is the town street graph only — drivable roads + pedestrian malls; service/track/footway/path/steps/cycleway are excluded (in Katoomba, 1461 of 2506 ways — bushwalking tracks, sidewalks, stairs, driveways). The excluded tier stays in the raw response if a tier is wanted back. katoomba_real is v2 (the alpha); the other towns' roads land as data-only.

Names — parody vs factual

Big trademarked charity/franchise chains are parodied in build_towns.py (Salvos→Slave-ohs, Vinnies→Sinnies, Anglicare→Tanglecare, Cash Converters→Cashtheists, …) for the game's comic tone. Independent shops keep their real OSM name — factual, publicly-mapped POI data under ODbL. No private-individual data is carried (name/type/coordinate/suburb only).