From 66cb985b46888f0cefce892b9c7c688a70b777fe Mon Sep 17 00:00:00 2001 From: qnbs <155236708+qnbs@users.noreply.github.com> Date: Wed, 29 Jul 2026 22:11:40 +0200 Subject: [PATCH 1/3] chore: pause Vercel auto-deploy mid-term after 2 undiagnosed build failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two consecutive Vercel preview deployments failed (different deployment IDs, different commits) with only a generic "Deployment has failed" message. The exact same commits build cleanly via `pnpm run build` locally, and neither the GitHub Checks API nor `npx vercel inspect --logs` (requires an interactive account login not available here) surfaced any further detail — this looks platform-side, not a code regression. Vercel is not a required branch-protection check, so this was purely about stopping a noisy, undiagnosable failure status rather than unblocking anything. Disabled via vercel.json's documented `git.deploymentEnabled: false` (the standard, reversible, dashboard- free way to pause git-triggered deployments). GitHub Pages — already documented as the always-on fallback mirror — is promoted to primary in README.md/CLAUDE.md for the duration. TODO.md tracks re-enabling once someone with Vercel dashboard/CLI access diagnoses the cause. Co-Authored-By: Claude Sonnet 5 --- CLAUDE.md | 2 +- README.md | 6 +++--- TODO.md | 16 ++++++++++++++++ vercel.json | 3 +++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index d8ee4dfd..70b4ea5e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -70,7 +70,7 @@ Conventional Commits format: `feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `ch WorldScript Studio is an offline-first PWA — a React 19 SPA with Google Gemini AI, IndexedDB persistence, and optional Tauri desktop packaging. No backend; API keys are entered in the UI and encrypted at rest via one of four platform-specific mechanisms (no single blanket guarantee) — see README § [Encryption — which mechanism protects what](README.md#-encryption--which-mechanism-protects-what). -**Live:** `https://worldscript-studio.vercel.app/` (Vercel, primary) · GitHub Pages: `https://qnbs.github.io/WorldScript-Studio/` · Cloudflare Pages: `wrangler.toml` · Vercel: `vercel.json`. +**Live:** GitHub Pages (primary): `https://qnbs.github.io/WorldScript-Studio/` · Vercel: `https://worldscript-studio.vercel.app/` (auto-deploys **paused mid-term** via `vercel.json`'s `git.deploymentEnabled: false` — undiagnosed platform-side build failures, see `TODO.md`) · Cloudflare Pages: `wrangler.toml`. ### Directory map diff --git a/README.md b/README.md index 0e0d34b9..12afe6ab 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,10 @@ Two always-on hosted builds — open whichever you prefer (identical app, both a | | Host | Link | |---|---|---| -| 🟢 | **GitHub Pages** _(always-on mirror — auto-deployed from `main` on every green build)_ | **🚀 🚀** | -| ▲ | **Vercel** _(primary)_ | | +| 🟢 | **GitHub Pages** _(primary — auto-deployed from `main` on every green build)_ | **🚀 🚀** | +| ▲ | **Vercel** _(paused mid-term, see `vercel.json`'s `git.deploymentEnabled: false`)_ | | -> **Tip:** If the Vercel build is ever rate-limited, the **[GitHub Pages mirror](https://qnbs.github.io/WorldScript-Studio/)** is always live and current. +> **Tip:** Vercel auto-deploys are paused mid-term (undiagnosed build failures on the platform side — see `TODO.md`); the **[GitHub Pages mirror](https://qnbs.github.io/WorldScript-Studio/)** is the current always-on target and stays live and current regardless. ✨ _Try it right now — no installation, no account required. All data is saved securely in your browser's IndexedDB._ ✨ diff --git a/TODO.md b/TODO.md index 16856070..f4290ba0 100644 --- a/TODO.md +++ b/TODO.md @@ -8,6 +8,22 @@ Status: 🔄 in progress | ⬜ open | ✅ done --- +## Infra — Vercel deployments paused mid-term (2026-07-29) + +- ⬜ **Re-enable Vercel auto-deploy** — `vercel.json`'s `git.deploymentEnabled` set to `false` + after 2 consecutive Vercel preview-deployment failures (different deployment IDs, different + commits, both with only a generic "Deployment has failed" message — `npx vercel inspect + --logs` requires an interactive Vercel account login not available in this session, and the + GitHub Checks API surfaces no further detail). The exact same commits build cleanly with + `pnpm run build` locally, so this looks Vercel-platform-side rather than a code regression. + Vercel is **not** a required branch-protection check, so this doesn't block any PR merge — it was + paused purely to stop the noisy, undiagnosable failure status. GitHub Pages is the primary + always-on mirror in the meantime (README.md/CLAUDE.md updated). **Re-enable** by flipping + `deploymentEnabled` back to `true` (or removing the `git` block) once someone with Vercel + dashboard/CLI access diagnoses the root cause. + +--- + ## v1.24.2 — CSP/crypto/doc-truth hardening (2026-07-29) > **Status: Merged (PR #284) and released as `v1.24.2` on 2026-07-29.** Full record: diff --git a/vercel.json b/vercel.json index d0752a89..e3892929 100644 --- a/vercel.json +++ b/vercel.json @@ -1,5 +1,8 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", + "git": { + "deploymentEnabled": false + }, "installCommand": "pnpm install", "buildCommand": "NODE_OPTIONS=--max-old-space-size=3072 pnpm run build:edge", "outputDirectory": "dist", From 92c69d5107d0e7589112768f6905e6319700d6b8 Mon Sep 17 00:00:00 2001 From: qnbs <155236708+qnbs@users.noreply.github.com> Date: Wed, 29 Jul 2026 22:35:04 +0200 Subject: [PATCH 2/3] =?UTF-8?q?revert:=20re-enable=20Vercel=20auto-deploy?= =?UTF-8?q?=20=E2=80=94=20root=20cause=20found=20and=20fixed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root-caused the 2 Vercel build failures that prompted the mid-term pause: not a platform issue, but a real missing-export bug (services/ai/localEmbeddingService.ts imported ensureInferencePool() from workerBusManager.ts, which never actually defined it — invisible to Vitest because the consumer test mocks the whole module). The fix landed in the worker-generation-consolidation PR chain (PR #288). Reverts git.deploymentEnabled to the default (enabled) now that the actual cause is fixed and verified via a clean local `build:edge` reproduction of Vercel's exact build command. TODO.md's entry updated from "paused, cause unknown" to a resolved write-up, including the `pnpm run build` vs `pnpm run build:edge` command-mismatch lesson that delayed finding this. Co-Authored-By: Claude Sonnet 5 --- TODO.md | 41 ++++++++++++++++++++++++++++------------- vercel.json | 3 --- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/TODO.md b/TODO.md index f4290ba0..ddb255e9 100644 --- a/TODO.md +++ b/TODO.md @@ -8,19 +8,34 @@ Status: 🔄 in progress | ⬜ open | ✅ done --- -## Infra — Vercel deployments paused mid-term (2026-07-29) - -- ⬜ **Re-enable Vercel auto-deploy** — `vercel.json`'s `git.deploymentEnabled` set to `false` - after 2 consecutive Vercel preview-deployment failures (different deployment IDs, different - commits, both with only a generic "Deployment has failed" message — `npx vercel inspect - --logs` requires an interactive Vercel account login not available in this session, and the - GitHub Checks API surfaces no further detail). The exact same commits build cleanly with - `pnpm run build` locally, so this looks Vercel-platform-side rather than a code regression. - Vercel is **not** a required branch-protection check, so this doesn't block any PR merge — it was - paused purely to stop the noisy, undiagnosable failure status. GitHub Pages is the primary - always-on mirror in the meantime (README.md/CLAUDE.md updated). **Re-enable** by flipping - `deploymentEnabled` back to `true` (or removing the `git` block) once someone with Vercel - dashboard/CLI access diagnoses the root cause. +## Infra — Vercel deployment failures root-caused + fixed (2026-07-29) + +> **Status: Resolved same-day.** Briefly paused via `vercel.json`'s `git.deploymentEnabled: false` +> after 2 consecutive preview-deployment failures with only a generic "Deployment has failed" +> message and no further detail from the GitHub Checks API. `npx vercel inspect --logs` needs an +> interactive account login unavailable in-session, so the actual fix came from noticing Vercel's +> `buildCommand` runs `pnpm run build:edge` (`node scripts/build-edge.mjs` → `vite build` with +> `DEPLOY_TARGET=edge`) — a **different command** than the plain `pnpm run build` used for the +> earlier (misleading) local repro attempt, which succeeded and pointed away from a code cause. +> Reproducing the *exact* Vercel command locally +> (`NODE_OPTIONS=--max-old-space-size=3072 pnpm run build:edge`) immediately surfaced the real +> error: `[MISSING_EXPORT] "ensureInferencePool" is not exported by "services/workerBusManager.ts"` +> — `services/ai/localEmbeddingService.ts` (part of the in-flight worker-generation-consolidation +> migration, PR #288) imported and called a function that was never actually added to +> `workerBusManager.ts`. Vitest never caught it because `localEmbeddingService.test.ts` mocks the +> *entire* `workerBusManager` module (`vi.mock(...)` wholesale replacement), so the real file's +> missing export was invisible to that suite; `tsgo`'s local typecheck also passed clean for +> reasons not fully understood (worth a follow-up look at cache behavior) — only rolldown's +> stricter static bundling in the real production build caught it. Fixed by adding the missing +> `ensureInferencePool()` (mirrors `ensureDuckDbPool()`'s shape) plus a `workerBusManager.test.ts` +> suite that imports the *real* module instead of mocking it — that suite would have caught this +> immediately. `git.deploymentEnabled` reverted to enabled; verified fixed via a clean local +> `build:edge` re-run before re-enabling. +> +> **Lesson for future Vercel-build debugging in this repo:** always reproduce with the *exact* +> `vercel.json` `buildCommand`, not `pnpm run build` — they differ (`build:edge` sets +> `DEPLOY_TARGET=edge` and runs `scripts/sync-deploy-base.mjs` first) and a plain `build` passing +> does not prove the deploy build would. --- diff --git a/vercel.json b/vercel.json index e3892929..d0752a89 100644 --- a/vercel.json +++ b/vercel.json @@ -1,8 +1,5 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", - "git": { - "deploymentEnabled": false - }, "installCommand": "pnpm install", "buildCommand": "NODE_OPTIONS=--max-old-space-size=3072 pnpm run build:edge", "outputDirectory": "dist", From d190d5c2104f2dd8611ff5e78427d6badc2e251d Mon Sep 17 00:00:00 2001 From: qnbs <155236708+qnbs@users.noreply.github.com> Date: Wed, 29 Jul 2026 22:36:19 +0200 Subject: [PATCH 3/3] fix: correct README.md/CLAUDE.md revert (was reverted to own branch HEAD, not main) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous commit's `git checkout -- README.md CLAUDE.md` restored from this branch's own HEAD (which still had the "paused" wording from the first commit), not from main — so the pause note survived uncommitted. Re-applied via `git checkout main -- ...` this time. Co-Authored-By: Claude Sonnet 5 --- CLAUDE.md | 2 +- README.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 70b4ea5e..d8ee4dfd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -70,7 +70,7 @@ Conventional Commits format: `feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `ch WorldScript Studio is an offline-first PWA — a React 19 SPA with Google Gemini AI, IndexedDB persistence, and optional Tauri desktop packaging. No backend; API keys are entered in the UI and encrypted at rest via one of four platform-specific mechanisms (no single blanket guarantee) — see README § [Encryption — which mechanism protects what](README.md#-encryption--which-mechanism-protects-what). -**Live:** GitHub Pages (primary): `https://qnbs.github.io/WorldScript-Studio/` · Vercel: `https://worldscript-studio.vercel.app/` (auto-deploys **paused mid-term** via `vercel.json`'s `git.deploymentEnabled: false` — undiagnosed platform-side build failures, see `TODO.md`) · Cloudflare Pages: `wrangler.toml`. +**Live:** `https://worldscript-studio.vercel.app/` (Vercel, primary) · GitHub Pages: `https://qnbs.github.io/WorldScript-Studio/` · Cloudflare Pages: `wrangler.toml` · Vercel: `vercel.json`. ### Directory map diff --git a/README.md b/README.md index 12afe6ab..0e0d34b9 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,10 @@ Two always-on hosted builds — open whichever you prefer (identical app, both a | | Host | Link | |---|---|---| -| 🟢 | **GitHub Pages** _(primary — auto-deployed from `main` on every green build)_ | **🚀 🚀** | -| ▲ | **Vercel** _(paused mid-term, see `vercel.json`'s `git.deploymentEnabled: false`)_ | | +| 🟢 | **GitHub Pages** _(always-on mirror — auto-deployed from `main` on every green build)_ | **🚀 🚀** | +| ▲ | **Vercel** _(primary)_ | | -> **Tip:** Vercel auto-deploys are paused mid-term (undiagnosed build failures on the platform side — see `TODO.md`); the **[GitHub Pages mirror](https://qnbs.github.io/WorldScript-Studio/)** is the current always-on target and stays live and current regardless. +> **Tip:** If the Vercel build is ever rate-limited, the **[GitHub Pages mirror](https://qnbs.github.io/WorldScript-Studio/)** is always live and current. ✨ _Try it right now — no installation, no account required. All data is saved securely in your browser's IndexedDB._ ✨