Follow-up to #6. The FFI guard now only requires finite values for the
net scale, chord height, maximum side, line and CSI domain (disjoint,
touching-edge and sliver early exits are compared). It keeps the [0,1]
split/iso domain, the angle range, the revolution-CSI rejection and the
shim's all-degenerate max-side guard, and adds max|net|/max side <= 1e5
so the ULONG split count stays finite and under the Rust 1e6 limit.
43 new fixtures (CSI domain disjoint/touching/sliver, 1e6-scale nets,
chord heights 1e-4/1e-5, max side 1e3/1e6) pass bit-identically or
defer on surface.surface_p6. The max-side iso degeneracy test now uses
the typed iso curve (SmEllipse/SmLine IsDegenerate), as upstream's
virtual call does. Notes: CsiGlobalSolver field CO-PORTED record in
surface.surface_p1; duplicate review sentences removed from
surface_cache_p2/p3.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Resolve conflicts in geom/tol.rs (keep surface.surface_p1's CO-PORTED note and
this unit's classification mappings) and plan/findings.md (keep both).
Handle the new SurfaceKind::SurfOfRevolution (SmBSplineSurface base flag) and
Step variants in out_of_bounds. Wire SmTol::GetZoneTol3d(SmSurface),
smsurf_GetSurfaceCache and SmSurface::ApproximateSize to surface.surface_p1:
2088 cases, 1908 pass, 0 fail, 180 deferred (52 moved to surface.surface_p6).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
All local gates pass against the updated main. Full differential validation
evaluates 134 units: 87 green, 47 partial and zero failed. The three part-9/cache
reports remain byte-identical to their focused and committed reports.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Keep both sides' SurfaceKind arms (Plane overrides from this unit; the
SurfOfRevolution and Step kinds from main). Add the SmPlane::GlobalSurfaceIntersect
SurfOfRevolution case (orders and UV curves swapped, as upstream), which needs
&Kernel on Surface::global_surface_intersect / intersect_with_plane. Wire the
plane box zone tolerance to Surface::face (surface.surface_p1 is partial):
a plane with a face now defers on SmFace::GetTolerance (topology.face_p2).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Use the newly ported revolution surface's virtual iso constructor and B-spline
base. Add 18 direct canonical-cylinder comparisons against the real C++ class.
Refresh cache reports after the upstream dispatch changes and retain explicit
CSI and classification deferrals.
All required local gates pass; full differential validation covers 133 units
with 85 green, 48 partial and zero failed. Part 9 compares 727/778 cases exactly.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Remove the duplicate CSI state, preserve the existing part-1 constructor and
wire its surface/node/point validity helpers. Add 16 real-plane fixtures without
diagonals and refresh differential reports after the main integration.
Part 9 compares 709/760 cases, cache part 2 808/905 and cache part 3 450/600;
all compared values are identical and all remaining deferrals name their owner.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Resolve against surface.surface_p1 (#43) and surface.cone_p1 (#31): keep both
SurfaceKind variants (SurfOfRevolution, Step) in every match, give the
surface of revolution its SmSurface dispatch in surface::surface::p1
(EvaluateSTEP override, inherited SmBSplineSurface bodies), share one
ConvertDomainFromNURBSToSTEP body, and wire the cone's SmSurfOfRevolution
Transform/ReadFromDB back-edges. surface.torus becomes green.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Fix the 11 clippy errors in the runner that the CI "Clippy with the C++
feature" step reports (identical match arms, needless range loop, unchecked
indexing, range_plus_one, default_trait_access) without changing the RNG
call order, so the generated cases are unchanged. Add the reviewer's 75
adversarial cases as fixtures (UV trim curves, huge/tiny scale, analytic
source curves, containers past MIN_ARRAY_SIZE). Tidy a comment rustfmt
had misindented in get_cci_surface_gaps.
PARTIAL cases=2088 passed=1908 failed=0 deferred=180; --perturb 1908/1908.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
PR #31 (surface.cone_p1) merged with UB-80, UB-81, WR-61 and WR-62, which
were already taken on main or by this PR's topology_solver renumbering. The
cone entries become UB-87, UB-88, WR-63 and WR-64 (HANG-11 unchanged), with
references in plan/findings.md and plan/modules.toml updated.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm