runProfile() fallback also means the blast radius is wider than Web.It is a profile-lifecycle failure, not a Web-only failure.
Start with the install topology.
pnpm dsh webCheck Git SHA, Node, the repository pin, and the pnpm binary actually used.
npx @deepseek-ai/dsh webCheck the resolved package version and install cache.
pnpm add -gTreat the virtual-store dependency layout as separate evidence.
Follow the capability chain.
Run a four-step source A/B.
- VersionsCompare
packageManager,corepack pnpm, and shellpnpm. - Fresh cloneInstall with the pinned manager in a disposable sibling checkout.
- Helper probeResolve from
vendor/loader, not the repository root. - Flag probeUse direct
node --expose-internals …once; never make it permanent.
One diagnostic command, one boundary.
node --expose-internals --import tsx/esm apps/cli/src/bin.ts web
If this changes the result, the loader-internal discovery chain is implicated. It does not prove the flag is a supported deployment fix.
NODE_OPTIONSThe supported Node line may reject the flag there, and the loader reads process.execArgv.
Keep the repository contract intact while you locate the failed dependency path.
Preserve the failing checkout and compare it with a clean sibling.
Do not classify headless as safe because its shared HMR row is disabled. That absence is the condition that triggers the same watch-only fallback while the root remains active.
Primary evidence.
- Upstream report and investigation #2699
- Pinned engines, pnpm, and source script
- Watch-only HMR mount
- Headless fallback contract
- Internal-loader discovery
Keep the complete startup worksheet.
The canonical guide includes source, npx, global-install routing, exact probes, recovery choices, unsafe workarounds, and a minimal report.
Read and star on GitHub