From the 2026-07 field triage (item 4, screenshot 3). Diagnosed against main @ 950939c.
Where a curved road meets a junction, the corner geometry collides/overlaps in the render — boundary interpenetration near the curve.
Root cause — straight-ray corner solver. corner_faces() samples each approach arm at a single end station and treats its outer edge as an infinite straight ray (core/src/mesh/junction_corner_detail.cpp:130-186, ray at :148-149); solve_corner() intersects those straight rays (:203-211); append_corner_fillets extends straight edge strips (core/src/mesh/junction_surface.cpp:143-188). When the approach curves near the mouth, the true pavement edge diverges from the ray and the fillet/strip/wedge geometry interpenetrates the road's own footprint. Connecting-road footprints, by contrast, sample per station and are curvature-safe (core/src/mesh/fill_backend.hpp:109-138).
Not the p4-s5 escape-valve artifact class: surface spans arbitrate elevation/samples inside a fixed union and can never move the boundary (junction.hpp:132-137; the realignment doc rules out new triangulation algorithms for spans). This is a generation bug in merged p4-s1/s2-era code.
Scope
- Corner solving samples the true curved pavement edge near the junction mouth instead of a single-station straight ray:
corner_faces / solve_corner (core/src/mesh/junction_corner_detail.cpp:130-273) and the straight edge strips + wedge apex in append_corner_fillets (core/src/mesh/junction_surface.cpp:143-188).
- The Corner tool handles follow automatically (
junction_corners() drives them from the same solver, core/src/road/junction_corners.cpp:48).
Refactorings
- None planned; keep the solver shared between mesher and query (byte-identity guards: verbatim arc sampling
junction_corner_detail.cpp:311-337, arms≥2 round-trip rule :132-137).
Acceptance
- Screenshot-3 reproduction: a curved road meeting a junction of sidewalked roads → no interpenetrating corner geometry; boundary edges follow the curved pavement edge.
- Straight-approach junctions unchanged (byte-identical output or visually identical + tests green) before/after.
- Regression surface green: p4-s1 corner edits (radius/extents ops
operations.cpp:3782,3821), p4-s2 wedges/noses (junction_surface.cpp:752-844), p4-s5 spans (junction_surface_spans.cpp), p4-s4 lock/regen record-carry, p4-s6 maneuver-shaped connecting roads. Sanitizer run mandatory (P4 discovery risk note), covering the editor tests too.
Out of scope
Supersedes
(none — successor of the #103/#105 T-junction-quality lineage.)
From the 2026-07 field triage (item 4, screenshot 3). Diagnosed against
main@ 950939c.Where a curved road meets a junction, the corner geometry collides/overlaps in the render — boundary interpenetration near the curve.
Root cause — straight-ray corner solver.
corner_faces()samples each approach arm at a single end station and treats its outer edge as an infinite straight ray (core/src/mesh/junction_corner_detail.cpp:130-186, ray at:148-149);solve_corner()intersects those straight rays (:203-211);append_corner_filletsextends straight edge strips (core/src/mesh/junction_surface.cpp:143-188). When the approach curves near the mouth, the true pavement edge diverges from the ray and the fillet/strip/wedge geometry interpenetrates the road's own footprint. Connecting-road footprints, by contrast, sample per station and are curvature-safe (core/src/mesh/fill_backend.hpp:109-138).Not the p4-s5 escape-valve artifact class: surface spans arbitrate elevation/samples inside a fixed union and can never move the boundary (
junction.hpp:132-137; the realignment doc rules out new triangulation algorithms for spans). This is a generation bug in merged p4-s1/s2-era code.Scope
corner_faces/solve_corner(core/src/mesh/junction_corner_detail.cpp:130-273) and the straight edge strips + wedge apex inappend_corner_fillets(core/src/mesh/junction_surface.cpp:143-188).junction_corners()drives them from the same solver,core/src/road/junction_corners.cpp:48).Refactorings
junction_corner_detail.cpp:311-337, arms≥2 round-trip rule:132-137).Acceptance
operations.cpp:3782,3821), p4-s2 wedges/noses (junction_surface.cpp:752-844), p4-s5 spans (junction_surface_spans.cpp), p4-s4 lock/regen record-carry, p4-s6 maneuver-shaped connecting roads. Sanitizer run mandatory (P4 discovery risk note), covering the editor tests too.Out of scope
Supersedes
(none — successor of the #103/#105 T-junction-quality lineage.)