Skip to content

chore: pin the v3.0.0-rc1 kernel (V8_0_1 + seventeen carried patches) - #936

Merged
gsdali merged 5 commits into
mainfrom
chore/pin-v3.0.0-rc1-kernel
Aug 17, 2026
Merged

chore: pin the v3.0.0-rc1 kernel (V8_0_1 + seventeen carried patches)#936
gsdali merged 5 commits into
mainfrom
chore/pin-v3.0.0-rc1-kernel

Conversation

@gsdali

@gsdali gsdali commented Aug 16, 2026

Copy link
Copy Markdown
Collaborator

What & why

Package.swift pinned the v2.0.0 asset, which carries fifteen patches. Two more had landed in Scripts/patches/ since and were in no built kernel:

patch issue fix
0026 #905 BRepOffsetAPI_ThruSections::MakeSolid no longer marks a loft Closed(true) when it could not cap a non-planar extremity
0027 #913 CreateSmoothed's fixed-stride fill loop no longer overruns shapes when checkCompatibility(false) leaves sections with differing edge counts

Both were therefore exercised by no CI job at all, because build-and-test resolves the asset rather than building from source. That is #585's failure shape, and it is the exact thing CLAUDE.md's ten-second count check exists to catch.

Worth recording how it was found, because it is the failure mode rather than a description of it: the count check was run, found 16 against a prose "fifteen", and while the rebuild was being set up a git pull brought in 0027, taking the tree to 17. The drift happened during the session that was auditing for drift.

Rebuilt V8_0_1 from Libraries/occt-src with all seventeen applied. Three slices, zero errors. Published as v3.0.0-kernel.1.

Verification

