Skip to content

Merge-to-main condition: adjudicate all 61 deprecations, and rescan Pass 1a/1b for duplication those passes missed #784

Description

@gsdali

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:

  1. Remove it. The migration has been available long enough. v2.0.0 is the moment.
  2. Keep it deprecated, with a stated reason and the version it will be removed in.
  3. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    cluster:kernelOCCTSwift core geometry/meshing/IO librariesphase:1bPass 1b — C++ bridge header duplication audit (#381)priority:P1Hightype:choreMaintenance / tooling

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions