feat: follow JoltPhysicsC releases, and check the natives against the imports - #3
Merged
Merged
Conversation
… imports The headers and the ten native libraries were arriving by two unrelated routes. Headers were declared with `ref: main` -- a moving target, no recorded SHA, no drift check. Libraries were downloaded from another repository's artifacts and committed by hand; the timing shows it, a build finishing at 12:24 and the commit landing at 12:31. Nothing recorded which revision either came from, and the two could disagree without anything saying so. Both now come from the same JoltPhysicsC release, resolved as `track: stable`. The headers from its tree at that tag, the libraries from the ten archives attached to it. Same revision by construction rather than by whoever remembers. CD moves from binding-simple-cd to binding-tracked-cd. simple-cd publishes unconditionally, which is why it had no cron: a schedule would ship a package every month whether or not the API moved. tracked-cd reads the manifest and publishes only when the generated code changed, so it now runs monthly. CI gains the native coherence check: 1,280 P/Invoke declarations against ten libraries nobody was comparing them to. P/Invoke binds late, so a declaration naming a symbol the library does not export compiles, packs, publishes, and throws on the consumer's first call. It also checks each library's machine field against the architecture its RID promises -- ImGui.Net shipped an osx-x64 dylib that was arm64 for months. Adds the API gate with native-coherence, and auto-merge off. Every other repository earned auto-merge by running its pipeline a few times first, and this one has never published from a working generator: until today the generator wrote into a directory nobody read. Also adds the weekly toolbox-update, and corrects package.runtime-identifier, which still said linux-x64 after generation moved to Windows. The libraries stay committed. The fetch keeps them current and is idempotent when the release has not moved, and a pull request does not fetch -- CI needs them present to check anything at all.
Contributor
API gate: additiveEvery symbol that existed still exists, unchanged. Nothing that compiled before stops compiling.
Enum and constant values are part of the measured surface: a renumbering keeps compiling and sends the wrong number to the driver, so it counts as a removal. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The headers and the ten native libraries were arriving by two unrelated routes, and nothing tied them together.
ref: main— moving, no recorded SHA, no drift checkrelease.currentin the manifestThe hand-carry is visible in the timing: the JoltPhysicsC build finished at 12:24 and the commit "Add runtimes for android-arm…" landed at 12:31. Seven minutes.
Both halves now come from one release, resolved as
track: stable. Same revision by construction, not by whoever remembers.CD: simple → tracked
binding-simple-cdpublishes unconditionally. That is why it had no cron — a schedule would ship a package every month whether or not the API moved.binding-tracked-cdreads the manifest and publishes only when the generated code changed, so it now runs monthly, with aresolvejob in front that puts the version in the summary before anything is committed.No
natives-artifact-pattern: the libraries are not built here. They arrive throughupstream.assets, which is also what satisfies the CD's refusal to commit a bump without them.CI: the check that was missing
1,280 P/Invoke declarations against ten libraries nobody was comparing them to. P/Invoke binds late: a declaration naming a symbol the library does not export compiles, passes CI, packs, publishes, and throws the first time a consumer calls it.
It also reads each library's machine field and checks it against the architecture its RID promises. ImGui.Net shipped an
osx-x64dylib that was arm64 for months and no Intel Mac could load it.The gate, without auto-merge
native-coherence: true, so the merge depends on it rather than watching it go red alongside.auto-merge: falseon purpose. Every other repository in the fleet earned it by running its pipeline a few times first, and this one has never published from a working generator — until today it wrote its output into a directory nobody read. Two clean cycles first.Why the libraries stay committed
The fetch keeps them current and is idempotent when the release has not moved. And a pull request does not fetch, so removing them would leave the coherence check with nothing to check.
Also corrects
package.runtime-identifier, which still saidlinux-x64after generation moved to Windows, and adds the weeklytoolbox-update.🤖 Generated with Claude Code