Uh oh!
There was an error while loading. Please reload this page.
fix(release): unblock the npm native publish and catch release/CI matrix drift - #2344
Merged
Conversation
ava >= 8 (bumped in #2339) needs Node 22.20+; on Node 20 it dies inside emittery with `results.values(...).filter is not a function`. js.yml was split for this at the time, publish-js.yml was not, so the gap only surfaced after v0.17.0 was tagged: every Node 20 test job failed and the npm release job was skipped. publish-js now mirrors js.yml: Node 22+ runs the ava suites, Node 20 runs the runtime-compat suite against the shipped binding (163 tests). A regression test asserts no publish-js step runs ava without the Node 20 guard.
`publish-js.yml` ran the ava suites on Node 20 after `js.yml` had gated them to Node 22+ for ava 8. Nothing compared the two, so the gap stayed invisible until v0.17.0 was tagged and crates.io, PyPI, and the wasm npm package had already published without the native npm package. `scripts/check_workflow_parity.py` compares each release workflow with its CI counterpart and fails on a runtime version tested only at release time, on a shared suite gated to more versions at release time than in CI, and on `dtolnay/rust-toolchain` pins that disagree between workflows or with `rust-toolchain.toml`. Wired into `just check` and the `scripts/tests` suite CI already runs, with fixture tests for each rule plus a live check of the repository's own workflows.
Deploying with |
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs | bashkit | 9cd0866 | Commit Preview URL Branch Preview URL | Aug 22 2026, 05:35 PM |
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 freeto 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.
What changed
@everruns/bashkit(native npm) can publish again, and the drift that stopped it now fails a check instead of a release.publish-js.ymlno longer runs the ava suites on Node 20. ava 8 requires Node 22.20+; Node 20 keeps exercising the shipped binding through the runtime-compat suite, the same splitjs.ymlalready had.scripts/check_workflow_parity.py(just check-workflow-parity, part ofjust checkand of thescripts/testssuite CI runs on every push) compares every release workflow with its CI counterpart and fails on:dtolnay/rust-toolchainpins that disagree between workflows or withrust-toolchain.toml.Lanes are declared in the script's
LANES(today: Node viajs.yml↔publish-js.yml, Python viapython.yml↔publish-python.yml), so a new publish workflow with a runtime matrix gets covered by adding one entry.Why
v0.17.0 published to crates.io, PyPI, and
@everruns/bashkit-wasm, then stalled:Publish JSfailed its Node 20 test jobs withTypeError: results.values(...).filter is not a functioninside emittery, soRelease to NPMnever ran and the native package stayed at 0.16.0.The ava 8 bump (#2339) added the Node 22+ gate to
js.ymlonly. Nothing compared that gate withpublish-js.yml, and the release path is not exercised before a tag exists, so the gap surfaced after the tag was cut and half the registries had already published. That is the general problem: any release workflow can test a runtime CI does not, and only a release finds out.Before / After
The checker reproduces the exact failure. Reverting just the Node 20 gate:
With the gate in place:
The Node 20 replacement suite passes locally against the built binding:
Full JS suite on the release build is unchanged (569 ava tests pass on Node 22).
Risk
if:conditions only for comparisons against a job's matrix version key; other conditions (runner.os,github.event_name) are ignored, which can make it stricter but never more permissive. A new publish workflow with its own matrix is invisible to it until a lane is added, which the knowledge doc and the script docstring both call out.publish-js.ymlgets dispatched for v0.17.0 so the native npm package catches up with the other registries.Checklist