ce409e7bb1
The build is green: 14 tests, TunnelNetwork A+B bit-identical over 6000 samples, all twelve group probes non-zero, all 8 roughness variants identical, 0 gate leaks, C1 proved (10 Terrace rooms, 1119 samples inside them). One warning fired, and it is the one the test exists to fire: Underwater (stage C2): 2000 samples, 0 of them in open cave (0.0%) A GREEN BIT-IDENTITY OVER 2000 SAMPLES OF SOLID ROCK IS NOT EVIDENCE. It is exactly what two agreeing voids look like -- the 1.1% run of stage A, again, in a different slot. A REAL BUG FOUND WHILE DIAGNOSING IT The sampled chunk-Z range used Z / CHUNK_SIZE, and C++ integer division TRUNCATES TOWARD ZERO. TunnelNetwork sits at the top of the layout in positive Z, where truncation and floor agree, so it could not show there. Underwater sits at the BOTTOM, in NEGATIVE Z: -1 / 32 is 0 by truncation and -1 by floor, so the upper chunk bound starts one notch too high and the Clamp that follows piles the excess onto the strate's very last voxel -- inside the top seal band, i.e. solid rock. Fixed in both point builders via FloorDivChunk. Same family as the DivideAndRoundDown lesson already in the project notes: truncation costs a build cycle every time it is assumed to be a floor. That is a CANDIDATE cause, not a conclusion, so the commit does not stop there. NEW CHECK 5b -- ASK, DO NOT INFER Three causes produce "no sample in open cave" and they are fixed differently, so each now has its own number: rooms baked for the Underwater strate index (cause: the bake), samples landing inside the seal-free interior (cause: the sampled Z range), and the two together (cause: the XY spread). The info line says explicitly how to read them. Sampling also widens from 8 clusters to 24, matching the main scan. Fourth application of the rule this archetype keeps teaching: the check that explains a zero must be able to fail for exactly one reason. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>