Repository navigation
Stop offering Node majors that are not LTS - #326
Merged
Merged
Conversation
#323 proposed node:24-alpine to node:25-alpine. Node 25 reached end of life on 2026-06-01, four months ago; Node 24 is LTS and supported until 2028-04-30. The tag is newer and the support window is shorter, so the bump was a downgrade wearing an upgrade's title. check-toolchains.sh caught it, as designed - the Dockerfile said 25 while the workflows said 24 - and the pull request could not have been made green honestly. Dependabot can only edit the Dockerfile, so the only way to pass was to adopt 25 everywhere, which is the thing not to do. This had already been decided once. bbcff84 took Node 24 over Dependabot's 26 in #278 because a toolchain that produces released artefacts belongs on a line that is LTS today rather than in four weeks, and #165 merged Current before that and had to be undone. The reasoning existed only in a commit message, which is why the question came back a third time. So: `node` majors are ignored, and digest updates are not, which leaves security patches for the pinned line arriving on their own while the major becomes a deliberate change. CONTRIBUTING.md gains the rule next to the Go version section - the line must be LTS on the day it is adopted, odd-numbered majors never become LTS, and the node release schedule is the authority rather than a guess. docs/workflows/dependabot.md gains the general case, since it documented grouping and overrides and said nothing about what is ignored, so the typescript pin from #93 was undocumented too. The cost is that nothing now raises the next major on its own. #325 carries it with the date: Node 26 becomes LTS on 2026-10-28. Verified: check-toolchains.sh and check-workflows.py pass, and the ignore entry parses as one rule against `node` alone. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Serraniel <mail@serraniel.dev>
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.
#323 is not a failing upgrade. It is a downgrade that the gate caught.
Node 25 has been end of life since June
From the node release schedule, which is
the authority rather than a guess:
So #323 proposes a tag that is numerically newer and has a support window four
months shorter than the one it replaces. Odd-numbered Node majors never become
LTS at all.
scripts/check-toolchains.shfailed it in 12 seconds:That is the gate working. Dependabot can only edit the
Dockerfile, so theonly way to make #323 green was to raise
NODE_VERSIONto 25 everywhere — thatis, to adopt an unsupported runtime deliberately. I have not done that, and
#323 should be closed rather than fixed.
Why the Node major is not a free choice
The release builds the client twice: once on a runner to produce the signed
asset manifest, once inside the
Dockerfileto produce the image. A bundler ontwo different majors emits two different sets of content-hashed filenames.
v0.2.0 shipped exactly that, and
sendan verifyreported the project's ownimage as not serving the published client — because it was not. See #260.
This is the third time
node:26-alpinewhile 26 was Current. It was undone.bbcff84took 24 instead, on the grounds thata toolchain that produces released artefacts belongs on a line that is LTS
today rather than in four weeks.
The rule was right both earlier times. It lived only in a commit message, which
is why the question came back.
The change
nodemajors are ignored in.github/dependabot.yml. Digest updates arenot, so security patches for the pinned line keep arriving by themselves —
only the major becomes a deliberate edit, and
check-toolchains.shalreadyforces all three references to move together.
CONTRIBUTING.mdgains a Node versions section beside the Go one: the linemust be LTS on the day it is adopted, odd majors never qualify, and the schedule
is the authority.
docs/workflows/dependabot.mdgains the general case it was missing. Itdocumented which dependencies are kept out of groups, which are forced into
them, and the overrides — but said nothing about what is ignored, so the
typescriptpin from #93 was undocumented as well.own. That is the trade for not being offered a wrong answer every Monday. #325
carries it with the date — Node 26 becomes LTS on 2026-10-28, seven days from
now, and the issue lists what to verify, including that the content-hashed
filenames match between the two build paths.
Verified
check-toolchains.shandcheck-workflows.pypass, and the ignore entry parsesas a single rule against
nodealone, leavinggolangand the digest updatesuntouched.
🤖 Generated with Claude Code