After #901 the rana-60 stator is analytic and volume-correct (7854 vs 7848 mm³), but its export mesh still carries ~100 unpaired (net-directed) edges and 2 over-used; ring ∪ 12 filleted posts carries ~180 (+0.07% volume). The plain-post case is clean at 0, so the residue is at the fillet blocks' tangent rims, not the caps.
Smallest repro (helpers in crates/vcad-kernel-booleans/tests/coplanar_cap_union.rs): ring() ∪ fillet_block(1.0) — correct volume, 8 open edges. The block's fillet arc (r 1.05) ends exactly on the bore circle (r 24) at the tangent point, which is also the block's corner. Within ~0.06 mm of that point the two arcs are microns apart, and the two faces that share the rim sample it differently: e.g. one side has the edge (23.857, 2.617) → (23.716, 3.679) where the other has vertices at (23.7187, 3.6529) and (23.7122, 3.7057). Volume-neutral hairline t-junctions, but every downstream boolean and every exporter sees an open shell.
Done when: bore_circle_cuts_a_cap_whose_fillet_is_tangent_to_it can also assert mesh_report(..).open_edges == 0.
🤖 Filed by Claude Code
After #901 the rana-60 stator is analytic and volume-correct (7854 vs 7848 mm³), but its export mesh still carries ~100 unpaired (net-directed) edges and 2 over-used;
ring ∪ 12 filleted postscarries ~180 (+0.07% volume). The plain-post case is clean at 0, so the residue is at the fillet blocks' tangent rims, not the caps.Smallest repro (helpers in
crates/vcad-kernel-booleans/tests/coplanar_cap_union.rs):ring() ∪ fillet_block(1.0)— correct volume, 8 open edges. The block's fillet arc (r 1.05) ends exactly on the bore circle (r 24) at the tangent point, which is also the block's corner. Within ~0.06 mm of that point the two arcs are microns apart, and the two faces that share the rim sample it differently: e.g. one side has the edge (23.857, 2.617) → (23.716, 3.679) where the other has vertices at (23.7187, 3.6529) and (23.7122, 3.7057). Volume-neutral hairline t-junctions, but every downstream boolean and every exporter sees an open shell.Done when:
bore_circle_cuts_a_cap_whose_fillet_is_tangent_to_itcan also assertmesh_report(..).open_edges == 0.🤖 Filed by Claude Code