Road hierarchy — width-by-class, proven headless
The garmin-nav look: a motorway must read wider/bolder than a residential street. facett-map3d's road_ribbon already does this — and now it's proven as data, not eyeballed.
How it works (already implemented)
style::classify resolves an OSM highway tag to a per-class stroke width (the one source of truth): motorway 3.0 · primary 2.2 · secondary 1.7 · tertiary 1.3 · residential 1.0 · path 0.7. extrude::road_ribbon turns that into a three-pass ground ribbon whose half-widths scale with the class:
OSM highway=… ──▶ style::classify ──▶ Way.width (1.0 … 3.0) ← one source of truth
│
road_ribbon: fill_hw = width · ROAD_WIDTH_DU
casing_hw = fill_hw · CASING_SCALE (dark outline)
glow_hw = fill_hw · GLOW_SCALE (widest; warm for majors)
│
class_w = (width-1)/2 , speed_w from maxspeed_kmh
glow_strength = class_w·0.7 + speed_w·0.5 → major roads glow warm
So a higher class ⇒ wider casing/fill/glow ⇒ it visually wins the hierarchy, with no second per-class table (scaling Way.width keeps style.rs authoritative).
The proof (this change)
tests/road_hierarchy_proof.rs — headless, no GPU, no pixels. Same L-shaped centreline extruded at three classes; measures the ribbon vertices' cross-spread (x-extent + z-extent) after the fixed terrain quad:
- width-by-class:
motorway > primary > residential(monotonic), Δ(motorway, residential) > 1e-3 — well over float noise. - width, not tessellation: identical centreline ⇒ identical vertex count across classes (the class only moves vertices outward).
- deterministic: a re-extrude is byte-equal.
Emits the facett-map3d / road_hierarchy_width_by_class testmatrix cell under --features testmatrix. Reuses edda's nornir-testmatrix via facett_core::testmatrix::emit (no hand-rolled harness).
Next (bounded, headless-verifiable)
- tilt/bearing camera projection assert (garmin oblique) · flight-camera pose path.
- (deferred, GPU-only) bloom mip-pyramid, GTAO — need the bench box for a pixel A/B.