Lane A round 22: CITY_SPEC v4 amendments final + charter risk-list retired-or-carried (ledger #6)
Docs-only; no output change, no golden moves (selfcheck 161,300/161,300 green before and after). THE DRIFT THIS CLOSES. Three gig-layer behaviour changes had reached only my lane notes, never the spec — the amendment law says the spec is where they live: - ROUND20 ledger #2: the R16 facade-clearance bias WIDENED from band_room/rsl to every venue kind (line 312 still claimed band_room/rsl). A real road graph at E's density can put a PUB's facade over a cross street; synthetic pubs always clear, so it stayed a no-op there. - ROUND21 ledger #1: the venue cluster bias was never written down at all. Now recorded with the measurement (11 of 15 venues under the floor -> 0; Newtown's RSL 2,228m -> 29m from the hub) and the by-construction gate (, which synthetic never sets — measured, not assumed). - ROUND22 ledger #2: the graded fallback (densest-available where the floor is unreachable). Also documented the pick ORDER, which no lane could have inferred: cluster field -> kind flavour -> clearance filter -> farthestFirst -> seeded pick, each degrading to the previous set. CITY_SPEC v4 section marked FINAL at the tag: the alpha's five towns became the epoch's 23 (1,210 shops) and every ruling held with no new hardening. 'All five towns' now reads as the measurement of record when the ruling was written; the ruling is pack-wide. THE RISK LIST, line by line, judged against the full pack rather than the 5-town sample it was written for (V4_REAL_MAP.md): 1. RETIRED — bbox law enforced with headroom: widest is geelong at 3,829m, 77% of the 5km ceiling. 2. RETIRED — the floor never bound: thinnest is darwin at 12 shops, 2x MIN_TOWN_SHOPS. (Whether 12 shops READS alive is D's thin-tail check, not a generator risk — different question, still live.) 3. RETIRED plan-side; CARRIED for the runtime lanes. The alpha's real risk paid off exactly as intended (it surfaced fragmentation, capacity, stranding — each fixed-or-fenced). But a green plan is not a green town: C's soak, D's fitzroy audit and F's matrix are the verifies that close it. 4. RETIRED — the DP knob is at a measured setting: 1 component on all 23. 5. Unchanged, now on 23 towns not 5. 6. NEW, CARRIED — thin-graph seating capacity: 6.4% of shops don't seat (77/1,210), all counted by cause; daylesford 19% (32 shops on 171 roads), fitzroy 13%. Levers are spent at RGAP 0.5m / NODE_CLEAR 3m; the only one left puts a shop on a road it isn't on. R20 ruling stands: drop and count beats teleport. Carried into v4.x measured, not hidden. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
3face97046
commit
9c9ad730a3
@ -225,6 +225,26 @@ night in v1; interior-mapping shader is a stretch goal).
|
||||
> broadens off-spine if the warehouse fringe is uniformly narrow). This moved `plan.posters`, so the gig
|
||||
> golden re-pinned `0x4f4a549d → 0xb1d48ea1`; synthetic `0x3fa36874` still frozen. The v3.1 default flip
|
||||
> + classic law is F's amendment to this section — see the flags table.)*
|
||||
>
|
||||
> *(**Recorded amendment — ROUND20, ledger #2:** the R16 clearance bias above **widened to every venue
|
||||
> kind**. R16 exempted `pub` because on the synthetic/marched towns a pub's `+Z` is always open; on a real
|
||||
> road graph at E's widened density it is not (newtown: a pub whose facade overhung a cross street). On the
|
||||
> synthetic town every pub/rsl candidate already clears ⇒ no-op there, gig golden `0xb1d48ea1` frozen.)*
|
||||
>
|
||||
> *(**Recorded amendment — ROUND21 ledger #1 + ROUND22 ledger #2: the venue cluster bias.** D's relocation
|
||||
> finding: a venue a kilometre from the retail cluster is a gig with no passing crowd (katoomba's pub had
|
||||
> **1** shop within 160 m; its RSL had 13). `pickVenues` now draws each venue from a **cluster field** —
|
||||
> candidates with ≥ `CLUSTER_MIN` (3) other shops within `CLUSTER_R` (160 m) — and lets the kind flavours
|
||||
> bias *within* that field rather than override it. Venues under the floor: **11 of 15 → 0** across the
|
||||
> five R21 towns; Newtown's RSL moved 2,228 m → 29 m from the hub. **Real towns only, by construction:**
|
||||
> the bias reads `plan.source === 'osm'`, which the synthetic generator never sets, so it cannot move
|
||||
> `0x3fa36874`/`0xb1d48ea1` — measured, not assumed (4 synthetic candidates per seed sit under the floor,
|
||||
> so a blanket filter *would* have moved them). **ROUND22 graded fallback:** at pack scale three towns have
|
||||
> no candidate at the floor at all (`ballarat`/`toowoomba`/`newtown_godverse` top out at 2 within 160 m).
|
||||
> R21 dropped the bias entirely there, stranding venues at 0 neighbours; it now falls back to the **densest
|
||||
> available** candidates instead. Fires only where the floor is unreachable ⇒ no already-pinned town moved.
|
||||
> **Acceptance at pack scale: 20 of 23 towns have every venue ≥ `CLUSTER_MIN`; those three sit at their
|
||||
> town's genuine ceiling** — the carved-out case, stated rather than papered over.)*
|
||||
|
||||
> **Prime flag law.** The gig layer is a **post-hoc augmentation** applied by the selector when the gig
|
||||
> flag is on. With it off, `generatePlanFor(seed, src)` returns the byte-identical v2 base plan — **all v2
|
||||
@ -268,6 +288,13 @@ plain shop" so osm towns still get venues):
|
||||
| `band_room` | `grunge` → `gig-grunge` | warehouse-district fringe | `[18,23]` | single-storey tin shed |
|
||||
| `rsl` | `covers` → `gig-covers` | **off**-spine (not main, not warehouse) | `[16,23]` | carpet-and-bistro club |
|
||||
|
||||
**The cluster field comes first (ROUND21/22 — real towns only).** On an osm plan every kind rule in the
|
||||
table runs **inside** the retail cluster. Order per venue: cluster field (≥`CLUSTER_MIN` other shops within
|
||||
`CLUSTER_R`, or the densest available if none reach the floor) → the kind flavour → the facade-clearance
|
||||
filter → `farthestFirst` shortlist → seeded pick, each step degrading to the previous set rather than to
|
||||
the whole town. A fringe band_room *in the cluster* beats a fringe band_room a kilometre from anyone.
|
||||
Synthetic plans skip the field entirely (`plan.source` is unset) ⇒ goldens frozen. See the amendment note.
|
||||
|
||||
Venue hours all close `23` (open through DUSK+NIGHT so the gig runs and D's surge fills the room; drains
|
||||
at close per the closing-time ruling above). Venues are the *only* gig-plan shops allowed to close ≥22
|
||||
besides the openLate video (selfcheck exempts them). `genreKey` is set from the registry kind→genre map
|
||||
@ -309,8 +336,9 @@ frontage** — seated on the **+Z street facade** (B's canon: `buildings.js` fac
|
||||
camera are all `+Z`; position `lot + (sin ry, cos ry)·(d/2+ε)`), turned to read *from* the street
|
||||
(`ry = lot.ry + π` so its printed face points `+Z` at the queue-side camera — **ROUND15 ledger #1**; before
|
||||
R15 it was on the `−Z` back and invisible from the street). So the poster never sits over a back-street's
|
||||
bitumen, **`pickVenues` prefers a band_room/rsl lot whose facade clears every carriageway by ≥ `POSTER_CLEAR`**
|
||||
(ROUND16 ledger #6 — exported from the barrel; the selfcheck asserts the same floor). Plus a seeded run along
|
||||
bitumen, **`pickVenues` prefers a lot whose facade clears every carriageway by ≥ `POSTER_CLEAR`**
|
||||
(ROUND16 ledger #6, **widened from band_room/rsl to every venue kind in ROUND20** — exported from the
|
||||
barrel; the selfcheck asserts the same floor). Plus a seeded run along
|
||||
the spine — 2 per main edge (or, when a town has no main spine, every edge), at `t ∈ [0.2,0.8]` of the block, on **either verge**;
|
||||
a candidate that would overhang a **real** crossing carriageway is skipped (ROUND19, E's finding), and the
|
||||
run is **capped at `POSTER_PER_SHOP × shops`** (ROUND20) — a sparse real town has few shops but a big edge
|
||||
@ -406,6 +434,23 @@ synthetic town, so its gig golden is frozen). Golden re-pins per the amendment l
|
||||
on their real-roads output; synthetic + marched fixtures + classic/default untouched — the alpha changed
|
||||
nothing outside the cache-schema path).
|
||||
|
||||
> **FINAL at `v4.0` (ROUND22 ledger #6, the epoch close).** This section — schema v2, the lift, the
|
||||
> connectivity rulings above, the venue cluster bias and poster cap in §v3 — is the authoritative real-map
|
||||
> contract at the tag. Changes are an amendment + a golden re-pin in the same commit, as always.
|
||||
>
|
||||
> **The alpha's five became the epoch's 23** (22 real towns + Lane G's `newtown_godverse`; **1,210 shops**),
|
||||
> and every ruling written above held at that scale with **no new hardening**: **one connected component and
|
||||
> three venues on every one of the 23 towns**, fitzroy's **160 shops** — 2× anything the pipeline had seen —
|
||||
> included. All **36 goldens** (`REAL_TOWN_GOLDENS` + `REAL_TOWN_GIG_GOLDENS`, 23 each) are pinned; selfcheck
|
||||
> runs **161,300** checks green, cross-process deterministic. Read "all five towns" above as the measurement
|
||||
> of record *when the ruling was written* — the ruling itself is now pack-wide.
|
||||
>
|
||||
> **The honest tail, carried not hidden:** 6.4% of shops (77 of 1,210) don't seat, every drop attributed by
|
||||
> cause, dominated by overflow where a town has more shops than its road graph has frontage (daylesford 19%,
|
||||
> the pack's thinnest graph; fitzroy 13%). See `V4_REAL_MAP.md` risk #6. The R20 ruling stands: **drop and
|
||||
> count beats teleport.** The frozen set is unmoved by the entire epoch: synthetic `0x3fa36874`, gig
|
||||
> `0xb1d48ea1`, marched fixtures, classic.
|
||||
|
||||
## Shop types v1 (registry lives in `web/js/core/registry.js`, Lane A writes it, all lanes read)
|
||||
|
||||
> **`web/js/core/registry.js` is the machine-readable source of truth** — import `SHOP_TYPES` for
|
||||
|
||||
@ -50,3 +50,36 @@ re-fetch; only public POI/way data, never private-individual data.
|
||||
4. Road simplification fidelity — too coarse reads wrong, too fine costs edges; A owns the knob.
|
||||
5. Settled non-risks: facade clearance on osm towns (R17), interior types (C proved 18 real
|
||||
`shop=` values degrade cleanly), plan-side determinism (E's pipeline is byte-identical re-run).
|
||||
|
||||
### Retired-or-carried at the v4.0 close (ROUND22 ledger #6 — Lane A, line by line)
|
||||
|
||||
Verdicts against the **full 23-town pack** (1,210 shops), not against the 5-town sample the list was
|
||||
written for. "Retired" means a law now enforces it and the pack proved the law holds with headroom.
|
||||
|
||||
1. **RETIRED — enforced, with headroom.** `MAX_TOWN_SPAN_M` (5 km) is validator-enforced, so a breach
|
||||
fails loudly at load, not silently in the plan. Widest in the pack: **geelong at 3,829 m — 77% of the
|
||||
ceiling**; no town came close to the law. Mega-strips are now a *pipeline curation* question (E's), and
|
||||
the generator's fence is the backstop it was designed to be.
|
||||
2. **RETIRED — the floor never bound.** `MIN_TOWN_SHOPS` is 6; the thinnest town in the pack is
|
||||
**darwin at 12 — 2× the floor**. No cache was rejected for sparsity. (Whether a 12-shop town *reads*
|
||||
alive is a different question and a live one — it's D's thin-tail spot-check this round, not a
|
||||
generator risk.)
|
||||
3. **RETIRED on the plan side; CARRIED for the runtime lanes.** This was the alpha's real risk and it
|
||||
paid off exactly as intended — the irregular graphs surfaced fragmentation (R19), capacity (R20) and
|
||||
venue stranding (R21), each fixed-or-fenced and written down. At 23-town scale A's side needed **no
|
||||
new hardening**: 1 connected component and 3 venues on every town, all invariants green, fitzroy's 160
|
||||
shops included. **Carried** only where it hasn't been measured yet: C's door-soak, D's fitzroy audit
|
||||
and F's matrix are this round's verifies — the plan being green is not the same as the town rendering
|
||||
and simulating green.
|
||||
4. **RETIRED — the knob is at a measured setting.** Junction-protected Douglas–Peucker settled it
|
||||
(katoomba 105 → 11 components; cull/bridge → 1 component at 100% main-net, and now **1 component on
|
||||
all 23**). The fidelity/edge-count trade has a floor that holds across the pack; it is no longer an
|
||||
open question, and any future move re-pins goldens under the amendment law.
|
||||
5. **Unchanged** — still settled, now on 23 towns rather than 5.
|
||||
6. **NEW, CARRIED — thin-graph seating capacity.** The pack's honest tail: **6.4% of shops don't seat**
|
||||
(77 of 1,210), all counted by cause, dominated by overflow where a town has more shops than its road
|
||||
graph has frontage. Outliers: **daylesford 19%** (32 shops on 171 roads — the thinnest graph in the
|
||||
pack by 2×) and **fitzroy 13%**. `RGAP` is already 0.5 m and `NODE_CLEAR` 3 m; the only lever left is
|
||||
spilling overflow onto a *different* street, which buys a few percent by putting a shop on a road it
|
||||
isn't on. Ruling stands from R20: **drop and count beats teleport.** Carried into v4.x as a known,
|
||||
measured, per-cause-attributed tail — not a defect, and not hidden.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user