You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Drop the CI .node-version rewrite after nubjs/setup-nub#13 #1947
#1946 still rewrites .node-version on latest-channel jobs so nub run uses Node 26. That is only needed because nubjs/setup-nub@v0 fronts PATH and leaves later nub on the committed pin (nubjs/setup-nub#12).
Context
Default jobs already read .node-version (24.21.0). Latest jobs pass node-version: 26 and echo that into the pin file for the job (not committed). nubjs/setup-nub#13 exports NODE_EXECUTABLE so that rewrite can go away.
Plan: drop the CI .node-version rewrite after nubjs/setup-nub#13
Verdict: actionable, but currently blocked — do not implement yet. I verified the dependency is not satisfied:
nubjs/setup-nub#13 is still open (state: OPEN, no merge commit) and Docs search is broken #12 is open too.
nubjs/setup-nub@v0's action.yml still lacks NODE_EXECUTABLE; its Provision Node step still warns "nub runs the project pin at invocation time" and has no from_explicit / NODE_EXECUTABLE block.
So the issue should stay blocked / ready for human until a maintainer confirms #13 has landed in the moving v0 tag. The plan below is ready to execute the moment it does.
Unblock gate (do first)
Confirm #13 merged.
Confirm @v0 carries it: fetch repos/nubjs/setup-nub/contents/action.yml?ref=v0 (raw) and check for NODE_EXECUTABLE and from_explicit=true.
Confirm the merged action still gives node-version precedence over node-version-file (current code: want="$NODE_VERSION"; if [ -z "$want" ] && [ -n "$NODE_VERSION_FILE" ] …). The whole single-step design below relies on it.
Edits
1. .github/actions/setup-nub-ci/action.yml — delete the Override Node pin for this job step and the #12 comment; collapse to one uses: (issue step 1 + 2):
name: Set up Nub (CI)description: > Install Nub and Node from the committed `.node-version` pin. Pass node-version only for a matrix job that must run a different major; setup-nub binds it for later `nub` invocations and the pin file is never rewritten.inputs:
node-version:
description: Optional major override (e.g. 26). Omit to use `.node-version`.required: falsedefault: ""runs:
using: compositesteps:
- name: Set up Nubuses: nubjs/setup-nub@v0with:
shim: truenode-version: ${{ inputs.node-version }}node-version-file: .node-versioncache-key-prefix: ${{ inputs.node-version }}
Passing both inputs is safe: with node-version set, want is non-empty and the file is ignored; with it empty, the file supplies the pin. If the merged action ever rejects both inputs, fall back to two conditional steps that both omit the rewrite (minimal-diff alternative).
2. Cache-key caveat (not in the issue, but a real regression). setup-nub's cache key is nub-<os>-<arch>-<prefix>-<hashFiles(pin files)>-<hashFiles(lockfile)>. Today the latest job's pin rewrite to 26 makes hashFiles(.node-version) differ, so lts/latest get separate caches. Removing the rewrite makes both hash the committed 24.21.0 and the same lockfile — the two channels would collide on one cache key while provisioning different Nodes (one channel always restores a cache missing its Node; nub then lazily downloads, so it's a perf hit, not breakage). cache-key-prefix: ${{ inputs.node-version }} restores the split (nub-linux-x64-26-… vs the unchanged nub-linux-x64--… for lts).
3. .github/workflows/test.yml — update the comment at lines 22–23 (latest overrides to 26) to say latest passesnode-version: 26 (no pin rewrite). No matrix/step change: node-version: ${{ matrix.node-version }} already resolves to empty for lts.
4. AGENTS.md line 33 — the Node caveat should no longer say latest jobs rewrite the pin. Replace the clause with: latest jobs pass node-version: 26, which setup-nub binds for later nub invocations via NODE_EXECUTABLE; the committed pin is never rewritten.
No changeset: this touches only CI + AGENTS.md, not packages/*.
Verification
Run test.yml on v1 (push or workflow_dispatch); require test (lts), test (latest), test-build (lts), test-build (latest) green (these are required checks).
In the test (latest) log, confirm Exporting NODE_EXECUTABLE=…/node/26… appears and there is noOverride Node pin for this job step; confirm nub/nub run uses 26 (e.g. a throwaway nub -e 'console.log(process.version)', or the existing build succeeding).
In the test (lts) log, confirm no NODE_EXECUTABLE export and Node 24.21.0.
Confirm git status in the latest job shows a clean .node-version (no rewrite) and the autofix job (which calls setup-nub-ci with no node-version) cannot commit a rewritten pin.
docs/CONTRIBUTING.md already describes only the committed pin — no edit needed.
Category: enhancement Summary: After nubjs/setup-nub@v0 exports NODE_EXECUTABLE for an explicit node-version, stop rewriting the committed Node pin on latest-channel CI jobs.
Why this is ready for human (not agent yet): Do not implement while nubjs/setup-nub#13 is still open or unreleased. A human confirms #13 is in the moving v0 tag (or a newer tag we pin), then this can move to ready for agent.
Current behavior:
The CI Nub setup action reads .node-version for default jobs. Latest-channel jobs pass a different major (26). Because setup-nub only fronts that Node on PATH and later nub / nub run still follow the project pin (nubjs/setup-nub#12), those jobs write 26 into .node-version for the rest of the job (not committed).
Desired behavior:
Once setup-nub binds later nub invocations via NODE_EXECUTABLE when node-version is set, latest jobs pass node-version: 26 only. The tracked pin file stays 24.21.0 on disk. Default jobs still omit the override and use the file. No job-local rewrite, no dual uses: split that exists only to pair with that rewrite.
Key interfaces:
Composite CI setup action for Nub — optional node-version input remains; it must not mutate pin files
nubjs/setup-nub@v0 (or the tag that contains Sidebar misspells GitHub #13) — explicit node-version / node-version-file must bind PATH and later nub
Maintainer Node caveat in AGENTS.md — should describe reading the pin and passing 26 for latest, not rewriting the file
Acceptance criteria:
Latest-channel jobs still run Node 26 for nub run / nub (not only bare PATHnode)
Those jobs do not write .node-version (working tree pin stays the committed 24.21.0)
Default CI jobs still provision from .node-version with no hardcoded 24 in workflows
Autofix / other commit-the-tree jobs cannot pick up a rewritten pin
Maintainer Node caveat no longer says latest jobs rewrite the pin
Out of scope:
Pinning ArkEnv CI to a fork SHA of setup-nub#13 before it is in @v0
Activity
pullfrog commentedon Sep 21, 2026
Plan: drop the CI
.node-versionrewrite afternubjs/setup-nub#13Verdict: actionable, but currently blocked — do not implement yet. I verified the dependency is not satisfied:
nubjs/setup-nub#13is still open (state: OPEN, no merge commit) and Docs search is broken #12 is open too.nubjs/setup-nub@v0'saction.ymlstill lacksNODE_EXECUTABLE; itsProvision Nodestep still warns "nub runs the project pin at invocation time" and has nofrom_explicit/NODE_EXECUTABLEblock.So the issue should stay
blocked/ready for humanuntil a maintainer confirms #13 has landed in the movingv0tag. The plan below is ready to execute the moment it does.Unblock gate (do first)
#13merged.@v0carries it: fetchrepos/nubjs/setup-nub/contents/action.yml?ref=v0(raw) and check forNODE_EXECUTABLEandfrom_explicit=true.node-versionprecedence overnode-version-file(current code:want="$NODE_VERSION"; if [ -z "$want" ] && [ -n "$NODE_VERSION_FILE" ] …). The whole single-step design below relies on it.Edits
1.
.github/actions/setup-nub-ci/action.yml— delete theOverride Node pin for this jobstep and the#12comment; collapse to oneuses:(issue step 1 + 2):Passing both inputs is safe: with
node-versionset,wantis non-empty and the file is ignored; with it empty, the file supplies the pin. If the merged action ever rejects both inputs, fall back to two conditional steps that both omit the rewrite (minimal-diff alternative).2. Cache-key caveat (not in the issue, but a real regression). setup-nub's cache key is
nub-<os>-<arch>-<prefix>-<hashFiles(pin files)>-<hashFiles(lockfile)>. Today the latest job's pin rewrite to26makeshashFiles(.node-version)differ, so lts/latest get separate caches. Removing the rewrite makes both hash the committed24.21.0and the same lockfile — the two channels would collide on one cache key while provisioning different Nodes (one channel always restores a cache missing its Node; nub then lazily downloads, so it's a perf hit, not breakage).cache-key-prefix: ${{ inputs.node-version }}restores the split (nub-linux-x64-26-…vs the unchangednub-linux-x64--…for lts).3.
.github/workflows/test.yml— update the comment at lines 22–23 (latest overrides to 26) to say latest passesnode-version: 26(no pin rewrite). No matrix/step change:node-version: ${{ matrix.node-version }}already resolves to empty forlts.4.
AGENTS.mdline 33 — the Node caveat should no longer say latest jobs rewrite the pin. Replace the clause with: latest jobs passnode-version: 26, which setup-nub binds for laternubinvocations viaNODE_EXECUTABLE; the committed pin is never rewritten.No changeset: this touches only CI +
AGENTS.md, notpackages/*.Verification
test.ymlonv1(push orworkflow_dispatch); requiretest (lts),test (latest),test-build (lts),test-build (latest)green (these are required checks).test (latest)log, confirmExporting NODE_EXECUTABLE=…/node/26…appears and there is noOverride Node pin for this jobstep; confirmnub/nub runuses 26 (e.g. a throwawaynub -e 'console.log(process.version)', or the existing build succeeding).test (lts)log, confirm noNODE_EXECUTABLEexport and Node24.21.0.git statusin the latest job shows a clean.node-version(no rewrite) and the autofix job (which callssetup-nub-ciwith nonode-version) cannot commit a rewritten pin.docs/CONTRIBUTING.mdalready describes only the committed pin — no edit needed.Acceptance criteria mapping
nub run→NODE_EXECUTABLEfrom Sidebar misspells GitHub #13 + singleuses..node-versionwrite → rewrite step deleted.24→ unchanged (emptynode-version+node-version-file).AGENTS.mdcaveat updated.Out of scope (per issue)
Fork-SHA pinning before #13 is in
@v0, adding rootpackage.json#engines.node, playground/exampleengines, and the committed pin patch itself.Suggested branch when unblocked:
pullfrog/1947-drop-node-version-rewrite, PR basev1.Task list (2/3 completed)
.node-versionrewrite after nubjs/setup-nub#13 #1947DeepSeek Flash(free via Pullfrog for OSS) | 𝕏yamcodes commentedon Sep 21, 2026
Agent Brief
Category: enhancement
Summary: After
nubjs/setup-nub@v0exportsNODE_EXECUTABLEfor an explicitnode-version, stop rewriting the committed Node pin on latest-channel CI jobs.Why this is
ready for human(not agent yet): Do not implement while nubjs/setup-nub#13 is still open or unreleased. A human confirms#13is in the movingv0tag (or a newer tag we pin), then this can move toready for agent.Current behavior:
The CI Nub setup action reads
.node-versionfor default jobs. Latest-channel jobs pass a different major (26). Because setup-nub only fronts that Node onPATHand laternub/nub runstill follow the project pin (nubjs/setup-nub#12), those jobs write26into.node-versionfor the rest of the job (not committed).Desired behavior:
Once setup-nub binds later
nubinvocations viaNODE_EXECUTABLEwhennode-versionis set, latest jobs passnode-version: 26only. The tracked pin file stays24.21.0on disk. Default jobs still omit the override and use the file. No job-local rewrite, no dualuses:split that exists only to pair with that rewrite.Key interfaces:
node-versioninput remains; it must not mutate pin filesnubjs/setup-nub@v0(or the tag that contains Sidebar misspells GitHub #13) — explicitnode-version/node-version-filemust bind PATH and laternubAGENTS.md— should describe reading the pin and passing26for latest, not rewriting the fileAcceptance criteria:
nub run/nub(not only barePATHnode).node-version(working tree pin stays the committed24.21.0).node-versionwith no hardcoded24in workflowsOut of scope:
@v0package.json#engines.nodeenginesrangesMake blocked a triage state exclusive with ready labels (#2065)