Measured against the built artifact, not inferred from a clean build:

  • Eight header-touching patches (0010, 0011, 0012, 0014, 0015, 0016, 0021, 0024): every line each adds to a shipped .hxx matched against the header inside the xcframework. 210 added lines, 0 missing.
  • 0026: .cxx-only, but it adds a distinctive throw message. Present exactly once in each of libOCCT-macos.a, libOCCT-ios.a, libOCCT-sim.a.
  • 0027: .cxx-only and adds no string literal, signalling through myStatus, so nothing in the binary can be grepped for it. Held behaviourally by StressBuilderLifecycleTests.mismatchedSectionEdgeCountWithoutCheckFailsCleanly, which is gated on OCCTSWIFT_LOCAL=1 (PR fix(#913): guard CreateSmoothed's fixed-stride shapes array against a mismatched section edge count #915 review, finding 1). Confirmed from the log that it started and passed rather than being skipped.
  • Full suite, OCCTSWIFT_LOCAL=1: 5614 tests in 1460 suites, all passed, no failures, no crashes. That is what covers the five .cxx-only patches carrying their own regressions (0017, 0019, 0020, 0022, 0025).
  • Published asset re-downloaded and hashed: 77df5a0a… matches the local zip exactly, so the pin resolves rather than 404ing. Package.swift's own sequencing note records that a correct checksum against a 404 fails identically, which is how a kernel.3 asset once passed a checksum check while resolving to nothing.

0018 and 0023 remain verifiable by no test of any kind, unchanged: the bridge stops both defects before OCCT sees them.

One thing this PR changes that is not the number

0027 is the first carried patch that cannot be verified by a green build-and-test, because its only test does not run in CI. Package.swift and CLAUDE.md now both say so explicitly, with the command to re-verify it locally. Previously the guidance was "a green build-and-test is behavioural proof", which is now true of five patches and false of one.

Three-way consistency

The v2.0.0 release check found a total of fifteen sitting above an enumeration of eleven, silently. So all three move together here:

ls Scripts/patches/*.patch | wc -l   →  17
Package.swift enumerated rows        →  17
CLAUDE.md prose                      →  seventeen

CHANGELOG entry

Kernel rebuilt: v3.0.0-kernel.1 carries seventeen patches, up from fifteen

Package.swift now pins the v3.0.0-kernel.1 kernel pre-release (V8_0_1 plus carried patches
0010-0012 and 0014-0027), replacing the v2.0.0 asset's fifteen. The two additions are
0026 (#905, BRepOffsetAPI_ThruSections refuses a loft whose non-planar extremity could not be
capped, instead of marking it Closed(true)) and 0027 (#913, CreateSmoothed refuses mismatched
section edge counts under checkCompatibility(false) instead of overrunning a fixed-stride array).
Both fixes previously existed only in the source tree, so a consumer installing the package received
neither, and neither was exercised by any CI job. No public API change.

Three verification facts are recorded in Package.swift rather than left to be rediscovered.
0027 is the first carried patch a green build-and-test cannot vouch for, because its only test
is OCCTSWIFT_LOCAL-gated and so never runs in CI. The suite total is blind to that: the same run
reports 5614 tests whether the test executes or is skipped, so only the per-test line distinguishes
them. And a kernel pre-release tag pointing at a commit that pins its predecessor is correct, not
a mistake to be fixed, because the alternative ordering is circular.

SemVer impact

NONE for the Swift API. No public entry point is added, removed, renamed, or changed in signature. The shipped kernel binary changes behaviour in two cases that were previously a silent wrong answer and a heap overrun respectively, both of which are the fixes named above.

Follow-up, tracked not forgotten

The v3.0.0-kernel.1 tag points at bc32a84e (main before this commit), so its tree pins the v2.0.0 asset rather than its own. Package.swift's sequencing note asks for the reverse order. I will re-point the tag at this PR's merge commit once it lands; nothing consumes the tag yet, so moving it is safe.

gsdali and others added 4 commits August 17, 2026 04:21
The v2.0.0 asset carried fifteen. Patches 0026 (#905, ThruSections capping
guard) and 0027 (#913, CreateSmoothed section-edge-count guard) had landed in
Scripts/patches/ since and were in no built kernel, so both were exercised by
no CI job at all: #585's failure shape. Rebuilt V8_0_1 from occt-src with all
seventeen applied, three slices, zero errors.

Verified against the built artifact rather than inferred from a clean build:

  - Eight header-touching patches: 210 added lines matched line for line
    against the headers inside the xcframework, 0 missing.
  - 0026: its throw message appears once in each of the three slice archives.
  - 0027: adds no string literal (it signals through myStatus), so it is held
    behaviourally by mismatchedSectionEdgeCountWithoutCheckFailsCleanly, which
    is OCCTSWIFT_LOCAL-gated and therefore DOES NOT RUN IN CI. Confirmed it
    started rather than skipped against this kernel.
  - Full suite, OCCTSWIFT_LOCAL=1: 5614 tests in 1460 suites, all passed.
  - Published asset re-downloaded and hashed: matches the local zip exactly.

Package.swift's enumeration, its verification block and CLAUDE.md's count all
move together, so the total, the list and `ls Scripts/patches/*.patch | wc -l`
agree at seventeen. The v2.0.0 release check found a total of fifteen sitting
above a list of eleven, which is why all three are changed here rather than
just the number everybody reads.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Measured against both kernels rather than asserted. The clean-checkout run
(downloaded v3.0.0-rc1 asset, OCCTSWIFT_LOCAL unset) and the local-kernel run
BOTH report 'Test run with 5614 tests', while 0027's only test reads 'skipped'
in the first and 'started ... passed' in the second.

So neither a green suite nor a matching total distinguishes 0027 being
exercised from 0027 being silently skipped. Only the per-test line does.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…rect

The SEQUENCING paragraph described the RELEASE tag's ordering, and read as
though it governed kernel pre-releases too. Applied to one it is circular: the
URL cannot be pinned before the asset exists, and the release cannot be cut from
a commit that does not exist.

Measured across every kernel pre-release in the repo: each tag points at a
commit pinning the PREVIOUS asset, and only the release tag is self-consistent.
Records that, so the next person does not 'correct' it. I proposed exactly that
correction during this rebuild; the history refuted it.

Also records that v2.0.0 re-uploaded kernel.3's byte-identical zip and swapped
only url:, re-verified by downloading the v2.0.0 asset and hashing it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Follows the established naming. Every prior kernel pre-release is -kernel.N
(v2.0.0-kernel.1/.2/.3), which reads as "kernel-only pre-release"; "rc1" reads
as a release candidate of the package, and the package is not release-ready
(docs/SEMVER.md has no v3.0.0 section, six merges still owe CHANGELOG entries).

Same asset, byte for byte: 149,067,826 bytes,
sha256 77df5a0ae860b0f947353ff6eabf0ab25eb810ef0ce135b56bc60ff1e3e52ef2,
re-downloaded from the new URL and re-hashed before this commit. `checksum:`
is therefore unchanged and only `url:` moves, which is the same shape the
v2.0.0 release commit used when it re-uploaded kernel.3's zip.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gsdali
gsdali force-pushed the chore/pin-v3.0.0-rc1-kernel branch from 949781a to 57c5bca Compare August 16, 2026 23:14
Corrected from the PR body, which still named v3.0.0-rc1 from before the
rename to v3.0.0-kernel.1.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gsdali
gsdali merged commit 284712b into main Aug 17, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant