I had a lool and I think the inset arithmetic can't be made right, because the problem isn't the value of the inset: it's that it's computed here at all.
I mean this fix will work but it isn't robust to future changes in the SBT geometry.
I suggest we tackle things a bit differently: the root cause is that DecayVolumeFactory holds a second, unsynchronised model of where the SBT is. Any expression written there will drift the next time either builder changes, and OverlapCheck won't notice. It's a subsystem-level bounding-box test and doesn't probe siblings inside decay_volume. That's why the original 120 mm overlap survived. I think CodeRabbit's suggested test (assert dx1/dx2 numerically) would make this worse: it pins the current formula, so a legitimate SBT change fails the test and the natural response is to update the expected number: accepting whatever overlap the change introduced.
I would suggest to instead move the placement rules (sideContainerCentreX, topBottomContainerCentreY, longBeamCentreY, zSplitOffset, xHalfAt/yHalfAt) onto SBTConfig as the single source of truth. Both builders place with them; a new SBTEnvelope reads them to derive innerFreeHalfX/Y(z). The arithmetic then exists in only one place. We then build the helium as one GeoTrap per envelope segment (2 per sub-frustum, 20 total) so it follows the shape exactly. helium_clearance_mm becomes a real gap and we can set it to 0. The algebraic verification can be replaced with a SAT test over the built tree. We would then assert that no helium slab intersects any SBT volume, and that the closest approach equals helium_clearance_mm (so an over-conservative envelope fails too). This is robust against re-parameterisations we may introduce in the future.
With that, the helium touches the SBT everywhere and protrudes nowhere (min separation 0.000 mm), and the fiducial volume goes to 485.85 m³ vs 482.41 m³ for this PR's (overlapping) shape. The SBT geometry will anyways undergo some fixes which should fit in nicely with this category of change.
I have an alternative build using this idea and can open a PR with it if this is seen as acceptable.
Originally posted by @matclim in #58 (comment)
Originally posted by @matclim in #58 (comment)