You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A condition for merging refactor/381-pass1b to main, not a follow-up. Both halves are things
a major release is the only chance to get right.
Part 1: the deprecation surface
Sources/OCCTSwift carries 61 @available(*, deprecated) symbols across 13 files:
File
File
Continuity.swift
9
Curve3D.swift
9
Curve2D.swift
8
Surface.swift
8
BRepGraph.swift
5
Shape+Topology.swift
5
Shape+Modeling.swift
4
Conic2D.swift
3
OSDPath.swift
3
FilletBuilder.swift
2
Shape.swift
2
Shape+ShapeHealing.swift
2
ThreadFeatures.swift
1
Plus the first bridge-side one, OCCTFacesAreAdjacent (PR #779, #783).
Nothing checks any of this. No gate script, no CI step, and no release step. A deprecation is a
promise to remove the thing later, and "later" for a 0.x-to-2.0.0 line is this release. Carrying a
deprecated symbol past the major means carrying it until v3.
Each of the 61 needs one verdict:
Remove it. The migration has been available long enough. v2.0.0 is the moment.
Keep it deprecated, with a stated reason and the version it will be removed in.
Un-deprecate it. The replacement turned out worse, or the deprecation was a mistake. This
happens: fix(#761): AAG's sharedEdgeCount is no longer capped at 10 #779 nearly deprecated OCCTFacesAreAdjacent into a replacement that costs a full walk
of the face pair where the original stopped at the first shared edge.
Verdict 3 deserves real attention rather than being treated as unthinkable. A deprecation asserts a
replacement is better, and several of these assert it about code that has since changed.
Part 2: rescan Pass 1a and 1b for duplication
Both passes are closed (#380, #381, 60 sub-issues). On 2026-08-07 alone, six duplications were
found in code both passes had already audited, every one by accident while doing something else:
Six in one day, in audited code, none found by an audit. That is not a reason to distrust the passes;
it is evidence that duplication found by reading a diff is not the same set as duplication found by
reading a subsystem, and the passes only did the second.
The rescan should be cheap and targeted rather than a re-run:
Start from the six above and ask what shape each shares. The dominant one is two entry points
onto the same OCCT call that drifted, which is exactly Pass 1a's stated subject.
Prefer a derived, committed artifact over a grep, per docs/v2.0.0-plan.md's census-once rule. Scripts/derive-bridge-header-split.py is the pattern.
Bridge first. Five of the six are bridge or bridge-adjacent, and the bridge is where "wrap the same
OCCT class twice" happens.
Why both in one issue
They share a deadline and a reason. Removing a deprecated symbol and unifying a duplicated one are
both breaking changes, and okf/policies/semver-at-release.md puts that judgement at the release.
Doing them separately means assessing SemVer impact twice over overlapping sets.
Definition of done
Every one of the 61 has a recorded verdict, and docs/SEMVER.md reflects the removals.
The rescan artifact is committed and its findings are either fixed or filed.
If a deprecation check is worth automating, it is a gate script with a --self-test; if it is not,
say why rather than leaving the question open.
A condition for merging
refactor/381-pass1btomain, not a follow-up. Both halves are thingsa major release is the only chance to get right.
Part 1: the deprecation surface
Sources/OCCTSwiftcarries 61@available(*, deprecated)symbols across 13 files:Continuity.swiftCurve3D.swiftCurve2D.swiftSurface.swiftBRepGraph.swiftShape+Topology.swiftShape+Modeling.swiftConic2D.swiftOSDPath.swiftFilletBuilder.swiftShape.swiftShape+ShapeHealing.swiftThreadFeatures.swiftPlus the first bridge-side one,
OCCTFacesAreAdjacent(PR #779, #783).Nothing checks any of this. No gate script, no CI step, and no release step. A deprecation is a
promise to remove the thing later, and "later" for a 0.x-to-2.0.0 line is this release. Carrying a
deprecated symbol past the major means carrying it until v3.
Each of the 61 needs one verdict:
happens: fix(#761): AAG's sharedEdgeCount is no longer capped at 10 #779 nearly deprecated
OCCTFacesAreAdjacentinto a replacement that costs a full walkof the face pair where the original stopped at the first shared edge.
Verdict 3 deserves real attention rather than being treated as unthinkable. A deprecation asserts a
replacement is better, and several of these assert it about code that has since changed.
Part 2: rescan Pass 1a and 1b for duplication
Both passes are closed (#380, #381, 60 sub-issues). On 2026-08-07 alone, six duplications were
found in code both passes had already audited, every one by accident while doing something else:
isRadiallyInwardFilletre-implementeddetectHoles()'s inline radial test, down to the1e-9guard (PR fix(#762): a filleted or chamfered pocket junction is absorbed, not reclassified #778).
OCCTFaceGetSharedEdgeCountduplicatedOCCTFaceGetSharedEdges's comparison loop, which is theshape that let the 10-edge cap survive (AAG's hand-rolled face/edge adjacency duplicates BRepGraph's outerWire(of:)/sharedEdges(between:and:) #761).
OCCTDocumentSetShapeColorduplicated its own RGBA sibling, one copy-paste from reintroducing thealpha loss being fixed in the same PR (PR chore(#763): triage Document.mm + IO.mm's 26 unmeasured-value candidates #768).
bug existed: added to one branch in round 2, not mirrored until round 4 (PR chore(#771): teach the census a third sub-kind, a gate flag that never flips #774).
HarnessRunnerduplicatedCensusRunneralmost line for line (PR feat(#772): opt-in self-intersection check for analyze(tolerance:) #773).PocketFeature.isOpen's edge-to-face incidence duplicatesBRepGraph's indexed version, 3-8xslower (PocketFeature.isOpen's enclosure test is 3-8x slower than the indexed BRepGraph equivalent #777).
Six in one day, in audited code, none found by an audit. That is not a reason to distrust the passes;
it is evidence that duplication found by reading a diff is not the same set as duplication found by
reading a subsystem, and the passes only did the second.
The rescan should be cheap and targeted rather than a re-run:
onto the same OCCT call that drifted, which is exactly Pass 1a's stated subject.
docs/v2.0.0-plan.md's census-once rule.Scripts/derive-bridge-header-split.pyis the pattern.OCCT class twice" happens.
Why both in one issue
They share a deadline and a reason. Removing a deprecated symbol and unifying a duplicated one are
both breaking changes, and
okf/policies/semver-at-release.mdputs that judgement at the release.Doing them separately means assessing SemVer impact twice over overlapping sets.
Definition of done
docs/SEMVER.mdreflects the removals.--self-test; if it is not,say why rather than leaving the question open.