action.yml declares using: 'node20', but GitHub is already ignoring that and running the action on Node 24 — in production, today. Every workflow run in the 2026-07-15 harness carries:
##[warning]Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: ./action, actions/checkout@v4, actions/setup-node@v4
This reframes PLAN 5.8. It is not "Node 20 reached EOL, we should migrate sometime" — we are already getting the Node 24 runtime without having declared, tested, or built for it. The declared runtime and the actual runtime have diverged, and the divergence is invisible unless you read a warning in the log.
Scope
PLAN 5.8 and PLAN 1.4 are coupled: both force a dist-action/ rebuild, so they should land together as one release.
Risk
The @actions/* majors are the real work — v1→v3 and v6→v9 are several majors each, and the action uses core.getInput/setOutput/setFailed/info/error plus github.context and getOctokit throughout. Worth reading their changelogs rather than assuming a drop-in.
Everything else is a one-line change per site.
Verification
src/index.ts is at 0% coverage (PLAN 5.2), so the test suite will not catch an @actions/* API break — it would surface as a runtime failure in a real sync. The e2e harness (tool-test-action-on-github/) is the check that would: 26 scenarios × 2 languages against real GitHub. Pin its templates to the candidate build first (they now carry an explicit ref: after #86).
Refs: PLAN 5.8, PLAN 1.4, REVIEW-FABLE5-2026-07-15.md §5
action.ymldeclaresusing: 'node20', but GitHub is already ignoring that and running the action on Node 24 — in production, today. Every workflow run in the 2026-07-15 harness carries:This reframes PLAN 5.8. It is not "Node 20 reached EOL, we should migrate sometime" — we are already getting the Node 24 runtime without having declared, tested, or built for it. The declared runtime and the actual runtime have diverged, and the divergence is invisible unless you read a warning in the log.
Scope
PLAN 5.8 and PLAN 1.4 are coupled: both force a
dist-action/rebuild, so they should land together as one release.action.yml:93—using: 'node20'→'node24'.github/workflows/ci.yml:25—node-version: 20→24build-action.mjs:23— esbuildtarget: 'node20'→'node24'@types/node—^20→^24package.jsonengines.node—>=20→>=24(added in High-severity fixes from the 2026-07-15 deep review #83)CONTRIBUTING.md— Node 20 prerequisite@actions/core1.11.1 → 3.x and@actions/github6.0.1 → 9.x — the reason to do this now: these are the last open prod advisories.npm audit --omit=devreports 1 high / 2 moderate, allundicireaching us through these two, and all of it inlined into the committeddist-action/index.js.npm audit fixcannot clear them without the majors.dist-action/, confirm the freshness gate passes@anthropic-ai/sdk0.78 → 0.111 in the same release (also bundle-affecting; re-runtranslator-retry.test.ts)Risk
The
@actions/*majors are the real work — v1→v3 and v6→v9 are several majors each, and the action usescore.getInput/setOutput/setFailed/info/errorplusgithub.contextandgetOctokitthroughout. Worth reading their changelogs rather than assuming a drop-in.Everything else is a one-line change per site.
Verification
src/index.tsis at 0% coverage (PLAN 5.2), so the test suite will not catch an@actions/*API break — it would surface as a runtime failure in a real sync. The e2e harness (tool-test-action-on-github/) is the check that would: 26 scenarios × 2 languages against real GitHub. Pin its templates to the candidate build first (they now carry an explicitref:after #86).Refs: PLAN 5.8, PLAN 1.4, REVIEW-FABLE5-2026-07-15.md §5