Summary
GitHub Actions continues to emit Node.js 20 deprecation warnings on our workflow runs. The warning explicitly names actions that are pinned to SHAs built against the Node 20 runtime:
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02, oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76.
This is separate from (but related to) issue #2015, which tracks the project's own Node runtime baseline. The project runtime is already on Node 24 (.nvmrc = 24, package.json engines >= 24, Dockerfile node:24-slim). The remaining problem is that third-party GitHub Actions are still pinned to versions compiled against Node 20.
Issue #2316 attempted this for milestone 0.10.0 but was closed incomplete — the deprecation warnings are still firing.
Reference: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Root Cause
The ratchet pinning system freezes each action to a specific SHA. Several of those SHAs point to action releases whose action.yml declares node20 as the runtime. GitHub now force-runs them on Node 24 but emits a deprecation warning each time. The fix is to re-pin every action to a release that ships node24 (or node24 wrapper) natively.
Complete Catalog of Actions Needing Upgrade
Explicitly Called Out in the Deprecation Warning
| Action |
Pinned SHA |
Ratchet Tag |
Latest Release |
Affected Workflows |
| actions/upload-artifact |
ea165f8d |
v4 |
v7.0.1 |
ci.yml (3 uses), _evals-run.yml, interactive-ui.yml, luther.yml, nightly.yml (2 uses), ocr-review.yml |
| oven-sh/setup-bun |
735343b6 |
v2 |
v2.2.0 |
ci.yml (7 uses), e2e.yml (2 uses), _evals-run.yml, build-sandbox.yml, interactive-ui.yml, luther.yml, nightly.yml (3 uses), release.yml, smoke-test.yml |
Other Actions Behind Latest (Need Re-pinning via Ratchet)
| Action |
Current Pinned Tag |
Latest Release |
Affected Workflows |
Notes |
| actions/checkout |
v5 (SHA 08c6903c), v5 (SHA 08eba0b2 in e2e), v4 (SHA 11bd7190 in release/pr-triage), v4.3.0 (SHA 08eba0b1 in upstream-sync) |
v7.0.1 |
all workflows |
3+ different SHAs for the same action across workflows — must be unified |
| actions/download-artifact |
v5 (SHA 634f93cb) in ci/evals, v4 (SHA d3f86a10) in ocr-review |
v8.0.1 |
ci.yml, evals-nightly.yml, ocr-review.yml |
Version inconsistency between workflows |
| actions/setup-node |
v6 (SHA 48b55a0) |
v7.0.0 |
17 uses across all workflows |
|
| actions/cache |
v4 (SHA 0057852b) |
v6.1.0 |
ci.yml (3 uses) |
|
| actions/setup-python |
v5 (SHA a26af69) |
v7.0.0 |
ci.yml |
|
| actions/create-github-app-token |
v2.0.6 (SHA df432cee) |
v3.2.0 |
luther.yml (commented out) |
|
| github/codeql-action |
v3.29.9 (SHA df559355) |
codeql-bundle-v2.26.1 (v3 line) |
ci.yml (init + analyze) |
|
| docker/setup-buildx-action |
v3 (SHA e468171) |
v4.2.0 |
build-sandbox.yml, e2e.yml |
|
| docker/login-action |
v3.3.0 (SHA 9780b0c) |
v4.4.0 |
build-sandbox.yml |
|
| docker/metadata-action |
v5.5.1 (SHA 8e5442c) |
v6.2.0 |
build-sandbox.yml |
|
| docker/build-push-action |
v6.9.0 (SHA 4f58ea7) |
v7.3.0 |
build-sandbox.yml |
|
| dorny/test-reporter |
v2.1.1 (SHA dc3a926) |
v3.0.0 |
ci.yml |
Major version bump — verify breaking changes |
| fkirc/skip-duplicate-actions |
v5.3.1 (SHA f75f66c) |
v5.3.2 |
ci.yml, e2e.yml |
Minor patch |
| sethvargo/ratchet |
v0.11.4 (SHA 8b4ca25) |
v0.12.0 |
ci.yml |
Used by the pinning system itself |
| actions/github-script |
SHA f28e40c (v9.x) |
v9.0.0 |
(check usage) |
Verify if already current |
Already Current
| Action |
Pinned |
Latest |
Status |
| thollander/actions-comment-pull-request |
v3.0.1 |
v3.0.1 |
OK |
Additional Inconsistencies Found
-
actions/checkout has 4 different pinned SHAs across workflows:
08c6903c (v5) — most workflows
08eba0b2 (v5, different commit!) — e2e.yml
11bd7190 (v4) — release.yml, llxprt-scheduled-pr-triage.yml
08eba0b1 (v4.3.0, invalid SHA?) — upstream-sync.yml
-
actions/download-artifact has 2 different major versions (v4 and v5) across workflows.
-
Some workflows lack ratchet comments entirely:
smoke-test.yml — no ratchet comment on checkout
release.yml — uses bare # v4 not ratchet format
upstream-sync.yml — uses # v4.3.0 not ratchet format
llxprt-scheduled-pr-triage.yml — uses bare # v4 not ratchet format
Proposed Work
-
Run ratchet to re-pin all actions to their latest Node-24-native releases:
ratchet pin .github/workflows/*.yml .github/actions/**/*.yml
- This will update all SHAs to the latest tag for each ratcheted action
- For actions without ratchet comments, add them first
-
Fix the checkout version inconsistencies — unify all workflows to the same SHA/tag.
-
Fix the download-artifact version split — upgrade ocr-review.yml from v4 to match the rest.
-
Add ratchet comments to workflows missing them (smoke-test.yml, release.yml, upstream-sync.yml, llxprt-scheduled-pr-triage.yml).
-
Verify major-version upgrade breaking changes:
actions/upload-artifact v4 to v7 (v5 changed artifact IDs, v6/v7 may have further changes)
actions/download-artifact v4/v5 to v8
dorny/test-reporter v2 to v3
docker/* v3/v5/v6 to v4/v6/v7
-
Test all workflows after re-pinning to confirm:
- No Node 20 deprecation warnings
- All CI jobs still pass (test, lint, typecheck, format, build)
- E2E tests pass
- Nightly/smoke/release workflows function correctly
Acceptance Criteria
Context
Summary
GitHub Actions continues to emit Node.js 20 deprecation warnings on our workflow runs. The warning explicitly names actions that are pinned to SHAs built against the Node 20 runtime:
This is separate from (but related to) issue #2015, which tracks the project's own Node runtime baseline. The project runtime is already on Node 24 (.nvmrc = 24, package.json engines >= 24, Dockerfile node:24-slim). The remaining problem is that third-party GitHub Actions are still pinned to versions compiled against Node 20.
Issue #2316 attempted this for milestone 0.10.0 but was closed incomplete — the deprecation warnings are still firing.
Reference: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Root Cause
The
ratchetpinning system freezes each action to a specific SHA. Several of those SHAs point to action releases whoseaction.ymldeclaresnode20as the runtime. GitHub now force-runs them on Node 24 but emits a deprecation warning each time. The fix is to re-pin every action to a release that shipsnode24(ornode24wrapper) natively.Complete Catalog of Actions Needing Upgrade
Explicitly Called Out in the Deprecation Warning
ea165f8d735343b6Other Actions Behind Latest (Need Re-pinning via Ratchet)
08c6903c), v5 (SHA08eba0b2in e2e), v4 (SHA11bd7190in release/pr-triage), v4.3.0 (SHA08eba0b1in upstream-sync)634f93cb) in ci/evals, v4 (SHAd3f86a10) in ocr-review48b55a0)0057852b)a26af69)df432cee)df559355)e468171)9780b0c)8e5442c)4f58ea7)dc3a926)f75f66c)8b4ca25)f28e40c(v9.x)Already Current
Additional Inconsistencies Found
actions/checkout has 4 different pinned SHAs across workflows:
08c6903c(v5) — most workflows08eba0b2(v5, different commit!) — e2e.yml11bd7190(v4) — release.yml, llxprt-scheduled-pr-triage.yml08eba0b1(v4.3.0, invalid SHA?) — upstream-sync.ymlactions/download-artifact has 2 different major versions (v4 and v5) across workflows.
Some workflows lack ratchet comments entirely:
smoke-test.yml— no ratchet comment on checkoutrelease.yml— uses bare# v4not ratchet formatupstream-sync.yml— uses# v4.3.0not ratchet formatllxprt-scheduled-pr-triage.yml— uses bare# v4not ratchet formatProposed Work
Run ratchet to re-pin all actions to their latest Node-24-native releases:
ratchet pin .github/workflows/*.yml .github/actions/**/*.ymlFix the checkout version inconsistencies — unify all workflows to the same SHA/tag.
Fix the download-artifact version split — upgrade ocr-review.yml from v4 to match the rest.
Add ratchet comments to workflows missing them (smoke-test.yml, release.yml, upstream-sync.yml, llxprt-scheduled-pr-triage.yml).
Verify major-version upgrade breaking changes:
actions/upload-artifactv4 to v7 (v5 changed artifact IDs, v6/v7 may have further changes)actions/download-artifactv4/v5 to v8dorny/test-reporterv2 to v3docker/*v3/v5/v6 to v4/v6/v7Test all workflows after re-pinning to confirm:
Acceptance Criteria
Context