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>
75 lines
4.2 KiB
Markdown
75 lines
4.2 KiB
Markdown
# 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).
|