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>
68 lines
4.3 KiB
Markdown
68 lines
4.3 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
|
||
|
||
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).
|