103 lines
7.5 KiB
Markdown
103 lines
7.5 KiB
Markdown
# PROCITY — Round 20 lane instructions (from Fable, integrator)
|
||
|
||
Date: 2026-07-16 · **v4.0-alpha SHIPPED** (tag on origin, `ddd1e68`). The alpha close was textbook:
|
||
A's junction-protected Douglas–Peucker + bridge/cull took Katoomba from **105 components → 1**
|
||
(100% street-metres connected, 0 silently-stranded shops — every drop counted), D re-measured with
|
||
the R18 harness and confirmed the ruling landed clean (near-crowd on fragments: ~10% → 0%), F
|
||
landed B's `BIG_CITY` one-liner early exactly as ordered (280k → 12k tris in play) and gated the
|
||
close, B shipped the town selector with **zero shell seam** (hud.js owns it end-to-end) plus the
|
||
corner-strip spot-check, C re-soaked 19/19 doors, E stayed cleanly on-call. The money shot is the
|
||
epoch thesis made real: Katoomba's actual main street — asphalt, zebra crossing, walking crowd,
|
||
gig posters, PROCITY's look on real bones. All five real-town goldens are pinned.
|
||
|
||
Round 20 is **v4.0-beta: THE FIVE TOWNS** — the two honest alpha findings become the beta's
|
||
headline (density), the tram gets its ruling, and every real town is proven end-to-end. Tag
|
||
**`v4.0-beta`** at close.
|
||
|
||
## The two filed findings that shape this round
|
||
|
||
1. **Poster density scales with edges, not shops** (A's R19 finding + F's one open budget edge):
|
||
real Katoomba emits **438 posters** (~14 on synthetic), which reads busy and drives the one
|
||
matrix breach — `venue_night` at **200,965 tris (+0.5% over the 200k soft ceiling)**. In-play
|
||
views are fine (121k); this is the stress view.
|
||
2. **Real towns are sparse** (F's density note): 19 secondhand shops spread across a whole real
|
||
town ⇒ a real *street* with life on it, not a retail strip. The vision says "walk the actual
|
||
main street" — main streets have bakeries, cafes, chemists, clothes shops. We fetch only the
|
||
thriftgod heritage classes.
|
||
|
||
## The ledger
|
||
|
||
1. **Poster cap (A).** Cap spine posters per real town — seeded subsample of the pole run,
|
||
scaled by shop count not edge count (you own the number; ~2–3× the synthetic feel is the
|
||
target, not 438). Real-town goldens re-pin (amendment law, one commit); synthetic + gig
|
||
frozen. This closes F's venue_night edge — tell F to re-measure.
|
||
2. **THE DENSITY WIDENING (the beta headline — C rules, E fetches, A absorbs).** Fable's ruling
|
||
(John veto in Standing): real towns fetch **general retail**, not just secondhand — the main
|
||
street should hold its real bakery, cafe, chemist, newsagent, clothes shops. Mechanics:
|
||
- **C publishes FIRST**: the OSM-class → registry-archetype mapping table (e.g. cafe/bakery →
|
||
`milkbar`, pharmacy/newsagent/clothes → `retail`/`opshop` flavors — C owns which existing
|
||
archetype each class wears; **no new archetypes this round**, the mapping is the deliverable;
|
||
your R18 proof says unknowns degrade safely anyway). Publish in LANE_C_PUB (v4-beta marker).
|
||
- **E re-fetches** with the widened `shop=*` class list (same bbox, raw-cached, one more
|
||
Overpass pass per town under the standing authorization), maps per C's table, re-emits the
|
||
five caches (v2, deterministic) + **`web/assets/towns/index.json`** (key, town, state, shop
|
||
count, roads flag) so B's selector stops hardcoding `REAL_TOWNS`.
|
||
- **A absorbs the density**: five towns re-run at 3–6× shop count — seating capacity, overflow
|
||
accounting (`norm.dropped` stays honest), venue placement still lands, goldens re-pin once
|
||
at the end. If a town's real density overwhelms an edge, widen capacity or split runs —
|
||
your R18 overflow fence, now load-tested.
|
||
3. **The tram ruling (B).** Alpha left the tram on an arbitrary longest-chain (21% of mains).
|
||
Beta ruling: **route by shop adjacency** — pick the main chain whose edges front the most
|
||
shops (the actual high street; on synthetic towns this must resolve to the current spine so
|
||
the goldens/feel don't move). If the shop-adjacent chain reads wrong on any real town, fence
|
||
the tram per-town instead (the `edges > 200` signal you left ready) and say which towns run it.
|
||
4. **Ground polish at real intersections (B).** The R19 spot-check accepted overlap-fill; now the
|
||
finer pass: acute-angle junctions and z-fighting at the 58 degree-4 intersections. Fix what's
|
||
cheap, file what's structural (A's lot geometry) with measurements.
|
||
5. **Selector polish (B + F).** Derive towns from E's `index.json` (drop the hardcode); F rules
|
||
the gating (always-on HUD vs `?dbg`) at close — F's call, one line either way.
|
||
6. **Interiors across the five (C).** After E's widened caches land: sampled door-soak per town
|
||
(the R18/R19 harness — every town, sampled doors at the new density, all types resolve, no
|
||
carve fails, budgets). One table, five rows.
|
||
7. **Citizens at density (D).** Re-run the R18 audit on the densest post-widening town: patronage
|
||
at 3–6× targets, chunk rosters, determinism, identity — and the gig crowd on all five towns'
|
||
venues (the district gate covers placement; you cover behaviour). Cheap by design — your
|
||
scaffolds exist. File anything that leaks with measurements.
|
||
8. **The beta gate (F, last).** Full five-town matrix on real roads (boot/determinism/budget/
|
||
district/noassets/roads per town), the venue_night re-measure post-poster-cap (the +965 edge
|
||
must close), classic + default gates frozen as ever, selector gating ruling, beta money shot
|
||
(the densest real main street at golden hour — the retail strip reading), docs (README beta
|
||
paragraph, notes §20), tag **`v4.0-beta`**, push (standing authorization).
|
||
|
||
## Laws
|
||
|
||
Charter (V4_REAL_MAP.md) unchanged. Golden discipline this round: real-town goldens re-pin
|
||
**twice at most** (A's poster cap; A's density absorb — batch them if the timing allows), each
|
||
under the amendment law; synthetic `0x3fa36874`, gig `0xb1d48ea1`, fixtures — frozen. E's caches
|
||
stay deterministic (same raw → same cache); the widened fetch is a NEW raw snapshot, committed
|
||
like the first. Budgets unchanged and now measured at real density — if the widened towns bust
|
||
them in play (not just stress views), that's a Fable scope call, say so loudly.
|
||
|
||
## Order
|
||
|
||
**C's mapping table first** (half-day rule — E builds to it), **A's poster cap in parallel**
|
||
(independent). Then **E** (fetch + re-emit + index), then **A absorbs**, then **B / C / D**
|
||
verify at density (B's tram + ground items are independent of density — start anytime). **F
|
||
last.** Handshakes: C→E the table; E→A "caches re-emitted"; A→all "densities absorbed, goldens
|
||
pinned"; B→F tram verdict + selector; C/D→F density verdicts.
|
||
|
||
## Standing
|
||
|
||
- **John — the density widening is APPROVED (kickoff, 2026-07-16), with one directive: SUBTLE.**
|
||
John: "subtle changes are great." Interpretation for C + E: general retail is **texture, not
|
||
takeover** — the secondhand shops stay the heroes of the town (they're the game). Practically:
|
||
keep the widened class list tasteful (the everyday main-street staples, not every OSM `shop=*`
|
||
value); if a real town's retail would drown the secondhand strip visually, E may seed-subsample
|
||
the texture classes (count it, like every drop). The player should notice the town feels more
|
||
alive, not that the game changed. FYI standing: tram routes by shop adjacency (B may fence
|
||
per-town); the selector ships from an index; poster density gets capped.
|
||
- **v4.0 preview (next round, do not start):** the curated town pack (~15–25 towns through E's
|
||
pipeline at scale) · the release tour on real streets · docs freeze · the `v4.0` tag.
|
||
- **Backlog:** instrument LOD · tram tri diet · audioEmitter · flag retirement · awning ripple ·
|
||
editor · multiplayer.
|