PROCITY/web/assets/towns/SOURCES.md
m3ultra 078245f7bd Lane E R20 (v4.0-beta): the density widening — widened fetch, 5 caches re-emitted, towns index
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>
2026-07-16 19:30:50 +10:00

4.3 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

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).