What I learned. pnpm deploy (v9 here) is a reserved built-in for deploying workspace packages — it never considers the deploy script in your package.json. Every package manager reserves names (npm test, npm start), but this one stings because the error explains workspaces, not that your script was never in the running:
ERR_PNPM_CANNOT_DEPLOY A deploy is only possible from inside a workspace
I hit it mid-launch with a script that ran fine as pnpm run deploy. The failure is loud, but the message sends you reading workspace docs while the actual problem is two reserved letters: run.
The fix that removes the trap instead of dodging it: never own a script named like a built-in. Mine is cf:deploy now — pnpm cf:deploy and pnpm run cf:deploy mean the same thing on every machine, in every doc, at 2 a.m.