Uh oh!
There was an error while loading. Please reload this page.
ci: build on Node 22 to match deploy-docs and translations - #118
Merged
Conversation
`ci.yml` pinned `node-version: 20` while `deploy-docs.yml` and `translations.yml` both use 22, so the repository's only required check validated the site on a Node the deploy never uses. Node 20 also reached end-of-life on 2026-04-30. Only the `node-version` line changes. Action versions, `merge_group:` and the job steps are deliberately untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Yaqu7kmKZM3tRPd9Y4xivo
os-elon
marked this pull request as ready for review
August 18, 2026 17:05
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 18, 2026
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.
Fixes#103
What changed
One line in
.github/workflows/ci.yml:ci.ymlis the repository's only required check and it now gates a merge queue. It pinnedthe toolchain Node at 20 while
deploy-docs.ymlandtranslations.ymlboth pin 22, so thegating check validated the site on a Node the deploy never uses — the wrong way round for a
check whose job is to catch what deploy would hit. Node 20 also reached end-of-life on
2026-04-30.
Deliberately untouched in this file: the action versions (
actions/checkout@v7,pnpm/action-setup@v4,actions/setup-node@v4), themerge_group:trigger, and the jobsteps. Nothing here changes what runs, only which Node runs it.
Not folded in: the action-runtime deprecation
CI logs a separate warning that
actions/setup-node@v4andpnpm/action-setup@v4"arebeing forced to run on Node.js 24". That is the Node the action code itself executes on,
chosen by GitHub from the action's major version — a different thing from the
node-version:input, which selects the toolchain Node that runs pnpm, turbo and next. This PR changes only
the second. Bumping the action majors is proposed separately in #58 and #56 and is not
addressed here.
The
enginesquestion, answeredThe card asked whether root
package.json"engines": { "node": ">=20" }should move too,and framed the argument as "track the product this repository documents". I checked, and the
answer is yes — but for a stronger and more local reason than the product floor.
The product floor is real but does not by itself bind this repo:
content/docs/resources/changelog.mdxstates
engines.nodeis>=22.0.0across every published@objectstack/*package since 17.0,and
quickstart.mdxandresources/faq.mdxtell readers Node 22 or newer. This repository,however, depends on no
@objectstack/*package at all — it is a Fumadocs site. So theproduct's floor is a documentation fact here, not a runtime constraint, exactly as the card
suspected.
This repository's own dependency tree is the binding evidence. Three packages already in
pnpm-lock.yamldeclareengines: {node: '>=22.0.0'}:wrangler@4.95.0apps/docsminiflare@4.20260526.0@cloudflare/kv-asset-handler@0.5.0and
next@16.2.6declares>=20.9.0. So">=20"is false twice over on this repo's ownterms: it admits Node 20.0.0 through 20.8.x, which Next 16 rejects, and it admits all of
Node 20, which the wrangler that builds and deploys the site rejects.
Four declarations still say 20 and none of them are in this diff:
package.jsonengines.node>=20apps/docs/package.jsonengines.node>=20.0.0tools/ci-scripts/package.jsonengines.node>=20.0.0.node-version20.node-versionis the one nobody had noticed. It is inert in CI — all three workflows pass anexplicit
node-version:, sosetup-nodenever reads the file — but version managers (fnm,nvm, asdf) do read it, so a contributor following the repo lands on the exact Node its own
pnpm installis about to reject.Why none of that is in this PR. These are one coherent unit and this card's declared file
surface is the
node-versionline. Bumping rootenginesalone leavesapps/docs— thepackage that actually holds wrangler — still declaring
>=20.0.0, which is the half-fix thatreads as done. Bumping
engineswithout.node-versiontells a contributor's version managerto install a Node the install step then refuses. So the alignment is filed as its own issue with
this evidence rather than ridden in here.
tools/ci-scriptsis the one that should arguablystay at
>=20.0.0: it has no dependencies and runs plainnode run-self-tests.mjs, so itsfloor is not false.
Verification
Local union at
13a1da6, on Node v22.22.2 — the version this PR moves CI to:pnpm install --frozen-lockfilepnpm turbo run type-check --continue --forcepnpm turbo run build --forcepnpm turbo run test --forcenode .github/scripts/check-translations.mjscheck-translation-ownership.mjs --actor os-elon --files changed.txtcheck-translation-output.mjs --files changed.txt--forceis load-bearing, not habit. The first cached run replayed@objectos/docs:type-checklogs from/home/user/objectos-issue-107/apps/docs— a siblingagent's worktree, the shared-cache hazard AGENTS.md documents. Every result above is
cache bypass, force executingwith paths in this PR's own tree.A local green is weaker evidence than the real thing regardless, since it exercises Node 22
without exercising this file. The claim this PR actually has to make is that the
buildjobresolves 22 in its own CI run; that is checked on the run this PR triggers, not locally.
Generated by Claude Code
Generated by Claude Code