Skip to content

1.0.0 readiness: tag namespace, consumer testing, dedup verification, comments, structure #13

Description

@gsdali

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;
  • that CADKit's façade over InteractiveContext has 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.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.

2497  OCCTSwiftCADKit/CADViewportService.swift
 648  OCCTSwiftTools/CADFileLoader.swift
 581  OCCTSwiftAIS/InteractiveContext.swift
 543  OCCTSwiftAIS/ManipulatorWidget.swift

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions