Shim op 4 runs SmApiBrepCopy, then a union with a box (or with a box's
copy), SmApiFilletEdges or SmApiShellBrepFull on the copy, then the capi
check of the result; the Rust side runs the same operations on its
caller-keyed api_brep_copy and check_brep. 12 cases in
fixtures/topology.assert_valid/copy_ops.json, all valid on both sides.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
Shim op 3 runs the capi check sequence on the body's SmApiBrepCopy; the
Rust side copies with api_brep_copy under caller keys and runs check_brep
by the copy's naming. 48 fixture cases compare the check outcome.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
Conflicts resolved in topology/vertex.rs (doc list), harness/callgraph/units.json (union, main first) and plan/units/topology.{assert_valid,face_p4,vertex}.toml (main's notes plus the PR's suffix).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The face walk's surface check now calls Surface::assert_valid (#1460).
Upstream SmPlane reports its placement checks under &m_vPosition; the
port names them by the surface key, so the shim maps the plane's
GetPosition() address to that surface's report identity.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
Op 2 runs sm_AssertTestFace32/33/38 per face, sm_AssertTestEdge13 per edge
and sm_AssertTestVertex1 per vertex on both sides (the full walk defers at
the level-0 seams until WP2/WP3a land). Fixtures: 202 op-2 cases over
primitives, upstream .smb files, planar/B-spline/thin faces and vertex
and tolerance mutations; 94 level-2 AssertValid / capi cases. Drops
CalcEdgeFormFromFaces from the call-graph entries: IsOnFaceEdgeForm reads
the cached edge/face gaps and does not call it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEtgaA54W2nr8dK1EYp
Ports the AssertValid walk over every topology level (Brep, Region, Shell,
Face, Faceuse, Loop, Loopuse, Edge, Edgeuse, Vertex, Vertexuse level-0
bodies, the SmTopology/SmOwningTopology/SmSAGObject base checks, the
validate-only tolerance pass and the SmCurve::AssertValid dispatch), plus
SmAssertReport::FormatLogMessage and SM_GetObjTypeString, behind a public
check_brep -> BrepCheck API matching the capi smlib_brep_check sequence.
Calls into checks owned by later packages go through UNPORTED seams.
New difftest unit topology.assert_valid (shim, ffi binding, runner, 516
fixtures over primitives, constructed bodies, upstream .smb files and ten
mutation kinds): 532 cases, 153 pass, 378 deferred on the seams, 1 known
mismatch in the existing ValidatePointers port (recorded as a finding).
Regression tests in crates/solidcore/tests/issue_1419_brep_check.rs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEtgaA54W2nr8dK1EYp