Skip to content

Retire Node 18, and take the patched test runner - #240

Merged
patchstackdave merged 1 commit into
mainfrom
chore/retire-node-18
Sep 9, 2026
Merged

patchstackdave merged 1 commit into
mainfrom
chore/retire-node-18

Conversation

@patchstackdave

@patchstackdave patchstackdave commented Sep 9, 2026 •

Copy link
Copy Markdown
Contributor

Two runtime contracts answer different questions and are tested separately.

Consumer support

The engines.node range moves from >=18 to >=20. This is the supported consumer floor: Node 18 is no longer tested, and package managers may warn or refuse installation there according to their engine policy. The artifact may still execute on Node 18, but that runtime is outside this package's supported range.

The floor is exercised as a consumer sees it:

  • Pack the artifact builds the tarball on the release runtime from .node-version.
  • Consumers on the declared Node floor reads the exact lowest version from engines.node, installs only that tarball with engine-strict, and runs six explicitly named package/runtime probes.
  • The six probes cover ESM and CommonJS imports, screening through both published module formats, the installed CLI, and export-map encapsulation.
  • The floor suite refuses to run if one of those probes is missing or acquires a fixture dependency. It cannot silently narrow to a smaller green suite.
  • The ordinary consumer matrix continues to run all nine shapes on Node 22 across the supported package managers.

Only a plain >= floor is accepted by the version reader. A range it cannot map to one exact minimum is refused instead of guessed.

Maintainer toolchain

The maintainer toolchain requires ^20.19.0 || >=22.12.0. This is a union rather than one floor: Node 21 and Node 22.0 through 22.11 are outside it. Validation therefore pins exact 20.19.0 and 22.12.0 beside the current Node 20, 22, 24, and 26 lines, with strict engine checks enabled.

Vitest moves to 4.1.11, the first patched release for GHSA-82fw-gwwq-j7x9. The build target follows the consumer floor at node20. Runtime comments now describe the availability of web crypto rather than tying the fallback to one Node release, since edge runtimes expose different globals.

Release constraint

This change must ship as 0.5.0 using a minor release. RELEASING.md records the durable rule: while the package is 0.x, a compatibility break needs at least a minor release; from 1.0 onward it needs a major release.

Verified locally on this head

  • exact Node 20.0.0 with npm 9.6.4: all 6 declared-floor consumer shapes pass against the packed artifact
  • npm test: 170 files, 2,685 passed, 7 skipped
  • npm run typecheck: clean; 8 templates checked
  • npm run build: clean
  • npm run verify:edge: no Node builtins in the edge bundle
  • capability and rule-contract artifacts: up to date
  • one signed commit based on current main

@coderbuds

coderbuds Bot commented Sep 9, 2026 •

Copy link
Copy Markdown

CI workflow and scripts clearly enforce the updated Node 20 floor with robust consumer testing.

🎯 Quality: 90% Elite · 📦 Size: Extra Large — strongly consider breaking this down

🛡️ Standards: no pre-flight fit check ran for this change — wire assess-change-fit into your coding agents to catch size before opening.

📈 This month: Your 209th PR — above team average · Averaging Good

See how your team is trending →

@patchstackdave

Copy link
Copy Markdown
Contributor Author

/review

@patchstackdave
patchstackdave force-pushed the chore/retire-node-18 branch 5 times, most recently from 8db81f5 to 52a802d Compare September 9, 2026 09:41
The package engines field is a consumer support contract. The package now declares Node 20 or newer, validates the packed artifact at the exact floor read from engines.node, and no longer claims or tests Node 18. The artifact may still execute on 18, but installation there is outside the supported range.

The declared-floor job installs no repository development dependencies. It consumes a tarball built on the release runtime and runs an explicit six-shape package/runtime contract: ESM and CommonJS imports, screening through both published module formats, the installed CLI, and export-map encapsulation. The selector refuses a missing shape or one that acquires a fixture dependency, so the floor check cannot silently narrow. The ordinary Node 22 consumer matrix continues to run all nine shapes.

The maintainer toolchain is a separate contract: Vitest 4.1.11 and its Vite/Rolldown dependencies require ^20.19.0 or >=22.12.0. Validate pins both exact boundaries beside the current supported lines and installs with engine-strict. The test-runner update takes the patched release for GHSA-82fw-gwwq-j7x9.

The build target follows the consumer floor at node20. Runtime comments refer to the availability of web crypto rather than to a particular Node release, because the fallback remains relevant to edge runtimes.

Releasing this compatibility change requires 0.5.0. RELEASING states that a compatibility break is at least a minor while the package is 0.x and a major from 1.0 onward.
@patchstackdave
patchstackdave merged commit 1ee709d into main Sep 9, 2026
18 checks passed
@patchstackdave
patchstackdave deleted the chore/retire-node-18 branch September 9, 2026 10:23
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.

2 participants