Lane D R18 (v4.0-alpha): citizens on real bones — audit + fragmentation finding (ledger #5)
Audited the citizen sim on real irregular street topology. E landed katoomba_real's real roads (484 ways -> 872 nodes/799 edges) mid-round, so this is measured on the real Katoomba graph plus a crafted irregular proxy. VERDICT: the CityPlan graph contract IS the contract — zero sim changes. On real Katoomba (7.2deg junctions, 1303m edge, 105 components): 0 NaN over 1,095,500 samples, peds footpath-perfect (0 off-footpath), loiter/bench-sit/patronage all fire, chunk streaming works over non-grid, determinism byte-identical (1167 identity sigs, R14 chunk-local law holds). No source touched. FILED FOR A: katoomba_real's graph is 105 components — main holds 58% of street-metres + 18/20 shops, but 42% of street-metres + 2 shops strand (~10% of near-main crowd presence lands on tiny fragments). Primary cause is expected: median fragment 71.5m from main = peripheral/bbox-clipped roads. Secondary (corroborated with Lane B on A's selfcheck fixture): per-way Douglas-Peucker drops collinear junction points + no mid-edge split — bites only the 9/85 fragments <10m from main. Reconciles with B: B verified 126 intersections form (main component); I add the global measurement (still 105 components). A fidelity knob (charter risk #4), not a blocker; sim degrades gracefully (no crash). A owns the connect-tolerance decision. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
d4fcf68860
commit
db33faa628
@ -6,6 +6,72 @@ _rotOnly/head-bone normalize/upgradeStreetPeople). Measurements on the M3 Ultra
|
||||
|
||||
---
|
||||
|
||||
## ROUND 18 — v4.0-alpha REAL ROADS: citizens on real bones (ledger #5)
|
||||
|
||||
*PROCITY-D, 2026-07-16. The audit: does the citizen sim behave on real (irregular) street topology?
|
||||
E landed `katoomba_real`'s real road geometry (484 OSM ways → 872 nodes / 799 edges) mid-audit, so
|
||||
this is measured on the **real Katoomba graph**, not just a proxy. In-shell: fresh `CitizenSim` built
|
||||
on `plan.streets`, driven headless-of-render (rAF throttled). No source changes — the finding is the
|
||||
verdict + the failure list.*
|
||||
|
||||
### Verdict: the graph contract IS the contract — the sim needs ZERO changes
|
||||
The sim's graph-walk is topology-agnostic by construction (seeded random walk over nodes/edges, dead-end
|
||||
U-turn), so real geometry should just work. It does. Proven on a **crafted irregular town** (deg-4
|
||||
crossroads, 3 T-junctions, 5 dead-ends, a 30° acute fork, a cycle) AND the **real Katoomba graph**
|
||||
(7.2° acute junction, a 1303 m edge, 105 components):
|
||||
|
||||
| assertion | crafted irregular | **real Katoomba** |
|
||||
|---|---|---|
|
||||
| NaN/Inf ped positions | 0 / 240k | **0 / 1,095,500** |
|
||||
| off-footpath samples (ped beyond its own edge band) | 0 / 240k | **0** (maxDist 12.9 m = main offset) |
|
||||
| edges traversed | 11 / 11 | full main network |
|
||||
| peds pinned at dead-ends | 0 | 0 |
|
||||
| loiter fires | 154 ev | **174 ev** |
|
||||
| **bench-sit fires (R17)** | 47 ev | **60 ev** |
|
||||
| patronage fires (stream mode) | 165 visits | **24 visits, 4.3k inside-frames** |
|
||||
| chunk streaming over non-grid | 7 live rosters / 93 active | **13 chunks / 307 active** |
|
||||
| determinism (2 sims, same seed) | 0/120k pos mismatch; identity set visit-order-independent | **byte-identical rerun; 1167 sigs** |
|
||||
|
||||
Identity signature format is intact (`chunkKey#i:pedIndex:pvar:height:speed:edge:forward`), no `sit`
|
||||
term — my R17 `benchsit` stream doesn't perturb it. **Nothing in the sim needed touching for real roads.**
|
||||
|
||||
### The measured leak → FILED FOR A: the real-roads graph is fragmented
|
||||
`katoomba_real`'s street graph comes out in **105 disconnected components**. The main component holds
|
||||
**58% of street-metres (52.8 km) and 18 of 20 shops** — the core town is coherent — but **42% of street
|
||||
metres and 2 shops strand** on 102 islands (9 single nodes, 76 fragments of 2–4 nodes, 17 of 5–20).
|
||||
Live cost to citizens: **~10% of near-main crowd presence** lands on tiny fragments (aimless wandering,
|
||||
can't reach the main street or its shops); the 2 stranded shops get no main-crowd traffic.
|
||||
|
||||
- **Primary cause — expected, not a bug:** on real Katoomba the median fragment is **71.5 m** from the
|
||||
main net → **mostly peripheral / bbox-clipped roads and genuinely-separate service ways**, which is
|
||||
what an OSM extract in a bounded box always contains. The main town is coherent; this is the tail.
|
||||
- **Secondary mechanism (corroborated with Lane B):** A's `buildRealRoads` runs Douglas–Peucker **per-way
|
||||
before snapping**, so a junction point that is collinear on the through-way gets **dropped**, with no
|
||||
mid-edge split where one way's endpoint lands on another way's segment — a near-straight through-street
|
||||
with a mid-way junction can lose it → the crossing way strands. I hit this **three times** crafting the
|
||||
test town (fixed by modelling junctions as shared way-endpoints, as OSM does); **Lane B independently
|
||||
hit the same DP-collinear drop** on A's `selfcheck` fixture (LANE_B_NOTES §18). On *real* Katoomba this
|
||||
bites only the **9 of 85** tiny fragments that sit <10 m from the main network (20 within 30 m) — the
|
||||
ones a snap-tolerance / endpoint-split pass could legitimately join. A **fidelity knob** (charter risk #4).
|
||||
- **Reconciles with Lane B:** B verified real Katoomba's **126 intersections form correctly** (= my 27
|
||||
deg-4 + 99 deg-3 junction nodes) and concluded connectivity is fine — true *for the main component*. My
|
||||
add is the **global** measurement B didn't take: those 126 junctions live in a 480-node main component,
|
||||
but the full graph is still 105 components with 42 % of street-metres on islands. Both true, compatible.
|
||||
- **The sim degrades gracefully** — fragment peds just walk their island; **zero NaN, no crash**. This is
|
||||
A's graph-construction call (connect-tolerance / mid-edge split), not a sim change. A D-side mitigation
|
||||
(bias spawns toward the main component) is a **beta** item and needs A's connectivity decision first.
|
||||
|
||||
### Handshakes
|
||||
- **D → A:** the fragmentation measurement above (105 components, 42% street-metres + 2 shops stranded,
|
||||
root cause + the 9 close-fragments that could be joined). Your knob, your call.
|
||||
- **D → F (gate):** the sim is clean on the real graph — no D-side gate concern. Bench-sit + loiter +
|
||||
patronage + determinism all hold on `katoomba_real`. When you re-run the town matrix with the roads
|
||||
dimension, the citizen path is green from my side.
|
||||
- **Re-run note:** the whole audit is parameterized on `plan.streets`; it re-runs on any town's real
|
||||
graph in one call (used it on both the crafted town and real Katoomba this round).
|
||||
|
||||
---
|
||||
|
||||
## ROUND 17 — v3.2 THE TAIL: the drummer's pelvic-lean (ledger #1)
|
||||
|
||||
*PROCITY-D, 2026-07-16. The R16 honest limit — the upright bent-leg sit read stiff — is fixed. Files
|
||||
|
||||
Loading…
Reference in New Issue
Block a user