From db33faa628dd0a46075c2aa3f8279176e919b489 Mon Sep 17 00:00:00 2001 From: m3ultra Date: Thu, 16 Jul 2026 16:39:53 +1000 Subject: [PATCH] =?UTF-8?q?Lane=20D=20R18=20(v4.0-alpha):=20citizens=20on?= =?UTF-8?q?=20real=20bones=20=E2=80=94=20audit=20+=20fragmentation=20findi?= =?UTF-8?q?ng=20(ledger=20#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- docs/LANES/LANE_D_NOTES.md | 66 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/docs/LANES/LANE_D_NOTES.md b/docs/LANES/LANE_D_NOTES.md index b698b10..40fb185 100644 --- a/docs/LANES/LANE_D_NOTES.md +++ b/docs/LANES/LANE_D_NOTES.md @@ -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