English 한국어
The private root workspace and 35 Node-bound public packages, including @fluojs/platform-nextjs, declare engines.node: ">=24.0.0 <27". Adopting Node 24 LTS is a lifecycle and support-policy decision, not a claim that a dependency or a new runtime API requires Node 24. Node 20 and Node 22 are not supported by the upcoming major release.
| Runtime | CI verification | Release role |
|---|---|---|
Exact Node 24.0.0 |
Frozen install, sharded full verification, generated starter sandbox matrix | Minimum supported floor, not the release runtime |
Latest Node 24.x |
Frozen install, sharded full verification, pnpm verify:docs, generated starter sandbox matrix |
Canonical development and Changesets release runtime |
Latest Node 26.x |
Frozen install, sharded full verification, generated starter sandbox matrix | Forward verification only; never publish |
| Bun, Deno, Cloudflare Workers | Their existing independent adapter/native-runtime lanes | Runtime-native deployment contracts |
The node-support matrix in .github/workflows/ci.yml calls .github/workflows/node-verification.yml and is required by the aggregate verify gate. A deterministic latest-24 preflight runs frozen install, build, typecheck, lint, platform governance, and the full tooling project before the runtime fan-out. Every Node version then verifies the same full build, typecheck, lint, and test coverage as local pnpm verify. In CI, pnpm build is followed by independent jobs for pnpm typecheck and pnpm lint, sharded tests, and generated starter verification. Package tests use four shards and tooling tests use two shards. The apps and examples projects each run in full once in the first tooling shard job; each test process retains --maxWorkers=1. A small change scope does not skip this full Node verification.
pnpm verify:local records an exact-head local receipt: worktree root, head and
tree identities, merge-base and diff identity, command plan, logs, environment,
and limits. A receipt is invalid when its head, tree, or diff changes, and
--plan never emits a passing receipt. The local command intentionally cannot
prove CI-only runners, GitHub artifact transfer, or aggregate job semantics.
Those dimensions remain CI evidence; failure census reports preserve attempts and
completed failed jobs instead of treating a later rerun as proof that no failure
occurred.
Receipt identity also binds a clean Git status digest at startup, each command
boundary, and finalization. Artifact consumers use exact run/name/SHA/digest
provenance and bounded retries only for observed intermediary 403 and narrow
transient 5xx responses; authentication, ordinary authorization, malformed
metadata, expired artifacts, and digest mismatch fail immediately. The census
queries attempt details and attempt-specific jobs, applies a strict UTC
[since, until) window, and records pagination/completeness limits rather than
silently treating unavailable data as success.
Build artifacts are transferred only within the same workflow run, commit, and Node version. A tar archive preserves package dist directories and the CLI's generated dependency metadata, including executable permissions and symbolic links; it does not bypass public declaration fixtures or package global setup. Generated starter verification runs after the build without waiting for tests to finish. Latest 24.x consolidates the former duplicate PR verification and runs pnpm verify:docs once. The aggregate gate does not treat a required job's failure, cancellation, or skip as success.
Outside Node verification, the web runtime adapter portability suite exercises all Bun, Deno, and Cloudflare Workers cases in one job to avoid repeated project setup. Native response cookie verification also builds the HTTP helper once in one job, then runs the three runtime commands sequentially. A failure in any command still blocks the required Verify gate; Bun native routing/lifecycle and Deno platform verification remain separate jobs.
The focused test:node-floor command remains available for local checks, not as a substitute for full CI verification. It covers manifest classification, all scaffold profiles, config env-file/watch behavior, the published portable runtime import, Node HTTP listeners, adapter portability, and the existing Vite compatibility seam. CI does not substitute a later 24.x patch for the exact 24.0.0 claim.
These eight public roots intentionally omit engines.node: @fluojs/config, @fluojs/email, @fluojs/i18n, @fluojs/platform-bun, @fluojs/platform-cloudflare-workers, @fluojs/platform-deno, @fluojs/react, and @fluojs/runtime. Do not restore engines merely to match neighboring manifests.
Package-wide Node metadata is not a claim about every conditional export or runtime-native adapter. Existing Bun, Deno, and Workers behavior remains governed by each package's README. Config's in-memory root stays portable; env-file/default .env loading and watch mode are Node-only features supported on >=24.0.0 <27. Their existing capability guard still raises CONFIG_RUNTIME_UNAVAILABLE when the host cannot supply the builtin boundary. There is no new Node version check at import or feature invocation.
Generated Node HTTP (Fastify, Express, raw Node), mixed, all seven microservice transports, and React SSR + Fastify starters declare the same engine range, build for node24, and use @types/node@^24.0.0. Bun and Deno engines and native build/start commands remain unchanged. Workers' existing Node engine describes local CLI/Wrangler tooling, not the deployed isolate.
- Before upgrading affected packages, replace Node 20/22 local installations, CI runners, and deployment hosts with latest Node 24 LTS. Use
>=24.0.0 <27for the application'sengines.node; do not use--ignore-enginesas a migration. - Replace container base images such as
node:20-slimwithnode:24-slimin both build and runtime stages. Rebuild the image and reinstall dependencies, including native addons, under the new runtime. - Existing generated Node projects are not rewritten by upgrading the CLI. Update their Vite server build target from
node20tonode24and their Node typings to@types/node@^24.0.0; refresh the lockfile with the project's selected package manager. - Run the application's install, build, typecheck, and tests on Node 24. Check its HTTP listener and microservice startup/shutdown, or the first React page and hydration when applicable. Keep exact
24.0.0and latest26.xchecks if the application advertises this complete range. - For non-Node deployments, retain native engine metadata and deployment commands. Upgrade only Node-hosted developer tooling. Pass explicit in-memory config maps on portable hosts instead of assuming Node env-file/watch support.
For the complete upcoming coordinated-release order (Node, packages, imports, then config/toolchain), follow the consumer migration guide. Every stable public package has explicit major intent, including config's Node-only feature support; React remains a 0.x minor. Only Changesets generates package versions and changelogs, and the maintainer owns actual release and document publication. #3169 remains the umbrella until the user-run release.