Skip to content

release: say which Slang binaries a release bundles - #7

Merged
RefuX merged 2 commits into
mainfrom
ci/release-notes-slang-version
Aug 19, 2026
Merged

RefuX merged 2 commits into
mainfrom
ci/release-notes-slang-version

Conversation

@RefuX

@RefuX RefuX commented Aug 19, 2026

Copy link
Copy Markdown
Owner

--generate-notes lists merged PRs, so the one fact anyone wants first from a release — which Slang is inside — read as one more line among them, if it appeared at all. The notes now lead with it.

What a release body looks like now

Rendered by extracting the actual step and running it against the repo with gh removed from PATH:

Bundles the official **Slang `2026.14.1`** binaries, unmodified, and the bindings are
generated against that same release.

| | |
|---|---|
| Slang binaries bundled | `2026.14.1` |
| Bindings generated against | `2026.14.1` |
| Natives classifiers | `linux-aarch64`, `linux-x86_64`, `macos-aarch64`, `macos-x86_64`, `windows-aarch64`, `windows-x86_64` |

`SlangLibrary.PINNED_SLANG_VERSION` is a **minimum**, not a pin: a newer Slang works, an
older one does not. Every jar records what it binds, without being run:

    unzip -p slang-java-0.0.7.jar META-INF/MANIFEST.MF

GitHub's generated notes still follow underneath — --notes prepends rather than replaces.

Derived, not written

Both versions are read at release time: the bundled binaries from natives/build.gradle.kts, the ABI floor from PINNED_SLANG_VERSION. Neither can drift from what actually shipped, which is the failure mode a hand-maintained line in a changelog eventually hits. The classifier list is read from natives/manifests/, so it stays correct if a platform is ever added or dropped, and the step fails loudly rather than publishing blank versions if either read comes back empty.

The two versions are allowed to differ

They are equal after a full regeneration and legitimately diverge after a natives-only bump, because PINNED_SLANG_VERSION is a floor rather than a lockstep. The wording branches on that rather than papering over it — the divergent case reads:

Bundles the official Slang 2026.14.1 binaries, unmodified. The bindings are generated against Slang 2026.13 and run against these newer binaries, which Slang's append-only public ABI guarantees.

Both branches were rendered and checked, the divergent one by temporarily faking a mismatched floor.

Verification

The step was extracted from the YAML and executed against the real repo for both cases, with a gh shim on PATH so nothing could reach GitHub. YAML parses.

🤖 Generated with Claude Code

--generate-notes lists merged PRs, so the single fact anyone wants first -- which Slang is
inside -- read as one more line among them, if it appeared at all. The notes now lead with
it.

Both versions are derived at release time rather than written by hand: the bundled binaries
from natives/build.gradle.kts, the ABI floor from PINNED_SLANG_VERSION. Neither can drift
from what actually shipped, which a hand-maintained changelog line eventually would. The
classifier list is read from natives/manifests/, so it stays right if a platform is ever
added or dropped. Generated notes still follow underneath.

The two versions are equal after a full regeneration and legitimately differ after a
natives-only bump, since PINNED_SLANG_VERSION is a floor rather than a lockstep. The wording
branches on that: equal says so plainly, divergent explains that the bindings run against
newer binaries and why that is safe. Both branches were rendered and checked.

Verified by extracting the step and running it against the real repo with `gh` shimmed off
PATH, for both the equal and the divergent case.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Qodana for JVM

It seems all right 👌

No new problems were found according to the checks applied

💡 Qodana analysis was run in the pull request mode: only the changed files were checked

View the detailed Qodana report

To be able to view the detailed Qodana report, you can either:

To get *.log files or any other Qodana artifacts, run the action with upload-result option set to true,
so that the action will upload the files as the job artifacts:

      - name: 'Qodana Scan'
        uses: JetBrains/qodana-action@v2026.1.3
        with:
          upload-result: true
Contact Qodana team

Contact us at qodana-support@jetbrains.com

release.yml stated the invariant in a comment -- "The tag must match `version` in
gradle.properties" -- and nothing checked it. The tag named the GitHub Release; the Maven
coordinates came from gradle.properties; the two were never compared.

The failure is asymmetric, which is what makes it worth a guard rather than care. Tagging
ABOVE the version is self-limiting: Central rejects a duplicate version at validation,
before anything is released. Tagging BELOW it -- v0.0.7 while gradle.properties already says
0.0.8 -- publishes 0.0.8 permanently, auto-released, with the tag and the artifact
disagreeing forever and no error raised anywhere. On a pipeline with no review gate and no
way to unpublish, that is worth eight lines.

The check runs immediately after Gradle is set up, before the natives are downloaded, the
tests run, or anything is published, so a mis-numbered tag costs seconds rather than a
permanent artifact. Exercised for all three cases: v0.0.7 passes against version=0.0.7,
v0.0.8 fails, and a tag missing its `v` prefix fails.

CLAUDE.md sent the releaser to the wrong file for the version -- `slang/build.gradle.kts`,
which holds none, as its own line 7 says ("group and version come from gradle.properties").
Until now that doc was the only thing standing between a mis-numbered tag and Maven Central.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@RefuX
RefuX merged commit b5e3cce into main Aug 19, 2026
7 checks passed
@RefuX
RefuX deleted the ci/release-notes-slang-version branch October 2, 2026 08:41
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