fix(build): pin NODE_ENV=production in the build script - #768

Merged
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext
Aug 14, 2026
Merged

fix(build): pin NODE_ENV=production in the build script#768
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext

Conversation

@joryirving

@joryirvingjoryirving commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

NODE_ENV=development npm run build fails on main during prerender:

TypeError: Cannot read properties of null (reading 'useContext')
Export encountered an error on /_global-error/page: /_global-error, exiting the build.

next build always emits a production build, but when NODE_ENV=development is inherited from the caller Next resolves React through its development export 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-error and /automation here. The React key warnings 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 build has always passed, which is why repo CI is green.

Pinning NODE_ENV in the script makes the build independent of the ambient value, matching what lint, test and typecheck already do. No-op for repo CI and for the Dockerfile builder stage, both of which already build with NODE_ENV unset.

Verified at 0aa4c84 + this commit:

commandbeforeafter
NODE_ENV=development npm run buildfailpass
npm run buildpasspass
npm run typecheckpasspass
npm run lintpass (1 pre-existing warning)pass
npm run test2272 passed2272 passed

This commit is unsigned. It carries the DCO Signed-off-by trailer, 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:

git fetch origin fix/nextjs-16-prerender-usecontext
git checkout fix/nextjs-16-prerender-usecontext
git commit --amend --no-edit -S
git push --force-with-lease

https://claude.ai/code/session_01YSuDvZq9ncvyX85Uzx3cQh

@joryirving
joryirvingforce-pushed the fix/nextjs-16-prerender-usecontext branch from 1cd352c to 0aa4c84CompareAugust 14, 2026 12:50
`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
@joryirvingjoryirving reopened this Aug 14, 2026

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 plain next build. This makes the script match its documented purpose ("Production build") and the already-established NODE_ENV=development prefixes in lint, test, and typecheck. Since next build already 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 exports NODE_ENV=development.
  • No other files changed; no dependency, schema, or runtime behavior changes.
  • PR classification flagged no risk flags and no must_check items, 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 includes 0aa4c84 (nextjs monorepo 16.3.0 → 16.3.1, PR 767) on origin/main.
  • CI Check Results for 105ae8c: all checks success.
  • Repository grep: existing NODE_ENV=development prefixes in package.json scripts; Dockerfile and .github/workflows invoke npm run build.

Standards Compliance

  • AGENTS.md documents npm run build # Production build; the explicit NODE_ENV=production makes 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 build failure/recovery scenarios shown in the PR body were verified locally by the author and are not independently reproduced in CI evidence.
  • The linked claude.ai analysis 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.

Comment threadpackage.json
"scripts": {
"dev": "next dev",
"build": "next build",
"build": "NODE_ENV=production next build",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@joryirving
joryirving merged commit c03c0b9 into mainAug 14, 2026
7 checks passed
@joryirving
joryirving deleted the fix/nextjs-16-prerender-usecontext branch August 14, 2026 13:02
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(build): pin NODE_ENV=production in the build script - #768

Merged
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext
Aug 14, 2026
Merged

fix(build): pin NODE_ENV=production in the build script#768
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext

Conversation

@joryirving

@joryirvingjoryirving commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

NODE_ENV=development npm run build fails on main during prerender:

TypeError: Cannot read properties of null (reading 'useContext')
Export encountered an error on /_global-error/page: /_global-error, exiting the build.

next build always emits a production build, but when NODE_ENV=development is inherited from the caller Next resolves React through its development export 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-error and /automation here. The React key warnings 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 build has always passed, which is why repo CI is green.

Pinning NODE_ENV in the script makes the build independent of the ambient value, matching what lint, test and typecheck already do. No-op for repo CI and for the Dockerfile builder stage, both of which already build with NODE_ENV unset.

Verified at 0aa4c84 + this commit:

commandbeforeafter
NODE_ENV=development npm run buildfailpass
npm run buildpasspass
npm run typecheckpasspass
npm run lintpass (1 pre-existing warning)pass
npm run test2272 passed2272 passed

This commit is unsigned. It carries the DCO Signed-off-by trailer, 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:

git fetch origin fix/nextjs-16-prerender-usecontext
git checkout fix/nextjs-16-prerender-usecontext
git commit --amend --no-edit -S
git push --force-with-lease

https://claude.ai/code/session_01YSuDvZq9ncvyX85Uzx3cQh

@joryirving
joryirvingforce-pushed the fix/nextjs-16-prerender-usecontext branch from 1cd352c to 0aa4c84CompareAugust 14, 2026 12:50
`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
@joryirvingjoryirving reopened this Aug 14, 2026

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 plain next build. This makes the script match its documented purpose ("Production build") and the already-established NODE_ENV=development prefixes in lint, test, and typecheck. Since next build already 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 exports NODE_ENV=development.
  • No other files changed; no dependency, schema, or runtime behavior changes.
  • PR classification flagged no risk flags and no must_check items, 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 includes 0aa4c84 (nextjs monorepo 16.3.0 → 16.3.1, PR 767) on origin/main.
  • CI Check Results for 105ae8c: all checks success.
  • Repository grep: existing NODE_ENV=development prefixes in package.json scripts; Dockerfile and .github/workflows invoke npm run build.

