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
0.3.0 ships now. 1.0.0 waits on the five items below. The picking consolidation (ecosystem#43) was the original gate and it is met, but meeting it is not the same as being ready to freeze a public API.
1. The tag namespace blocks 1.0.0 outright
This repo was built by subtree-merging OCCTSwiftTools, OCCTSwiftAIS and OCCTSwiftCADKit at their original paths, so git blame survives. That also inherited all three repos' tags: 44 in total, of which only v0.1.0, v0.2.0 and v0.3.0 point at the merged package.
The other 41 point at commits where Package.swift is still named OCCTSwiftTools or OCCTSwiftAIS. 26 of them occupy v1.0.0 through v1.6.4.
So v1.0.0 already exists, on a May 2026 OCCTSwiftTools commit, and today a consumer pinning from: "1.0.0" gets:
error: no versions of 'occtswiftinteraction' match the requirement 1.0.0..<2.0.0
It fails loudly rather than silently resolving to the wrong package, which is the better of the two failures, but 1.0.0 cannot be tagged without moving an existing tag.
Deleting the inherited tags is safe, and verified so: all three original repos still hold every one of those tags at identical commits (OCCTSwiftTools v1.6.4 and this repo's v1.6.4 are both d48a7c2), nothing in the fleet pins this package above 0.3.0, and the commits stay reachable from main either way. The alternative is starting the stable line at 2.0.0, above the highest inherited tag, which costs nothing but leaves a releases page where 41 of 45 tags belong to packages that no longer live here.
Note that v0.1.0, v0.2.0 and v0.3.0 were each already force-moved off an inherited tag onto the merged line, so this is an established pattern here rather than a new one.
2. Test
362 tests pass, and the suite is genuine rather than decorative. What it does not cover is the thing most likely to be wrong:
No consumer has been built against a published tag. Every consumer resolves this package through the sibling path locally, which compiles local working state rather than any release (ecosystem#48). A green fleet is therefore not evidence that 0.3.0 works for anyone off-machine. Worth building at least OCCTSwiftUX and OCCTMCP against the URL, in a clean checkout, before freezing.
No multi-body file fixture exists. Both camera-framing regressions had to assert the bounds union directly, because the wiring from a real multibody import through to the framing cannot be exercised without one. That gap is now load-bearing in two repos.
3. Verify the deduplication
The audit behind #12 was a static read of every collision ecosystem#43 enumerated, and it came back clean apart from Axis. It was not a behavioural comparison. Before 1.0.0 it is worth confirming by execution rather than by reading, particularly:
that OCCTSwiftAIS.InteractiveContext.resolve*SubShape and SubShapePickResolver cannot disagree, since the wrappers add mode gating and the whole-body fallback on top;
Scripts/comment-ratio-check.sh is report-only and currently flags 7 files at or above 1.0x comment:code:
File
comment
code
ratio
OCCTSwiftTools/FaceIdentityTable.swift
70
16
4.38
OCCTSwiftAIS/CompatibilityAliases.swift
14
4
3.50
OCCTSwiftTools/ShapeIdentity.swift
122
40
3.05
OCCTSwiftTools/EdgeIdentityTable.swift
38
16
2.38
OCCTSwiftTools/VertexIdentityTable.swift
36
16
2.25
OCCTSwiftTools/SubShapePickResolver.swift
98
56
1.75
OCCTSwiftTools/PointConverter.swift
32
26
1.23
Not all of these are wrong. SubShapePickResolver and ShapeIdentity are where the identity semantics are recorded, and that reasoning is expensive to reconstruct. The three identity tables at 2.2x to 4.4x over 16 lines of code each are the ones to look at: three near-identical files carrying three near-identical explanations is a sign the explanation belongs in one place they all point at.
5. Code style and structure
swift-format lint --strict and swiftlint --strict are both clean, so style in the narrow sense is fine. Structure is not.
CADViewportService.swift is 2,497 lines, 30% of the package's 8,439, and holds loading, entities, selection, picking, clipping, capping, comparison, scalar fields, overlays and camera framing. It is the file every one of this session's changes had to touch, and the file where the camera bug survived a previous fix because the earlier pass could not see the whole of it.
The code-structure policy (the sixth mandatory OKF policy, August 2026) calls for one type per file with scoped remediation, modeled on OCCTSwift#377/#381. This is the repo's largest outstanding violation and the best argument for doing it before 1.0.0 rather than after: splitting a file is source-compatible, and doing it later means doing it against a frozen public surface.
ScalarField.swift carries 5 types and is the only other file over 3.
0.3.0ships now. 1.0.0 waits on the five items below. The picking consolidation (ecosystem#43) was the original gate and it is met, but meeting it is not the same as being ready to freeze a public API.1. The tag namespace blocks 1.0.0 outright
This repo was built by subtree-merging OCCTSwiftTools, OCCTSwiftAIS and OCCTSwiftCADKit at their original paths, so
git blamesurvives. That also inherited all three repos' tags: 44 in total, of which onlyv0.1.0,v0.2.0andv0.3.0point at the merged package.The other 41 point at commits where
Package.swiftis still namedOCCTSwiftToolsorOCCTSwiftAIS. 26 of them occupyv1.0.0throughv1.6.4.So
v1.0.0already exists, on a May 2026 OCCTSwiftTools commit, and today a consumer pinningfrom: "1.0.0"gets:It fails loudly rather than silently resolving to the wrong package, which is the better of the two failures, but 1.0.0 cannot be tagged without moving an existing tag.
Deleting the inherited tags is safe, and verified so: all three original repos still hold every one of those tags at identical commits (
OCCTSwiftTools v1.6.4and this repo'sv1.6.4are bothd48a7c2), nothing in the fleet pins this package above0.3.0, and the commits stay reachable frommaineither way. The alternative is starting the stable line at2.0.0, above the highest inherited tag, which costs nothing but leaves a releases page where 41 of 45 tags belong to packages that no longer live here.Note that
v0.1.0,v0.2.0andv0.3.0were each already force-moved off an inherited tag onto the merged line, so this is an established pattern here rather than a new one.2. Test
362 tests pass, and the suite is genuine rather than decorative. What it does not cover is the thing most likely to be wrong:
0.3.0works for anyone off-machine. Worth building at least OCCTSwiftUX and OCCTMCP against the URL, in a clean checkout, before freezing.3. Verify the deduplication
The audit behind #12 was a static read of every collision ecosystem#43 enumerated, and it came back clean apart from
Axis. It was not a behavioural comparison. Before 1.0.0 it is worth confirming by execution rather than by reading, particularly:OCCTSwiftAIS.InteractiveContext.resolve*SubShapeandSubShapePickResolvercannot disagree, since the wrappers add mode gating and the whole-body fallback on top;InteractiveContexthas no path where the two selections can drift apart, which was the original CADKit adopts AIS selection state instead of running a parallel one #3 defect.4. Comments
Scripts/comment-ratio-check.shis report-only and currently flags 7 files at or above 1.0x comment:code:OCCTSwiftTools/FaceIdentityTable.swiftOCCTSwiftAIS/CompatibilityAliases.swiftOCCTSwiftTools/ShapeIdentity.swiftOCCTSwiftTools/EdgeIdentityTable.swiftOCCTSwiftTools/VertexIdentityTable.swiftOCCTSwiftTools/SubShapePickResolver.swiftOCCTSwiftTools/PointConverter.swiftNot all of these are wrong.
SubShapePickResolverandShapeIdentityare where the identity semantics are recorded, and that reasoning is expensive to reconstruct. The three identity tables at 2.2x to 4.4x over 16 lines of code each are the ones to look at: three near-identical files carrying three near-identical explanations is a sign the explanation belongs in one place they all point at.5. Code style and structure
swift-format lint --strictandswiftlint --strictare both clean, so style in the narrow sense is fine. Structure is not.CADViewportService.swiftis 2,497 lines, 30% of the package's 8,439, and holds loading, entities, selection, picking, clipping, capping, comparison, scalar fields, overlays and camera framing. It is the file every one of this session's changes had to touch, and the file where the camera bug survived a previous fix because the earlier pass could not see the whole of it.The code-structure policy (the sixth mandatory OKF policy, August 2026) calls for one type per file with scoped remediation, modeled on OCCTSwift#377/#381. This is the repo's largest outstanding violation and the best argument for doing it before 1.0.0 rather than after: splitting a file is source-compatible, and doing it later means doing it against a frozen public surface.
ScalarField.swiftcarries 5 types and is the only other file over 3.