Ledger #2 (E's half), built to C's LANE_C_PUB §6 table under John's SUBTLE directive. - Widened fetch: C's tasteful staple list (shop=* + amenity=cafe per C's dagger note), mapped through C's copy-paste table onto EXISTING registry types (no new archetypes). Guardrails honoured: no vehicle/fuel/funeral/storage/industrial, no pure services. New raw snapshot per town (the fetcher auto-refetches when the class list changes -- query recorded in each snapshot), committed like the first. - SUBTLE by construction: secondhand HEROES never subsampled; texture capped at 3x heroes (top of C's ~2-3x band), over-cap towns seed-subsampled deterministically (sha256(townKey:osmId)) with every drop counted in counts.textureDropped. Result 3.0x in all five: katoomba 20+60 (-4), newtown 18+54 (-156), fremantle 20+60 (-81), bendigo 9+27 (-81), castlemaine 6+18 (-43). Density 6-21 -> 24-80 shops (3-4x). - web/assets/towns/index.json (new, E-owned): {schema, generated, license, attribution, towns[{key, town, state, shops, roads}]} -- B's selector can drop the REAL_TOWNS hardcode (hud.js:11). - Deterministic (byte-identical re-run, 0 re-fetch). ODbL: SOURCES.md + per-cache license/attribution. -> Lane A (absorb pass): (1) 10 expected golden re-pins -- the widening moves every real town's base+gig golden (designed E->A handoff); synthetic 0x3fa36874 UNMOVED, fixtures frozen. (2) SEAM: index.json trips selfcheck's town glob (selfcheck.js:467 takes every top-level towns/*.json as a cache) -- one-line fix in your file: .filter(f => f.endsWith('.json') && f !== 'index.json'). Didn't touch selfcheck.js (yours, you're mid-round in it); Fable spec'd the index at this path so the path stays. -> Lane C: kept video_games -> video (absent from your §6 table; was already shipping as video pre-widening, so the fallback would have regressed it to opshop). Same family, same target -- flagging for your table. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.3 KiB
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
Shop counts are post-widening (v4.0-beta); index.json is the machine-readable roster.
| cache | town | source | licence | fetched | shops (heroes+texture) | raw response |
|---|---|---|---|---|---|---|
katoomba_real.json |
Katoomba, NSW | OSM Overpass (bounded) | ODbL 1.0 | 2026-07-16 | 80 (20+60) | _raw/katoomba_real.overpass.json |
newtown_real.json |
Newtown, Sydney NSW | OSM Overpass (bounded) | ODbL 1.0 | 2026-07-16 | 72 (18+54) | _raw/newtown_real.overpass.json |
fremantle_real.json |
Fremantle, WA | OSM Overpass (bounded) | ODbL 1.0 | 2026-07-16 | 80 (20+60) | _raw/fremantle_real.overpass.json |
bendigo_real.json |
Bendigo, VIC | OSM Overpass (bounded) | ODbL 1.0 | 2026-07-16 | 36 (9+27) | _raw/bendigo_real.overpass.json |
castlemaine_real.json |
Castlemaine, VIC | OSM Overpass (bounded) | ODbL 1.0 | 2026-07-16 | 24 (6+18) | _raw/castlemaine_real.overpass.json |
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).