Repository navigation
fix: ClassifyLoops' loop bisector keeps its B-rep edits (#681 site 2) - #827
Merged
Merged
Conversation
SmFace::ClassifyLoops' loop bisector (sms_FindAndClassifyLoopBisector) ran IsSeam on a private clone of the B-rep and each CurveOnClassify on a fresh snapshot, so the UV trim curves upstream's IntersectTSBound -> ComputeUVPoint makes on the face's own B-rep, and the gap caches SetUVTrimCurve resets, were lost. The bisector's IsSeam and classifications now share one CurveOnClassifyCache snapshot, threaded through classify_loops and SetProps_Stage3 (crate-private _cached variants; the public entry points keep a private one). The healer's in-place SetProps (set_props_with_query_gaps, now also used by CacheFaceProps_Stage3) runs the seam classifications and ClassifyLoops on that one snapshot and copies its UV trims, tolerance growth and gap caches back to the B-rep (apply_uv_trim_updates, as IsInnerShell does since fd54ae4). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
With ClassifyLoops' loop bisector keeping its B-rep edits, heal.heal_data_p1 (28) and topology.brep_p1 (9) match C++ bit for bit. The 12 topology.brep_p10 cases listed for the same reason still differ: they take the in-place path, so their entries stay with an updated reason and a new findings entry (cause not traced). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
GitHub reports a conflict in plan/findings.md, whose merge=union attribute its own check ignores (AGENTS.md); the local merge keeps both sides' entries. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
bherbruck
approved these changes
Oct 25, 2026
bherbruck
left a comment
Collaborator
There was a problem hiding this comment.
Approved by the automated first-pass review: CI green, mergeable, no CI/build/dependency file changes, no red-flag patterns in added code (process/network/env/unsafe outside FFI/blobs/hidden unicode), 0 known-mismatch entries added. Logic is gated by CI and the difftest merge queue.
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.
Site 2 of the split agreed on #681, coordinated with @brett19 on #717. It takes off the loop-bisector known mismatches that #717 and #718 parked.
What.
SmFace::ClassifyLoops' loop bisector (sms_FindAndClassifyLoopBisector) ranIsSeamon a privateb.clone()and eachCurveOnClassifyon a fresh snapshot. Upstream runs both on the face's own B-rep:IntersectTSBound→ComputeUVPoint(bOKToMakeUVTrimCurve=TRUE) makes the missing UV trims, andSetUVTrimCurveresets the vertex/face gaps. In the port those edits were lost. Now:IsSeamand classifications share oneCurveOnClassifyCachesnapshot, threaded throughclassify_loopsandSetProps_Stage3as crate-private_cachedvariants (CurveOnClassifyCache::snapshotgivesIsSeamthe same snapshot). The publicclassify_loops,set_props_stage3andfind_and_classify_loop_bisector(_into)keep a private cache, so they behave as before.SetProps(set_props_with_query_gaps) runs the seam classifications andClassifyLoopson that one snapshot. It copies the snapshot's UV trims, tolerance growth and gap caches back withapply_uv_trim_updates, asIsInnerShelldoes since fd54ae4.set_props_with_seamtakes the cache instead of a seam closure, so both stages share it.HealData::cache_face_props_stage3takes&mut Brepand uses that in-placeSetProps; its callers already hold the B-rep mutably.Known mismatches. Of the 49 entries listed for this cause:
heal.heal_data_p128 andtopology.brep_p19 now match C++ bit for bit, including port: topology.face_p4 (stacked on #693, merged with main) #718'sfile_plane_circ,file_plane_circ_rebuild_reverseandplane_circ_heal.topology.brep_p10), with an updated reason and a newplan/findings.mdentry. They take the in-place path: instrumented,gen0165andread_Fillet_bottlereachset_props_with_query_gapsStage3 →classify_loops_cached. Their first differences are unchanged except gen0040's. Reading the bisector's UV guess on the snapshot changed none of them, so their cause is something else and I haven't traced it. This includes the three with port: topology.face_p4 (stacked on #693, merged with main) #718'sHasSeamProblemcaveat.Difftest (full sweep, main 92454ca vs this branch): 0 failed on both sides. 37 cases go known mismatch → pass, with no other transitions.
(The remaining deferrals in those units are blocked by other units.)
Checks (VM): fmt; clippy with and without
difftest/cpp;cargo test -p solidcore(2126 passed); wasm;cargo test --profile difftest -p difftest --features cpp; the full sweep.🤖 Generated with Claude Code