fix(build): pin NODE_ENV=production in the build script - #768
Conversation
1cd352c to
0aa4c84
Compare
`next build` always emits a production build, but Next resolves React through the "development" export condition when NODE_ENV=development is inherited from the caller. The prerender worker then loads a second React copy, and rendering fails with "Cannot read properties of null (reading 'useContext')" on /_global-error and /automation. Pinning NODE_ENV in the script makes the build independent of the ambient value, matching the existing lint/test/typecheck scripts. Signed-off-by: Jory Irving <jory.irving@users.noreply.github.com> Claude-Session: https://claude.ai/code/session_01YSuDvZq9ncvyX85Uzx3cQh
There was a problem hiding this comment.
AI Automated Review
Full PR review.
Analysis engine: dsv4f@https://litellm.jory.dev/v1 (openai) — primary route
Recommendation
Approve. The change pins NODE_ENV=production in the build script so next build no longer inherits an ambient NODE_ENV=development that breaks Next.js 16 prerendering via dual React copies. It is one line, matches the repository's existing inline-NODE_ENV script convention, and all CI checks (Lint, Build, Tests, Typecheck, Docker Build, npm audit) pass on the head commit.
Change-by-Change Findings
package.json(build script):"build": "NODE_ENV=production next build"replaces plainnext build. This makes the script match its documented purpose ("Production build") and the already-establishedNODE_ENV=developmentprefixes inlint,test, andtypecheck. Sincenext buildalready defaults to production mode, the change is a no-op for CI and the Dockerfile build path when the ambient env is unset, and only corrects the case where the caller exportsNODE_ENV=development.- No other files changed; no dependency, schema, or runtime behavior changes.
- PR classification flagged no risk flags and no
must_checkitems, so there are no mandatory checklist entries beyond the diff itself.
Sources
- PR PR 768 metadata and diff (1 file changed, +1/-1).
- Repository history: head commit
105ae8c; base includes0aa4c84(nextjs monorepo 16.3.0 → 16.3.1, PR 767) onorigin/main. - CI Check Results for
105ae8c: all checks success. - Repository grep: existing
NODE_ENV=developmentprefixes inpackage.jsonscripts;Dockerfileand.github/workflowsinvokenpm run build.
Standards Compliance
- AGENTS.md documents
npm run build # Production build; the explicitNODE_ENV=productionmakes the script conform to that description. - The change follows the repository's existing convention of prefixing scripts with inline
NODE_ENV(lint,test,typecheck), so no AGENTS.md Code Standards are violated. - No secrets, database migrations, API routes, or validation paths are touched.
Tool Harness Findings
The tool harness reported only "planning pending" and produced no actionable findings to incorporate into this review.
Unknowns / Needs Verification
- CI's Build and Docker Build checks exercise the default env path; the specific
NODE_ENV=development npm run buildfailure/recovery scenarios shown in the PR body were verified locally by the author and are not independently reproduced in CI evidence. - The linked
claude.aianalysis session was skipped (host not allowlisted), so that source could not be independently inspected. - The tool harness did not emit concrete findings, leaving the dynamic analysis portion of verification unperformed.
| "scripts": { | ||
| "dev": "next dev", | ||
| "build": "next build", | ||
| "build": "NODE_ENV=production next build", |
There was a problem hiding this comment.
Info: The inline NODE_ENV=production prefix is not portable to Windows cmd/PowerShell, but this matches the repository's existing NODE_ENV=development prefix convention in the lint/test/typecheck scripts.
Automated finding from AI PR review.
NODE_ENV=development npm run buildfails onmainduring prerender:next buildalways emits a production build, but whenNODE_ENV=developmentis inherited from the caller Next resolves React through itsdevelopmentexport condition while the compiled server bundle keeps the production one. The prerender worker ends up with two React copies, so the hook dispatcher is null on any route that renders a context —/_global-errorand/automationhere. The Reactkeywarnings on<html>/<head>/<meta>are the same mismatch, not a separate problem. Next itself warns about this:You are using a non-standard "NODE_ENV" value in your environment.Not a regression from #767 — 16.3.0 fails identically. Plain
npm run buildhas always passed, which is why repo CI is green.Pinning
NODE_ENVin the script makes the build independent of the ambient value, matching whatlint,testandtypecheckalready do. No-op for repo CI and for the Dockerfile builder stage, both of which already build withNODE_ENVunset.Verified at 0aa4c84 + this commit:
NODE_ENV=development npm run buildnpm run buildnpm run typechecknpm run lintnpm run testThis commit is unsigned. It carries the DCO
Signed-off-bytrailer, but the local 1Password SSH signing agent was unreachable and GitHub's contents API did not apply web-flow signing either. To re-sign before merge:https://claude.ai/code/session_01YSuDvZq9ncvyX85Uzx3cQh