- openings.rs (neu): split_range_by_voids() — die bisher nur in section.rs
liegende Pfeiler/Brüstung/Sturz-Zerlegung, herausgezogen als koordinaten-
neutraler Helfer. section.rs und mesh.rs teilen jetzt EIN Öffnungsmodell.
- section.rs: wall_cut_rectangles delegiert den Sortier-/Rechteck-Teil an
openings::split_range_by_voids (plane-spezifisches Clipping bleibt lokal).
- mesh.rs: extrude_wall emittiert nicht mehr einen Vollblock je Wand, sondern
Teilkörper (Pfeiler in voller Höhe + Brüstung/Sturz je Öffnung) → echtes Loch;
Tür (sill==0) lässt die Brüstung weg und reicht bis zum Boden. Ohne Öffnung
exakt EIN Block, byte-identische Geometrie zu vorher (Alt-Tests unverändert grün).
Gates: cargo test 32/32 (29+3 neue), wasm32 --features web check grün, nativ grün.