Repository navigation
port: topology.brep_p2 - #149
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
This was referenced Oct 16, 2026
Merged
Merged
Queries, SetTolerance, RebuildUVTrimCurves, Notify and the spatial tree helpers, Make*Topology, ReplaceSurface, LocalCurveSector, RayFire, MergeCurvesOnSurface and MateLaminaEdgeToSurface. Calls into brep_p1, shell, face_p1/p3, edgeuse_p3, query.brep/face_p1 and curve_class_p2/4/5/7 are UNPORTED stubs. Wires SmBrep::Notify into topology::edge (NotifyEnv gains the caller-held B-rep cache slot). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
…ge report SmBrep::Notify is wired: topology.edge now PARTIAL 1715 passed, 0 failed, 72 deferred (none on topology.brep_p2). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
…y.brep_p2; wire its accessors Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
PARTIAL topology.brep_p2 cases=1006 passed=523 failed=0 deferred=483 (perturb SENSITIVE 523/523). The shim normalises analytic geometry to plain B-splines and registers the B-rep face/edge/vertex lists first so the port's list order (arena order) matches upstream's. The vertexuse FFI/runner helpers it reuses become pub(crate). Unit tests cover the two file statics the shim cannot call. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
PARTIAL topology.brep_p2 cases=1390 passed=738 failed=0 deferred=652; perturb SENSITIVE 738/738. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
Contributor
Author
|
First full difftest run: 🤖 Generated with Claude Code |
…topology.edge counts after the Notify wiring Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
Merged
Wire UNPORTED(topology.brep_p2) in heal.heal_data_p2 / topology.trimming_tools (SetTolerance) and mass.integrator / query.api_queries (IsManifoldSolid). SwapUV ignores non-Unported sm_SwapFaceUV errors (void upstream); sm_GetPointFromSol counts parameters by kind for foreign objects. The B-rep cache slot moves out of edge::NotifyEnv (other open PRs build it with struct literals) into brep::p2::notify's arguments. No generated case compares nothing; findings record coverage limits; clippy fixes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
…opology.brep_p2 # Conflicts: # plan/findings.md # plan/modules.toml # reports/difftest/topology.edge.json
…esh reports and notes PARTIAL topology.brep_p2 cases=1378 passed=723 failed=0 deferred=655, 0 both-errored, perturb SENSITIVE 723/723. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
# Conflicts: # reports/difftest/query.api_queries.json
…t_solve (main tangency-labs#118) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
…opology.brep_p2 # Conflicts: # reports/difftest/heal.heal_data_p2.json
# Conflicts: # plan/findings.md
…ngency-labs#150); follow main's CurveOnClassifyObjects + ClassGeometry bound PARTIAL topology.brep_p2 cases=1378 passed=723 failed=0 deferred=655, 0 both-errored, perturb SENSITIVE 723/723; sc-remote green 192 units, 0 failed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQThHpN1ijFAC69dfmSevR
…f wiring, Sector guard, Stale caches, MergeIntervals faces) - FFI rejects a negative MateLaminaEdgeToSurface extension factor (C++ hangs in N_SrfExtendByDist / ST_curxcdr, plan/upstream-issues.md HANG-18); the Rust port returns InvalidInput there; runner test mate_rejects_a_negative_extension_factor. - query::edge's stale UNPORTED(topology.edgeuse_p2) step-off stub is wired to topology::edgeuse::p2::evaluate_binormal_step_off_into (new: upstream's in-place out-params); the cases now defer on their real blocker, topology.edgeuse_p3. - LocalCurveSector guard: any point class (the default SM_ERR arm), SM_OT_UNKNOWN, intervals past the curve's domain; RayFire: negative tolerance, zero direction. - DeleteStaleCaches: both sides seed trimmed-surface caches by face masks and compare which survive. - MergeCurvesOnSurface keeps the faces of a failed MergeIntervals (CurveClassification::merge_intervals_into). - p2.rs header table complete; Deviations for the minor review notes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xbnf2bFY8cTu4zUgAv9s85
…angency-labs#65); regenerate reports Removes the UNPORTED(intersect.curve_class_p7) stub in MergeCurvesOnSurface. difftest: topology.brep_p2 1626 cases, 917 pass, 0 fail, 709 deferred; query.edge 1368/1190/0/178 (topology.edgeuse_p3). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xbnf2bFY8cTu4zUgAv9s85
Brings in tangency-labs#161 (boolean.merge_p5) and tangency-labs#163 (boolean.merge_p1); topology.edge notes keep the Notify wiring note and add tangency-labs#163's sentence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xbnf2bFY8cTu4zUgAv9s85
…-18); drop duplicate UB-136 - modules.toml: brep_p2 notes with 1626/917/0/709, deferrals by true blocker (topology.edgeuse_p3 309), 259 passes without numeric content, FFI guards, wiring of query::edge step-off and AreCoincidentMaybe; query.edge notes name topology.edgeuse_p3. - findings.md: coverage numbers, DeleteStaleCaches seeding, face_p2 GetTolerance stubs, FFI restrictions. - upstream-issues.md: remove the SmCopyBrepMap UB-136 entry carried in from a stale tangency-labs#145 merge (it is UB-98, as tangency-labs#145's latest branch has it); the shim comment and brep_p1 note point at UB-98. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xbnf2bFY8cTu4zUgAv9s85
bluecmd
added a commit
to bluecmd/solidcore
that referenced
this pull request
Oct 20, 2026
…ncy-labs#252 fillet_geom_p4) into unit/topology.brep_p3 Conflicts: two reports (main's; regenerated by the gate) and plan/modules.toml (main's notes with tangency-labs#149's and tangency-labs#204's UPDATEs appended). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EejtV1zKGq7z2inPd9ZrxY
bluecmd
added a commit
to bluecmd/solidcore
that referenced
this pull request
Oct 20, 2026
…mt the adapter test Full gate on 4c7a444: brep_p3 897 / 664 / 0 / 233, --perturb 664/664, FUZZ-PASS 2000, valgrind clean on 33 filters, 32 touched units 0 failed, 1552 tests; green 235 units, 0 failed. Report changes from this round: boolean.merge_p3 (37) and boolean.api_brep (21) relabel SmBrep(copy) topology.brep_p3 -> topology.brep_p4 StitchFaces; the query.api_queries / heal.heal_data_p1 changes are tangency-labs#149's and main's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 20, 2026
|
Landed in batch #315; thanks @bluecmd! 🤖 Generated with Claude Code |
denelson1-dot
added a commit
to denelson1-dot/solidcore
that referenced
this pull request
Oct 20, 2026
, tangency-labs#314) into unit/blend.fillet_solver_p3 Conflicts in offset.offset_geometry_creation: main's batch wired its topology.brep_p2 stubs (tangency-labs#149), and this branch carries tangency-labs#192's wiring of SmCircularCrossSectionFSG::CreateSurfaceFromCurves. The module's stub list now names only the curve.crv_on_surf stub left; the unit's notes take main's text (the tangency-labs#149 re-runs) and the report main's copy, both refreshed after --green. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
denelson1-dot
added a commit
to denelson1-dot/solidcore
that referenced
this pull request
Oct 20, 2026
…with tangency-labs#192's wiring --green at 1ef8cb7 (x86_64): 235 units, 114 passed, 121 partial, 0 failed. main's topology.brep_p2 wiring (tangency-labs#149) plus tangency-labs#192's SmCircularCrossSectionFSG::CreateSurfaceFromCurves: 562 passed, 0 failed, 299 deferred (main's report: 552 / 309; its 11 blend.fillet_standard_solver_p1 deferrals: 10 pass, 1 reaches curve.crv_on_surf). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bluecmd
added a commit
to bluecmd/solidcore
that referenced
this pull request
Oct 20, 2026
…angency-labs#149 wired topology.brep_p2) 830 cases, 713 pass, 0 fail, 117 deferred (query.brep 18, topology.face_p2 82, topology.face_p4 17); the report equals main's case for case except the 7 face-box cases, which still defer deeper (6 at SmFace::GetUpwardLoopuses, 1 at SmBrep::CalculateBoundingBox). Perturb 713/713, FUZZ-PASS 2000, merge_p4 unchanged 311/30/0/278. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Pluto-XI
added a commit
to Pluto-XI/solidcore
that referenced
this pull request
Oct 20, 2026
Main landed topology.brep_p2 (tangency-labs#149) as partial, so its stubs here become real calls: the SmMerge constructor's GetMinEdgeBBoxSize (with_breps now takes the kernel), MergeAddedTopology's SmBrep::Notify and IsManifoldSolid (required MergeBrep methods; the runner deletes its B-rep cache on PRE_EDIT), and api_brep's IsManifoldSolid. The runner passes brep_p6's new notification environment to TestClosureSplitRegion. make_faceuse_unmated_vertex now reaches MakeShellVertexTopology: the shim numbers the new vertex use by its native walk (shells before face uses) while the arena appends it, so the shared merge_p5 snapshot numbers records by the same walk (merge_p1 runner's Canon::of_native). Also drops the redundant too_many_* allows in merge/p2.rs (workspace allows). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 20, 2026
bluecmd
added a commit
to bluecmd/solidcore
that referenced
this pull request
Oct 20, 2026
… (brep_p2 wired) With topology.brep_p2's stubs wired on main, part 7's glue no longer stops at its first notify: a wire edge to delete now stops at SmBrep::DeleteEdge (topology.brep_p4). The unit test builds real wire edges (shell-owned edge uses) and pins that; header and modules.toml note updated. Both stitch reports stay byte-identical to main's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
bluecmd
added a commit
to bluecmd/solidcore
that referenced
this pull request
Oct 20, 2026
…ctor_p2-close-intersection-loop Brings in batch tangency-labs#315 (tangency-labs#149). The p2 and merge_p4 notes keep this branch's text, with main's appended tangency-labs#149 re-run sentence added. The p2 report is regenerated on the merge: 905 cases, 725 pass, 0 fail, 180 deferred. All 841 shared cases equal main's report. Against the previous tangency-labs#281 report, only 6 deferrals are relabelled by tangency-labs#149's brep_p2 wiring (4 Notify -> brep_p1 m_pVertexListHead, 2 GetMinEdgeBBoxSize -> face_p2 GetTolerance); the notes' breakdown is updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bluecmd
added a commit
to bluecmd/solidcore
that referenced
this pull request
Oct 20, 2026
…ifold-boolean Brings in batch tangency-labs#315 (tangency-labs#149). The merge_p3 and merge_p4 notes keep this branch's text, with main's appended tangency-labs#149 re-run sentence added. Re-gated: merge_p3 387 cases, 215 pass, 0 fail, 172 deferred, identical case by case except the 40 merge_p4 -> merge_p2 relabels this PR makes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bluecmd
added a commit
to bluecmd/solidcore
that referenced
this pull request
Oct 20, 2026
…angency-labs#149 wired topology.brep_p2) The report equals main's tangency-labs#149 re-run case for case plus this branch's 13 cases: 874 cases, 565 pass, 0 fail, 309 deferred (the 166 topology.brep_p2 deferrals are gone); perturb 565/565; seeds 4074/2650/0/1424; 327 success paths; the same two fuzz draws (fuzz01915 timeout, fuzz01241 differs note); green-par 234 units, failed=0. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
bluecmd
added a commit
to bluecmd/solidcore
that referenced
this pull request
Oct 20, 2026
… brep p2 wiring) into unit/blend.fillet_executive_p2 The p2 runner's Access runs topology::brep::p2::set_tolerance for real (now required on ExecutiveAccess). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bluecmd
added a commit
to bluecmd/solidcore
that referenced
this pull request
Oct 20, 2026
…bs#315, tangency-labs#149 topology.brep_p2) into unit/topology.brep_p3 Conflicts: - topology_intersector/p2.rs: main's header (GetFaces / CombineCoincidentVertices through IntersectorBrepP2) without the DeleteFace stub entry tangency-labs#204 wired; both old stubs (GetFaces, DeleteFace) dropped. - intersector_p1 runner: both imports (bp3 and bp5). - plan/modules.toml: main's notes (now including tangency-labs#149's) with tangency-labs#204's UPDATEs appended; tangency-labs#149's text is not repeated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tdamsma
added a commit
to tdamsma/solidcore
that referenced
this pull request
Oct 21, 2026
Conflicts: fillet_custom_solver/fillet_intersector/fillet_solver p1 keep this branch's wiring (main's side equalled the older merge base); topology/brep/p7 takes main's (tangency-labs#149); offset_geometry_creation header drops the brep_p2 stub mention main wired; offset notes and report taken from main, regenerated below. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H9QwJFBTKLZ9FFK3nVd1X4
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.
Ports unit
topology.brep_p2: the 23SmBrepfunctions it owns insource/SMLib/src/SmBrep.cpp, assolidcore::topology::brep::p2.What is in it
GetEdgeuses,GetShellVertices,IsManifoldSolid,IsSheet,IsOrientedSheet,GetMinEdgeBBoxSize.SetTolerance(SM_USE_OLDTOL),RebuildUVTrimCurves,sm_CheckAndFixUVTrimCurves,SwapUV,DeleteStaleCaches.Notify,sm_AddToSpatialTree,sm_RmFromSpatialTree. TheSM_OC_BREPcache is held by the caller and passed tonotifyas aBrepCacheSlot.MakeShellVertexTopology,MakeEdgeVertexTopology,MakeEdgeTopology.ReplaceSurface,LocalCurveSector,RayFire,sm_GetPointFromSol,MergeCurvesOnSurface,MateLaminaEdgeToSurface.SmBrep::Notifyintopology::edge(topology.edge's deferrals on brep_p2 5 → 0) and in topology.brep_p6'sTestClosureSplitRegion(PRE_EDIT,SPLIT_IN_BREP(old, old, new), statuses ignored,SmBrep.cpp:27954-5; the split API and heal_data_p1'sfix_bad_sheetstake the caller'sNotifyEnv, see below),SetTolerancein heal.heal_data_p2 (and through it heal.heal_data_p1 / heal.heal_data_p3) and topology.trimming_tools,IsManifoldSolidin mass.integrator and query.api_queries. Passes against main: query.api_queries 648 → 773, heal.heal_data_p2 347 → 364, heal.heal_data_p3 267 → 314, heal.heal_data_p1 265 → 266; none of them defers ontopology.brep_p2any more.query::edge's staleEvaluateBinormalStepOffstub now callstopology::edgeuse::p2::evaluate_binormal_step_off_into(an in-place variant that keeps upstream's partially written out-params on failure).AreCoincidentMaybeinMergeCurvesOnSurfacenow callsintersect.curve_class_p7(port: intersect.curve_class_p7 #65).ProtoTopologyManager::new's tolerance fallback (SmProtoTopology.cpp:3548-3556) now callsBrep::toleranceandbrep::p2::min_edge_bbox_size:new()takes the kernel and each B-rep as(handle, &Brep), the proto_topology_p1 and query.face_p2 runners pass two emptyBreps as their shims build two emptySmBreps, and 5 new proto cases (approx_tol0, -1e-3, -1, 1e-13 andSM_EFF_ZERO) compare the branch. With the fallback disabled, the four proto cases belowSM_EFF_ZEROfail. Only the tolerance half is compared against C++ in proto_topology_p1 (two empty B-reps never let the edge-size half win); since the main merge with port: boolean.topology_intersector_p1 #146, boolean.topology_intersector_p1'sMgrNewop passes its two real runner B-reps too, andMgrNewnow outputs the manager'sGetTolerance, so the fallback value is compared: withtol = 3*min(..)mutated, 20 intersector p1 cases fail.ReplaceSurface'sSmFace::SetSurface(defaultbDeleteCurrFaceFALSE) andRemoveUVTrimCurvescalltopology::face::p1::set_surface/remove_uv_trim_curves, and face_p1'sMoveSeamcallsbrep::p2::replace_surfaceexactly asSmFace.cpp:17602(ReplaceSurface(this, pJoinedSurface, FALSE, NULL, FALSE)). EveryReplaceSurfacecase still defers first atSmFace::Notify(topology.face_p3).Make*Topologyfunctions (region shell-listPostInsert/Removewith its status ignored,IsVertexShell, the vertex shell's vertex use, the vertex / wire shell type and head,SER(TransferChildrenTo)), asSmBrep.cpp:18714/13799/13641; and the 3MateLaminaEdgeToSurfacesites (GetOrCreateUVTrimCurvecopy and trim,NormalizedEvaluate(t, FALSE), header defaults).make_edge_topologytakes the kernel;local_curve_sector/ray_firetake the B-rep mutably (port: topology.edgeuse_p3 #117's sectoring may make UV trim curves).env: &mut NotifyEnv<'_>(as do heal_data_p1'sfix_bad_sheets); heal_data_p3'sFixBadsheetsstep and the runners passbrep::p2::RegionNotifyState(an emptyAttributeStoreand default region records). The heal path carries no attribute state at any level, soSmSAGObjectattribute propagation during healing is not modelled; this predates the PR and is recorded inplan/findings.md. topology.shell'sShellRayWorld::shell_ray_sectordefault is retaggedUNPORTED(query.brep)(the B-rep-cache world overrides it withbrep::p2::local_curve_sector).Readerisunit_reader!(MAX_COORD)and private again; the brep_p2 wrapper uses its own and reads blocks throughvu::surface_at/curve_at/brep_block_at.Builds on #145 (
topology.brep_p1, head5b1b28ae, which includes main throughe1ae2640), merged in as-is; main is merged up toca3f8c29. Calls into units that are not ported yet go throughUNPORTEDstubs:topology.face_p3(#139),query.brep,query.face_p1andintersect.curve_class_p2/p4.MergeIntervalsis wired tointersect.curve_class_p5. Nothing owned by another open PR is co-ported.SmBrep::Notifyend to end (#210)brep::p2::notifyports every arm ofSmBrep::Notify(SmBrep.cpp) with all its arguments:PreEdit/Destructiondelete theSM_OC_BREPcache,MergeInBrepremovesd2from the spatial tree,RmFromBrepremovesd1,SplitInBrepaddsd2andd3(when they differ fromd1),AddToBrepaddsd1, every other type is a no-op, and thenSmSAGObject::Notifyruns. With no cache slot the spatial-tree helpers return before any stub, so the no-cache path (every current Rust caller) has none. With a cache, the face branch stops atUNPORTED(query.face_p1)SmFace::CalculateBoundingBoxand the cache rebuild atUNPORTED(query.brep); the code after those calls is ported. The 7 remainingUNPORTEDstub sites inbrep/p2.rstargettodounits (topology.face_p3 3, query.brep 1, query.face_p1 1, intersect.curve_class_p2 1, intersect.curve_class_p4 1).Review 5578349117 round (head
167dd352, main merged through39ceb995)UNPORTED(topology.brep_p2)sites main had are wired (685608d2), each with upstream's status handling.02b28cd1).660b3270,da779c51).863c5810): 229 units, 0 fail. The per-unit lines and the mapping to each must-fix are in the review reply. The other unit numbers in this description below predate this round; the review reply has the current ones.ANALYTIC_EXPORT: gen0119 and gen0707 on anSmSurfOfExtrusion, gen0376 on anSmSphere. On main they passed only because a brep_p2 stub stopped them beforeLiftCurve; past it, the C++ runs the subclass's iso-curve override, and the RustSurfaceKindhas no extrusion or sphere variant to import those faces as (issue Coordinate Kernel-aware Surface dispatch for analytic surface kinds #76 tracks that gap).ed40f92cimportsSmSurfOfRevolutionfaces exactly: the shim exports their binaryWriteToDBrecord and the runner reads it back withSurfOfRevolution::read_from_db. The other 3 of the original 6 (gen0009, gen0148, gen0520) pass again, as does gen0683.intersect.surface_drop_curve.--perturbSENSITIVE 552/552.--fuzz 2000has 0 differs, crashes or panics and 1 timeout, fuzz00504. Itstrim_extended_edgetakes C++ about 2 s and Rust 18-24 s, against a 20 s budget. The time goes into rebuilding curve.curve_p5's curve cache on every call underglobal_curve_intersect, a documented deviation of that unit; this PR's wiring made the path reachable. It is recorded in plan/findings.md under curve.curve_p5 (3a6ea1df) and in COORD.md, and left to that unit's owners.--fuzz 2000is FUZZ-PASS with differs=2. fuzz00488 and fuzz00815 are Mate with the plane's origin at ±9.2e18: status 1001 in C++ vs 1006 in Rust. The cause is in the plane'sglobal_point_solve(surface_p4 / plane_p1), not brep_p2 logic. Both inputs are in plan/findings.md.a37776b1..167dd352): main's 5 newUNPORTED(topology.brep_p2)sites are wired, and merge_p4'sArenaPairimplementsbrep_arena/BrepGlue. merge_p3's arena-onlyboolean_listsnotifies its component copy through an arena-only store; this reverses port: boolean.merge_p3 #245's stated design (see the reply). Pre-review fixes are in63997139(region notification keys, p5 Deviations). The gate on167dd352has all 232 units at 0 fail; query.api_queries gains 42 passes and topology.brep_p7 gains 40.offset_offset_executive_p1::each_highlevel_probe_calls_its_real_methodandintersect_curve_class_p4::undefined_scripts_are_rejectedfail on clean main too. They are not touched here and are listed in COORD.md.Difftest
Flips against the pre-merge round (7311346): 228
EvaluateBinormal→ pass (Sector), 66GetShells→ pass (IsSheet / IsOrientedSheet), 76 shell stubs → pass (Make, compared topology), 74 →intersect.surface_drop_lib_p3, 38SwapUV→topology.face_p4, 7 →topology.face_p2; 0 new fails or hangs. Of the 52 orientation-0 (SM_OT_UNKNOWN) sector fixtures 46 pass now.The shim (
harness/cpp/shim/topology_brep_p2.cpp) builds realSmBreps with the shared topology fixture: 15 upstream.smbfiles, a wire edge, a 10x10 plane face, and themy_test_topologywire network. It replaces analytic geometry by plain B-splines so the Rust import is exact, and registers the B-rep face, edge and vertex lists first, so the import order is upstream's list order. 1309 fixture cases (upstream test calls:SetTolerancesmTopoTest.cpp:337 and :696, smMergeTest.cpp:1728;IsManifoldSolidsmTopoTest.cpp:449;MergeCurvesOnSurfacesmTopoTest.cpp:1664) plus 400 generated cases with tiny and huge scales. The two file statics, which the shim cannot call, are covered by Rust unit tests.Review of 0258c83: back-edges wired (at
8fdfa2c8)No
UNPORTED(topology.brep_p2)remains in the crate.topology.brep_p7(port: topology.brep_p7 #155):brep_notify→brep_p2::notifythroughglue_edges_general'senv(PRE_EDIT withthis, MERGE_IN_BREP(surv, del, this)),brep_set_tolerance→set_tolerance,check_and_fix_uv_trim_curvesandrebuild_uv_trim_curves→ p2; statuses ignored asSmBrep.cpp:9840/9854/2014.heal.stitch_p1(port: heal.stitch_p1 #196):brep_notify_pre_edit→brep_p2::notify(.., PreEdit, [this, None, None])on an empty notify state (no B-rep cache, no attribute state on the heal path).topology.brep_p10(port: topology.brep_p10 #130):is_manifold_solid(m_bManifold = IsManifoldSolid()),point_from_solution,shell_vertices(b, None), andmerge_curves_on_surface, which now callsbrep_p2::merge_curves_on_surfaceasSmBrep.cpp:25074. Its classification world over the B-rep cache is uninhabited (CacheMergeWorld), and its constructor is theUNPORTED(query.brep)stub:query.brep(todo) is the real blocker, as fortopology.shell'sshell_ray_sector.brep_p2::connect_intervals→CurveClassification::connect_intervals(index, pos, false)(SmBrep.cpp:22072, SER); dropped frommerge_curves_on_surface's# Errorsdoc.Unit tests changed in other units' code (the back-edges make new paths reachable):
topology/brep/p10.rs(port: topology.brep_p10 #130):healing_runs_and_manifold_is_unportedis nowhealing_runs_and_manifold_is_computed; anUNSUREmanifold flag is computed (0for a sheet) instead of deferring.topology/brep/p7.rs(port: topology.brep_p7 #155):glue_no_opsgluing two bare edges (no edge uses) now reachesInvalidInput("edge without primary edge use")past the notifications;read_errors_and_deferralreads an empty file successfully (sm_CheckAndFixUVTrimCurveshas nothing to fix).Also from the follow-up branch (your nits on
87c57c02): the runner'sNotifyenv (type-distinct keys, a B-rep record, 68 fixtures for all 17 operations), theReplaceSurfacepTopFaceDeviations line, and the Sector guard refusing onlyt0 == t1(12 inverted-interval fixtures).Coverage, stated plainly
with_values=1367 no_values=0: every pass compares at least one value; the 330 below compare only a status code or constant output, which the summary counts as a value.IsSheet/IsOrientedSheet,GetMinEdgeBBoxSize,SetTolerance,LocalCurveSector,DeleteStaleCachesand theMake*Topologytopology summaries.Notify(230, including the 68 that cover all 17 operations with the B-rep as a data object: the constant0, neither side has a B-rep cache),MateLaminaEdgeToSurface(91: the earlySM_ERR, including 3 noedit cases with the mating plane at ±1e300 / 1e160),MergeCurvesOnSurface(3: a status),SwapUV(2: face-less B-reps),RebuildUVTrimCurves(4: no UV curves).RayFire(query.brep's B-rep box),ReplaceSurface(face_p3), andMateLaminaEdgeToSurfacepast its early returns (it defers atSmFace::Notifybefore its wired edgeuse_p3 sites).SmPlane/SmLineis turned into plain B-splines before each op; none of this unit's own branches depend on the kinds.query.breplands, so the spatial-tree add/remove paths ofNotifyare not compared.All of this is also in
plan/findings.md("topology.brep_p2 (PR #149): coverage limits of the difftest").Upstream issues
MateLaminaEdgeToSurfacewith a negative extension factor never returns (N_SrfExtendByDist). The FFI rejects a negative factor; the Rust returnsInvalidInput.dMaxDistinfinite andCreateExtendedSurfacenever stops halving. AMateProbeshim op replays Mate's early returns and then computes upstream'sdMaxDist; the FFI refuses only a Mate that would extend by a non-finite distance.SmVertexuse::GetVertexFaceGap(underinit_gaps) slows down and then stops returning on a degree ≥ 2 B-spline face with a corner far out. Measured with timeouts on x, y and z: non-rational corners are fast up to1.34e154(≈ √DBL_MAX), slow from1e155, not returning around1e156; for a rational net (homogeneous, vertex = stored / w) a small weight moves the vertex out and a large one the stored value. The FFI refuses a non-rational corner coordinate above1e154and a rational one above1e151on the stored or the Cartesian value (pod probes and two re-checks).UNPORTED tags and deferral labels changed
UNPORTED(topology.shell)and 3UNPORTED(topology.edgeuse_p3)sites intopology/brep/p2.rs; topology.brep_p6'sUNPORTED(topology.brep_p2) SmBrep::Notify;UNPORTED(topology.edgeuse_p2)inquery/edge.rs(superseded by port: topology.edgeuse_p3 #117's wiring in the merge);UNPORTED(intersect.curve_class_p7)inbrep/p2.rs; port: topology.brep_p1 #145'sUNPORTED(topology.brep_p2) SmBrep::GetMinEdgeBBoxSizeinproto.rs.ShellRayWorld::shell_ray_sectordefaultUNPORTED(topology.brep_p2)→UNPORTED(query.brep)(overseer ruling). topology.brep_p6's split now stops atUNPORTED(query.brep) SmBrep::CalculateBoundingBox, upstream's next call.UNPORTED(topology.brep_p2)remains in the crate.SmApiHealBrepbox cases defer toprimitive.api_primitives(the Rust side cannot build the box); mass.integrator's former brep_p2 deferral is port: topology.brep_p1 #145'sharness:mass.integrator-face-construction.AGENTS.md §4 step 5 checklist
SetTolerance(TRUE, TRUE)and the cascades (FALSE),SmEdge::CalculateBoundingBoxbTight = FALSE, curve boxesbExpandBox = TRUE,SetUVTrimCurve(NULL, 0.0, TRUE, NULL),CreateExtendedCurvebPrecise = TRUE,ReplaceSurface(pFace, pExt, FALSE, NULL)withbOptCreateUVTrimCurves = TRUE,AreCoincidentMaybe(.., FALSE),SmFace::SetSurfacebDeleteCurrFace = FALSE,GetOrCreateUVTrimCurve(pUV)(NULL,NULL,TRUE),NormalizedEvaluate(t, FALSE, pnt)(NULL,TRUE),TransferChildrenTo(pTo, NULL).SmZoneTol3dvalues are converted withzone_tol3d(fabs).LocalCurveSector, the vertex vote,[B111],[B674], the vertex-shell swap and removal ofMakeEdgeTopology.Remove, the firstGetOrCreateUVTrimCurvecalls,Trim, the p6 notifications); onlyUnportedand representation failures propagate.SmPlanefaces and mating surfaces next to B-splines.LocalCurveSectorwith an empty or non-finite interval, a point class outside 100..=110 or an orientation outside 0..=2; a null region without an infinite region; a negative mate extension factor (HANG-18); a mate whose probed extension distance is not finite (HANG-9); a degree ≥ 2 face underinit_gapswith a corner past the HANG-28 bounds; non-finite values..get().UNPORTEDstubs exist only for units that are neither green nor partial.🤖 Generated with Claude Code
https://claude.ai/code/session_01Xbnf2bFY8cTu4zUgAv9s85
Status (updated 2026-10-20 19:18 UTC)
167dd352, on top of the review round for bherbruck's review 5578349117 (reply, updated with this round: port: topology.brep_p2 #149 (comment)). Main is merged in through39ceb995(batch: land 5 reviewed-clean contributor PRs #283, no rebase). NoUNPORTED(topology.brep_p2)remains in any crate.cargo test -p solidcore(1507) pass; all 232 units have 0 failures, andcargo test -p difftest --features cppfails only main's two known tests. Known deviation: 3offset.offset_geometry_creationcases that pass on main now defer (ANALYTIC_EXPORT;SmSurfOfExtrusion/SmSphere, which have no RustSurfaceKind, issue Coordinate Kernel-aware Surface dispatch for analytic surface kinds #76). offset--perturbis SENSITIVE 552/552 and its--fuzz 2000is FUZZ-FAIL on 1 timeout (fuzz00504, the curve.curve_p5 cache-rebuild cost, not this unit's defect). brep_p2--fuzz 2000is FUZZ-PASS with differs=2 (the plane point solve at ±9.2e18).167dd352confirmed all three earlier must-fixes (6,839 extra cases, 0 mismatches). The only must-fix is a merge of current main (modules.toml and two reports); once that is pushed and CI is green it is good to merge. That merge round is in progress.