Repository navigation
fix: the nightly fuzz's offset_executive_p2 timeout (offset refuses a distance below the B-rep tolerance) and name-seeded fuzz cases - #2737
Merged
Conversation
Each base case seeds a generator with fnv1a64("fuzz:" + unit + ":" + name) + i;
the base whose generator draws the largest first value wins (rendezvous hashing)
and that generator makes the mutations. Adding a fixture now changes only the
cases it wins instead of reshuffling every case's input.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
… fuzz00175) The static, solid and extended offsets refuse, before building anything, an offset distance that is not a finite length of at least the input's B-rep tolerance (OffsetFailure::DistanceUnresolved, kind InvalidInput, naming the distance and the tolerance). A member distance of 1e-300 took 31.5 s in Rust and 21 s in C++ (HANG-53). The p2 shim refuses the same inputs before the C++ runs them ([-2], Outcome::Refused -> a rejected case). The p2 runner runs every C++ call that reaches DoExtendedOffset in a fresh child process (the crash trap, generalised from UB-241), so a C++ crash there is a rejected case rather than a dead nightly. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
jyviko
force-pushed
the
fix/nightly-fuzz
branch
from
November 4, 2026 20:44
8cb0c56 to
e5c5468
Compare
…e input resolves (HANG-53) They passed the default distance 0, which the offset now refuses before anything is built, so they no longer reached the collapse they test. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the nightly fuzz's
offset.offset_executive_p2fuzz00175 timeout: the offset now refuses, before building anything, a distance below the input's B-rep tolerance, and fuzz cases are seeded by fixture name so adding a fixture no longer reshuffles every case. fuzz00167 (the C++ SIGSEGV with a negative approximation tolerance) is left to #2733.Units: offset.offset_executive_p2 (kernel, shim, runner), difftest fuzz driver.
What changes
offset_brep,do_solid_offsetanddo_extended_offsetrefuse an offset distance that is not a finite length of at least the input B-rep's tolerance:OffsetFailure::DistanceUnresolved { distance, resolution }, kindErrorKind::InvalidInput, message naming both values. Bound: the input B-rep's tolerance, the distance below which the model does not tell two points apart, so an offset that close lies within tolerance of its own face. (SolidError::InvalidInputcarries only a&'static str, so the refusal is a structured Errors: report solidcore-specific, descriptive errors instead of bare SMLib statuses and SMLib names #2615Failureof kindInvalidInput, which can name the values.) The shells already refuse below twice the tolerance (upstream's guard), so they never reach it. A member distance of1e-300took 31.5 s in Rust and 21 s in C++, inSubdivideToTolerances; recorded as HANG-53.[-2]→Outcome::Refused→ a rejected case), using the built source'sGetTolerance(), so the two sides stay aligned, including file sources and nonpositive fixture tolerances.crates/solidcore/tests/offset_negative_approximation_tolerance.rs.1e-300is refused, naming it and the tolerance, with the input unchanged.tolerance * (1 + ε)still builds, both extended and rounded.DoExtendedOffset(the extended operation, or any operation withextend_convex) runs througheval_in_child/ the neweval_measured_in_child. A C++ crash there is a rejected case, not a dead nightly. The mechanism is general and is not keyed to fuzz00167.bseedsfnv1a64("fuzz:" + unit + ":" + b) + i, and the largest first draw wins (rendezvous hashing). Adding a fixture changes only the ~1/(n+1) cases it wins. The nightly's case inputs change once because of this, so every unit'sfuzzNNNNNnames map to new inputs from this PR on. A test checks that inserting a base leaves every case it doesn't win unchanged.Results that change
|distance| < B-rep tolerance(including0) are now refused on both sides. In the fixtures that isfuzz00087(tolerance1e300, distance0.5, which was compared) plus generated static-offset cases with distance±0. Under the baseline ratchet these show as pass → rejected.Evidence
cargo clippy -p solidcore -p difftest -p solidcore-ffi --features difftest/cpp --all-targets -D warnings: clean (aarch64 box).cargo test -p solidcore --test offset_negative_approximation_tolerance: 4 passed.--fuzz 300, and thedifftestcrate's unit tests (including the new fuzz-seed test). The owner asked to wrap up first; these come before ready-for-review.Status: draft.
🤖 Generated with Claude Code