Repository navigation
fix(build): pin the node version to 22.23.4 — the floor the lockfile declares - #189
Merged
Merged
Conversation
…declares #187's lockfile carries "engines": {"node": ">=22.23.4"} on @astrojs/mdx 8.1.1 and @astrojs/prism 4.1.1. The repo declared its node as the floating major "22", and actions/setup-node@v7 resolved that through its own version manifest to v22.23.3 — one patch below the floor, although v22.23.4 had been released six days earlier (2026-10-20). The deploy job therefore installed the site's dependencies on a node they declare unsupported, and npm said so twice (EBADENGINE) in the install log; the install still exits 0, so that warning was the only signal. A floating major cannot guarantee a floor: the floor was published ahead of the alias's resolution. Pin the exact version the tree's dependencies require, so CI installs a compliant node deterministically, and the declared toolchain and the declared requirement stop being two files that never compare themselves. Measured on the committed tree, same npm on both sides (10.9.9): node 22.23.3 -> npm ci warns EBADENGINE twice (>=22.23.4 required, v22.23.3 current); node 22.23.4 -> 0 warnings, and the site builds 1699 pages with 0 warning lines. Refs #188 Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
Review — PASSWhat the diff actually is
Correctness
Tests
Security / scope / cleanliness
Comments
Notes (non-blocking)
The change is minimal, honest about what it does and does not prove, and correctly fixes the declared-toolchain/declared-floor mismatch. Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
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.
Summary
Head
8817842593640d38f9e307e98c5fabe910503c6e— 1 file changed, 1 insertion(+), 1 deletion(-).The lockfile this repo now ships declares a node floor of
>=22.23.4, and the repo declared its node as the floating major22— which the CI resolved to v22.23.3, one patch below the floor. The deploy job was therefore installing the site's dependencies on a node they declare unsupported, and npm said so twice, in the install log, while still exiting 0.This change pins the exact version the tree's dependencies require, so the install is clean and the declared toolchain and the declared requirement are the same fact.
.node-version22→22.23.4— the exact node the lockfile'senginesfloors requireWhy this is a defect and not a nicety. A floating major cannot guarantee a floor: the floor was published ahead of the alias's resolution.
v22.23.4was released on 2026-10-20; the merged deploy run of #187 executed on 2026-10-26 andactions/setup-node@v7still resolved22tov22.23.3— six days later — because it resolves through its own version manifest, not through the release feed. The requirement was met by luck, and the luck ran out on the day the floor was published.Why the exact version, and not a newer major. The floor is
>=22.23.4;v22.23.4is the newest22.xand satisfies it exactly. The repo stays on the node major it was already on — the change is the declared version, not the node line.Why there is still exactly one place that declares the node.
.node-versionis where this repo has always declared it, and the deploy workflow reads it withnode-version-file: .node-version.package.jsongains noenginesfield: that would be a second source for the same fact, and the two would drift — the defect this issue is about, in a different file.How tested
The floor, read out of the lockfile — the requirement this change satisfies, and the base's:
The counter-measurement — the defect, reproduced, with the change absent. The same npm on both sides (10.9.9), one patch of node apart, on the tree before this change:
The same two warnings are in the merged run's own install step, on the CI's own node — the same defect, in the org's own log, and the install still exited 0:
The proof — the same tree, on the pinned node. The install is clean, and the site builds:
The artefact that is actually shipped, built by that node:
The version exists, and it is the newest of its line — so the pin is a released version and not a guess:
What was not run here, stated plainly. The Cloudflare Pages deploy is this repo's own CI
deploycheck on this PR — a realwrangler pages deployagainst the real service, in the job that runs on every push, and it is the leg that proves the CI's node is the pinned one. No local Cloudflare credential exists, so no deploy output is claimed here and nothing was mocked. Thecheck-docsbed — adisposable: truepod deploy ofdocs-site-app— clones the docs repo at an immutableDOCS_REFand asserts that pin is the docs repo'smainhead, so it cannot be pointed at an unmerged docs commit: it is the charly-side leg that follows this landing, not a step this change could run.Rulebook compliance
/charly-tools:docs-site(the Astro/Starlight toolchain candy and thecheck-docsbed) and/charly-build:docs(the generation half, whose drift gate this change leaves a no-op). This repo's ownAGENTS.mdwas read first.package.jsongains noenginesfield, so there is no second source to drift.engine-stricttoggle to turn the warning into a different error, no--force, no suppression. The install is clean because the node satisfies the requirement.22is gone, replaced by the exact version the floor names. There is no second place left declaring a node major.git statuswas read before the change; one session worktree, one fresh branch off the landedorigin/main(1c2b7bab6393a0748698bb565408c08c1ba2757e), no force-push, no amend after the push, no rebase, no hook bypass, no direct push tomain.packaging:entry to add.disposable: truebed for this surface (check-docs) pins the docs repo'smainhead and therefore cannot exercise an unmerged docs commit; it is the charly-side leg that follows this landing, as stated under How tested.Change classification
A build-toolchain change, not a documentation one. The diff edits the file the deploy workflow reads to choose the node that installs and builds the site, so the
documentation reviewedtier is forbidden for it.Tier:
fully tested and validated. The change-class gate — the install and the site build on the committed tree — passed with zero warning lines, the counter-measurement is red without the change, and the changed path (the install on the declared node) was executed live with its output retained above. The live Cloudflare deploy is the CI's own check on this PR and is not claimed as local proof.What this change touches, and the issue it closes:
.node-versionCloses #188Filed issues
layer-docs-siterequireslayer-nodejs:v2026.272.0322, and that layer's own recorded measurement of its build image is node 22.22.2. The newest published node layer (v2026.292.2324, 2026-10-19) is one day short ofv22.23.4's release, so a pin bump alone does not reach the floor — the image's node version has to be declared and asserted. That is a change in another repo, with its own build and its own release, and it is filed there with the measurement. It becomes visible to the org when the umbrella advances thedocspin and thecheck-docsbed installs this lockfile in that image.Agent: umbrella-prose-truth
Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)