Skip to content

ci: move the web lane to Node 24 (newest active LTS) - #1045

Closed
engrams-agent[bot] wants to merge 1 commit into
mainfrom
deps/node-24-lts
Closed

engrams-agent[bot] wants to merge 1 commit into
mainfrom
deps/node-24-lts

Conversation

@engrams-agent

@engrams-agent engrams-agent Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Prerequisite for the jsdom 30 bump (#940), and a fix for an end-of-life
runtime in its own right.

Why

Node 20 reached end of life on 2026-04-30. The web (pnpm) lane has been
building and testing the SPA on an unsupported runtime since then.

flake.nix moves too, so nix develop matches CI instead of sitting on 22.

Why 24

Only even Node majors become LTS. From the upstream release schedule:

line LTS start maintenance EOL state on 2026-08-06
20 2023-10-24 2024-10-22 2026-04-30 EOL
22 2024-10-29 2025-10-21 2027-04-30 maintenance LTS
24 2025-10-28 2026-10-20 2028-04-30 active LTS
25 — 2026-04-01 2026-06-01 EOL, never LTS
26 2026-10-28 2027-10-20 2029-04-30 Current, not LTS yet

24 is the newest line in active LTS. 22 is already in maintenance, and 26 is
not LTS until 2026-10-28.

Worth flagging because it comes up in #130: Dependabot proposed
node:25-alpine for the web image there. 25 is a Current-only line that was
already EOL when the PR was opened, and it is also where Node stopped
distributing corepack, which is what breaks that PR's image build. I am
handling that separately on #130 and adding an ignore rule so odd majors stop
being proposed.

What this unblocks

#940 bumps jsdom 29.1.1 → 30.0.1. jsdom 30's only breaking change is a Node
floor raise to ^22.22.2 || ^24.15.0 || >=26.0.0, because it depends on
undici 8, which calls worker_threads.markAsUncloneable — absent on Node 20:

$ node -e "const w=require('node:worker_threads'); console.log(process.version, typeof w.markAsUncloneable)"
v20.20.2 undefined

pnpm does not enforce engines (there is no engine-strict anywhere in the
repo), so the install succeeds and the violation only surfaces at test runtime.
On Node 20 all 52 vitest files die at worker startup:

Caused by: TypeError: webidl.util.markAsUncloneable is not a function
 ❯ new CacheStorage node_modules/.pnpm/undici@8.10.0/node_modules/undici/lib/web/cache/cachestorage.js:20:17
 ❯ Object.<anonymous> node_modules/.pnpm/jsdom@30.0.1/node_modules/jsdom/lib/api.js:12:33
...
 Test Files  no tests
      Tests  no tests
     Errors  52 errors

node-version: 24 resolves the latest 24.x, which satisfies ^24.15.0.

What a reviewer should look at closely

After this merges I will re-trigger CI on #940.

Node 20 reached end of life on 2026-04-30, so the `web (pnpm)` lane has
been building and testing the SPA on an unsupported runtime. Move it to
24, and move `flake.nix` with it so `nix develop` matches CI.

Why 24 and not 25 or 26: only even majors become LTS. 24 entered LTS on
2025-10-28 and stays in active support until 2026-10-20 (EOL 2028-04-30).
25 is a Current-only line that already went EOL on 2026-06-01, and 26 does
not become LTS until 2026-10-28.

This also unblocks #940 (jsdom 29 -> 30). jsdom 30 raised its floor to
`^22.22.2 || ^24.15.0 || >=26.0.0` because it depends on undici 8, which
calls `worker_threads.markAsUncloneable` — a function Node 20 does not
have. On Node 20 every one of the 52 vitest files dies at worker startup
with `TypeError: webidl.util.markAsUncloneable is not a function`, so the
jsdom bump cannot go green until this lands.

`node-version: 24` resolves the latest 24.x, which satisfies jsdom's
`^24.15.0`.
@engrams-agent

engrams-agent Bot commented Aug 6, 2026 •

Copy link
Copy Markdown
Contributor Author

✅ engrams review — complete. 0 findings posted. · View details

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

The latest Buf updates on your PR. Results from workflow CI / buf (pull_request).

BuildFormatLintBreakingUpdated (UTC)
✅ passed⏩ skipped⏩ skipped✅ passedAug 6, 2026, 12:45 PM

@engrams-agent engrams-agent Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Engrams review

Verdict: No findings.
Severity: Critical 0 · High 0 · Medium 0 · Low 0

View the full engrams review

engrams-agent Bot added a commit that referenced this pull request Aug 6, 2026
Dependabot proposed `node:25-alpine`, which fails the image build:

  /bin/sh: corepack: not found
  ERROR: failed to solve: process "/bin/sh -c corepack enable &&
  corepack prepare pnpm@9 --activate" did not complete successfully:
  exit code: 127

Node stopped distributing corepack in v25 (nodejs/node#57617,
nodejs/node#59835), and `web.Dockerfile` used it to install pnpm.

Retargeting to 24 rather than 25 for two reasons beyond the build. Only
even Node majors become LTS: 25 is a Current-only line that reached EOL
on 2026-06-01, so it was already unsupported when the bump was proposed.
24 is the newest active-LTS line (LTS 2025-10-28, maintenance 2026-10-20,
EOL 2028-04-30), and it is what #1045 moves the CI web lane to — so the
image and the lane that typechecks the SPA stay on the same major.

Corepack is dropped rather than reinstated with `npm i -g corepack`.
Node 24 still ships it, so `corepack enable` would work today, but it is
gone from every later line — keeping it just moves this same failure to
the next even LTS. `npm install -g pnpm@9` reaches the same pinned pnpm
directly, and npm is already in the base image.

Also refreshes the dangling `rust:1.95-slim` reference in
coordinator.Dockerfile's glibc comment, which the 1.96 bump left behind.
@nikhilunni
nikhilunni added this pull request to the merge queue Aug 6, 2026
@nikhilunni
nikhilunni removed this pull request from the merge queue due to a manual request Aug 6, 2026
@nikhilunni
nikhilunni added this pull request to the merge queue Aug 6, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Aug 6, 2026
@nikhilunni
nikhilunni enabled auto-merge August 9, 2026 18:01
@engrams-agent

engrams-agent Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Closing this as obsolete — main already carries both pins this PR was opened to move.

pin this PR proposed main today
.github/workflows/ci.yml (setup-node) 20 → 24 node-version: 24 (line 623)
flake.nix nodejs_22 → nodejs_24 nodejs_24 (line 55)
docker/web.Dockerfile deliberately out of scope node:24-alpine (line 12), landed by #130

So the substantive diff here is empty against main; what is left on the branch is a week of unrelated drift.

The dependent also cleared without it: #940 (jsdom 29.1.1 → 30.0.1) merged 2026-08-08, which was the reason this PR existed. The Node floor jsdom 30 needs (^22.22.2 || ^24.15.0 || >=26.0.0) is satisfied by the 24 now on main, so the markAsUncloneable failure mode described in the description cannot recur on the web lane.

No action needed and nothing to salvage. Deleting the deps/node-24-lts branch with the close.

For the record, since this PR is where the Node policy was written down: the next move on this axis is Node 26, and it is not due yet. Per nodejs/Release/schedule.json, 26.x starts Active LTS on 2026-10-28 and 24.x does not enter maintenance until 2026-10-20. #1155 carries that bump and is held to that date on the same even-majors-only rule this PR established.

@engrams-agent engrams-agent Bot closed this Aug 13, 2026
auto-merge was automatically disabled August 13, 2026 11:33

Pull request was closed

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