Standards Compliance

  • AGENTS.md documents npm run build # Production build; the explicit NODE_ENV=production makes 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 build failure/recovery scenarios shown in the PR body were verified locally by the author and are not independently reproduced in CI evidence.
  • The linked claude.ai analysis 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.

Comment threadpackage.json
"scripts": {
"dev": "next dev",
"build": "next build",
"build": "NODE_ENV=production next build",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@joryirving
joryirving merged commit c03c0b9 into mainAug 14, 2026
7 checks passed
@joryirving
joryirving deleted the fix/nextjs-16-prerender-usecontext branch August 14, 2026 13:02
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(build): pin NODE_ENV=production in the build script - #768

Merged
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext
Aug 14, 2026
Merged

fix(build): pin NODE_ENV=production in the build script#768
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext

Conversation

@joryirving

@joryirvingjoryirving commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

NODE_ENV=development npm run build fails on main during prerender:

TypeError: Cannot read properties of null (reading 'useContext')
Export encountered an error on /_global-error/page: /_global-error, exiting the build.

next build always emits a production build, but when NODE_ENV=development is inherited from the caller Next resolves React through its development export 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-error and /automation here. The React key warnings 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 build has always passed, which is why repo CI is green.

Pinning NODE_ENV in the script makes the build independent of the ambient value, matching what lint, test and typecheck already do. No-op for repo CI and for the Dockerfile builder stage, both of which already build with NODE_ENV unset.

Verified at 0aa4c84 + this commit:

commandbeforeafter
NODE_ENV=development npm run buildfailpass
npm run buildpasspass
npm run typecheckpasspass
npm run lintpass (1 pre-existing warning)pass
npm run test2272 passed2272 passed

This commit is unsigned. It carries the DCO Signed-off-by trailer, 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:

git fetch origin fix/nextjs-16-prerender-usecontext
git checkout fix/nextjs-16-prerender-usecontext
git commit --amend --no-edit -S
git push --force-with-lease

https://claude.ai/code/session_01YSuDvZq9ncvyX85Uzx3cQh

@joryirving
joryirvingforce-pushed the fix/nextjs-16-prerender-usecontext branch from 1cd352c to 0aa4c84CompareAugust 14, 2026 12:50
`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
@joryirvingjoryirving reopened this Aug 14, 2026

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 plain next build. This makes the script match its documented purpose ("Production build") and the already-established NODE_ENV=development prefixes in lint, test, and typecheck. Since next build already 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 exports NODE_ENV=development.
  • No other files changed; no dependency, schema, or runtime behavior changes.
  • PR classification flagged no risk flags and no must_check items, 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 includes 0aa4c84 (nextjs monorepo 16.3.0 → 16.3.1, PR 767) on origin/main.
  • CI Check Results for 105ae8c: all checks success.
  • Repository grep: existing NODE_ENV=development prefixes in package.json scripts; Dockerfile and .github/workflows invoke npm run build.

Standards Compliance

  • AGENTS.md documents npm run build # Production build; the explicit NODE_ENV=production makes 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 build failure/recovery scenarios shown in the PR body were verified locally by the author and are not independently reproduced in CI evidence.
  • The linked claude.ai analysis 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.

Comment threadpackage.json
"scripts": {
"dev": "next dev",
"build": "next build",
"build": "NODE_ENV=production next build",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@joryirving
joryirving merged commit c03c0b9 into mainAug 14, 2026
7 checks passed
@joryirving
joryirving deleted the fix/nextjs-16-prerender-usecontext branch August 14, 2026 13:02
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(build): pin NODE_ENV=production in the build script - #768

Merged
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext
Aug 14, 2026
Merged

fix(build): pin NODE_ENV=production in the build script#768
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext

Conversation

@joryirving

@joryirvingjoryirving commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

NODE_ENV=development npm run build fails on main during prerender:

TypeError: Cannot read properties of null (reading 'useContext')
Export encountered an error on /_global-error/page: /_global-error, exiting the build.

next build always emits a production build, but when NODE_ENV=development is inherited from the caller Next resolves React through its development export 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-error and /automation here. The React key warnings 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 build has always passed, which is why repo CI is green.

Pinning NODE_ENV in the script makes the build independent of the ambient value, matching what lint, test and typecheck already do. No-op for repo CI and for the Dockerfile builder stage, both of which already build with NODE_ENV unset.

Verified at 0aa4c84 + this commit:

commandbeforeafter
NODE_ENV=development npm run buildfailpass
npm run buildpasspass
npm run typecheckpasspass
npm run lintpass (1 pre-existing warning)pass
npm run test2272 passed2272 passed

This commit is unsigned. It carries the DCO Signed-off-by trailer, 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:

git fetch origin fix/nextjs-16-prerender-usecontext
git checkout fix/nextjs-16-prerender-usecontext
git commit --amend --no-edit -S
git push --force-with-lease

https://claude.ai/code/session_01YSuDvZq9ncvyX85Uzx3cQh

@joryirving
joryirvingforce-pushed the fix/nextjs-16-prerender-usecontext branch from 1cd352c to 0aa4c84CompareAugust 14, 2026 12:50
`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
@joryirvingjoryirving reopened this Aug 14, 2026

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 plain next build. This makes the script match its documented purpose ("Production build") and the already-established NODE_ENV=development prefixes in lint, test, and typecheck. Since next build already 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 exports NODE_ENV=development.
  • No other files changed; no dependency, schema, or runtime behavior changes.
  • PR classification flagged no risk flags and no must_check items, 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 includes 0aa4c84 (nextjs monorepo 16.3.0 → 16.3.1, PR 767) on origin/main.
  • CI Check Results for 105ae8c: all checks success.
  • Repository grep: existing NODE_ENV=development prefixes in package.json scripts; Dockerfile and .github/workflows invoke npm run build.

Standards Compliance

  • AGENTS.md documents npm run build # Production build; the explicit NODE_ENV=production makes 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 build failure/recovery scenarios shown in the PR body were verified locally by the author and are not independently reproduced in CI evidence.
  • The linked claude.ai analysis 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.

Comment threadpackage.json
"scripts": {
"dev": "next dev",
"build": "next build",
"build": "NODE_ENV=production next build",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@joryirving
joryirving merged commit c03c0b9 into mainAug 14, 2026
7 checks passed
@joryirving
joryirving deleted the fix/nextjs-16-prerender-usecontext branch August 14, 2026 13:02
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(build): pin NODE_ENV=production in the build script - #768

Merged
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext
Aug 14, 2026
Merged

fix(build): pin NODE_ENV=production in the build script#768
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext

Conversation

@joryirving

@joryirvingjoryirving commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

NODE_ENV=development npm run build fails on main during prerender:

TypeError: Cannot read properties of null (reading 'useContext')
Export encountered an error on /_global-error/page: /_global-error, exiting the build.

next build always emits a production build, but when NODE_ENV=development is inherited from the caller Next resolves React through its development export 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-error and /automation here. The React key warnings 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 build has always passed, which is why repo CI is green.

Pinning NODE_ENV in the script makes the build independent of the ambient value, matching what lint, test and typecheck already do. No-op for repo CI and for the Dockerfile builder stage, both of which already build with NODE_ENV unset.

Verified at 0aa4c84 + this commit:

commandbeforeafter
NODE_ENV=development npm run buildfailpass
npm run buildpasspass
npm run typecheckpasspass
npm run lintpass (1 pre-existing warning)pass
npm run test2272 passed2272 passed

This commit is unsigned. It carries the DCO Signed-off-by trailer, 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:

git fetch origin fix/nextjs-16-prerender-usecontext
git checkout fix/nextjs-16-prerender-usecontext
git commit --amend --no-edit -S
git push --force-with-lease

https://claude.ai/code/session_01YSuDvZq9ncvyX85Uzx3cQh

@joryirving
joryirvingforce-pushed the fix/nextjs-16-prerender-usecontext branch from 1cd352c to 0aa4c84CompareAugust 14, 2026 12:50
`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
@joryirvingjoryirving reopened this Aug 14, 2026

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 plain next build. This makes the script match its documented purpose ("Production build") and the already-established NODE_ENV=development prefixes in lint, test, and typecheck. Since next build already 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 exports NODE_ENV=development.
  • No other files changed; no dependency, schema, or runtime behavior changes.
  • PR classification flagged no risk flags and no must_check items, 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 includes 0aa4c84 (nextjs monorepo 16.3.0 → 16.3.1, PR 767) on origin/main.
  • CI Check Results for 105ae8c: all checks success.
  • Repository grep: existing NODE_ENV=development prefixes in package.json scripts; Dockerfile and .github/workflows invoke npm run build.

Standards Compliance

  • AGENTS.md documents npm run build # Production build; the explicit NODE_ENV=production makes 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 build failure/recovery scenarios shown in the PR body were verified locally by the author and are not independently reproduced in CI evidence.
  • The linked claude.ai analysis 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.

Comment threadpackage.json
"scripts": {
"dev": "next dev",
"build": "next build",
"build": "NODE_ENV=production next build",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@joryirving
joryirving merged commit c03c0b9 into mainAug 14, 2026
7 checks passed
@joryirving
joryirving deleted the fix/nextjs-16-prerender-usecontext branch August 14, 2026 13:02
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(build): pin NODE_ENV=production in the build script - #768

Merged
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext
Aug 14, 2026
Merged

fix(build): pin NODE_ENV=production in the build script#768
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext

Conversation

@joryirving

@joryirvingjoryirving commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

NODE_ENV=development npm run build fails on main during prerender:

TypeError: Cannot read properties of null (reading 'useContext')
Export encountered an error on /_global-error/page: /_global-error, exiting the build.

next build always emits a production build, but when NODE_ENV=development is inherited from the caller Next resolves React through its development export 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-error and /automation here. The React key warnings 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 build has always passed, which is why repo CI is green.

Pinning NODE_ENV in the script makes the build independent of the ambient value, matching what lint, test and typecheck already do. No-op for repo CI and for the Dockerfile builder stage, both of which already build with NODE_ENV unset.

Verified at 0aa4c84 + this commit:

commandbeforeafter
NODE_ENV=development npm run buildfailpass
npm run buildpasspass
npm run typecheckpasspass
npm run lintpass (1 pre-existing warning)pass
npm run test2272 passed2272 passed

This commit is unsigned. It carries the DCO Signed-off-by trailer, 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:

git fetch origin fix/nextjs-16-prerender-usecontext
git checkout fix/nextjs-16-prerender-usecontext
git commit --amend --no-edit -S
git push --force-with-lease

https://claude.ai/code/session_01YSuDvZq9ncvyX85Uzx3cQh

@joryirving
joryirvingforce-pushed the fix/nextjs-16-prerender-usecontext branch from 1cd352c to 0aa4c84CompareAugust 14, 2026 12:50
`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
@joryirvingjoryirving reopened this Aug 14, 2026

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 plain next build. This makes the script match its documented purpose ("Production build") and the already-established NODE_ENV=development prefixes in lint, test, and typecheck. Since next build already 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 exports NODE_ENV=development.
  • No other files changed; no dependency, schema, or runtime behavior changes.
  • PR classification flagged no risk flags and no must_check items, 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 includes 0aa4c84 (nextjs monorepo 16.3.0 → 16.3.1, PR 767) on origin/main.
  • CI Check Results for 105ae8c: all checks success.
  • Repository grep: existing NODE_ENV=development prefixes in package.json scripts; Dockerfile and .github/workflows invoke npm run build.

Standards Compliance

  • AGENTS.md documents npm run build # Production build; the explicit NODE_ENV=production makes 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 build failure/recovery scenarios shown in the PR body were verified locally by the author and are not independently reproduced in CI evidence.
  • The linked claude.ai analysis 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.

Comment threadpackage.json
"scripts": {
"dev": "next dev",
"build": "next build",
"build": "NODE_ENV=production next build",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@joryirving
joryirving merged commit c03c0b9 into mainAug 14, 2026
7 checks passed
@joryirving
joryirving deleted the fix/nextjs-16-prerender-usecontext branch August 14, 2026 13:02
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(build): pin NODE_ENV=production in the build script - #768

Merged
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext
Aug 14, 2026
Merged

fix(build): pin NODE_ENV=production in the build script#768
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext

Conversation

@joryirving

@joryirvingjoryirving commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

NODE_ENV=development npm run build fails on main during prerender:

TypeError: Cannot read properties of null (reading 'useContext')
Export encountered an error on /_global-error/page: /_global-error, exiting the build.

next build always emits a production build, but when NODE_ENV=development is inherited from the caller Next resolves React through its development export 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-error and /automation here. The React key warnings 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 build has always passed, which is why repo CI is green.

Pinning NODE_ENV in the script makes the build independent of the ambient value, matching what lint, test and typecheck already do. No-op for repo CI and for the Dockerfile builder stage, both of which already build with NODE_ENV unset.

Verified at 0aa4c84 + this commit:

commandbeforeafter
NODE_ENV=development npm run buildfailpass
npm run buildpasspass
npm run typecheckpasspass
npm run lintpass (1 pre-existing warning)pass
npm run test2272 passed2272 passed

This commit is unsigned. It carries the DCO Signed-off-by trailer, 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:

git fetch origin fix/nextjs-16-prerender-usecontext
git checkout fix/nextjs-16-prerender-usecontext
git commit --amend --no-edit -S
git push --force-with-lease

https://claude.ai/code/session_01YSuDvZq9ncvyX85Uzx3cQh

@joryirving
joryirvingforce-pushed the fix/nextjs-16-prerender-usecontext branch from 1cd352c to 0aa4c84CompareAugust 14, 2026 12:50
`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
@joryirvingjoryirving reopened this Aug 14, 2026

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 plain next build. This makes the script match its documented purpose ("Production build") and the already-established NODE_ENV=development prefixes in lint, test, and typecheck. Since next build already 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 exports NODE_ENV=development.
  • No other files changed; no dependency, schema, or runtime behavior changes.
  • PR classification flagged no risk flags and no must_check items, 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 includes 0aa4c84 (nextjs monorepo 16.3.0 → 16.3.1, PR 767) on origin/main.
  • CI Check Results for 105ae8c: all checks success.
  • Repository grep: existing NODE_ENV=development prefixes in package.json scripts; Dockerfile and .github/workflows invoke npm run build.

Standards Compliance

  • AGENTS.md documents npm run build # Production build; the explicit NODE_ENV=production makes 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 build failure/recovery scenarios shown in the PR body were verified locally by the author and are not independently reproduced in CI evidence.
  • The linked claude.ai analysis 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.

Comment threadpackage.json
"scripts": {
"dev": "next dev",
"build": "next build",
"build": "NODE_ENV=production next build",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@joryirving
joryirving merged commit c03c0b9 into mainAug 14, 2026
7 checks passed
@joryirving
joryirving deleted the fix/nextjs-16-prerender-usecontext branch August 14, 2026 13:02
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(build): pin NODE_ENV=production in the build script - #768

Merged
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext
Aug 14, 2026
Merged

fix(build): pin NODE_ENV=production in the build script#768
joryirving merged 1 commit into
mainfrom
fix/nextjs-16-prerender-usecontext

Conversation

@joryirving

@joryirvingjoryirving commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

NODE_ENV=development npm run build fails on main during prerender:

TypeError: Cannot read properties of null (reading 'useContext')
Export encountered an error on /_global-error/page: /_global-error, exiting the build.

next build always emits a production build, but when NODE_ENV=development is inherited from the caller Next resolves React through its development export 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-error and /automation here. The React key warnings 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 build has always passed, which is why repo CI is green.

Pinning NODE_ENV in the script makes the build independent of the ambient value, matching what lint, test and typecheck already do. No-op for repo CI and for the Dockerfile builder stage, both of which already build with NODE_ENV unset.

Verified at 0aa4c84 + this commit:

commandbeforeafter
NODE_ENV=development npm run buildfailpass
npm run buildpasspass
npm run typecheckpasspass
npm run lintpass (1 pre-existing warning)pass
npm run test2272 passed2272 passed

This commit is unsigned. It carries the DCO Signed-off-by trailer, 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:

git fetch origin fix/nextjs-16-prerender-usecontext
git checkout fix/nextjs-16-prerender-usecontext
git commit --amend --no-edit -S
git push --force-with-lease

https://claude.ai/code/session_01YSuDvZq9ncvyX85Uzx3cQh

@joryirving
joryirvingforce-pushed the fix/nextjs-16-prerender-usecontext branch from 1cd352c to 0aa4c84CompareAugust 14, 2026 12:50
`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
@joryirvingjoryirving reopened this Aug 14, 2026

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 plain next build. This makes the script match its documented purpose ("Production build") and the already-established NODE_ENV=development prefixes in lint, test, and typecheck. Since next build already 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 exports NODE_ENV=development.
  • No other files changed; no dependency, schema, or runtime behavior changes.
  • PR classification flagged no risk flags and no must_check items, 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 includes 0aa4c84 (nextjs monorepo 16.3.0 → 16.3.1, PR 767) on origin/main.
  • CI Check Results for 105ae8c: all checks success.
  • Repository grep: existing NODE_ENV=development prefixes in package.json scripts; Dockerfile and .github/workflows invoke npm run build.

Standards Compliance

  • AGENTS.md documents npm run build # Production build; the explicit NODE_ENV=production makes 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 build failure/recovery scenarios shown in the PR body were verified locally by the author and are not independently reproduced in CI evidence.
  • The linked claude.ai analysis 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.

Comment threadpackage.json
"scripts": {
"dev": "next dev",
"build": "next build",
"build": "NODE_ENV=production next build",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@joryirving
joryirving merged commit c03c0b9 into mainAug 14, 2026
7 checks passed
@joryirving
joryirving deleted the fix/nextjs-16-prerender-usecontext branch August 14, 2026 13:02
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@joryirving