From 60dc134c2eb954d75020765be50613b6d0e3cd56 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 2 Oct 2026 08:22:31 +0000 Subject: [PATCH 1/2] chore(deploy): the AI service project deploys only from main (#104) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git.deploymentEnabled { "**": false, "main": true } – PR branches create no requestflow-ai deployment, so they stop counting against the Hobby deployment limits. CI keeps building and smoke-testing the image (#79). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1 --- CHANGELOG.md | 2 ++ docs/technical/deployment-vercel.md | 10 ++++++++-- services/ai/vercel.json | 8 +++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 043f339..317eaff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ This file records what changes **in the product** – process and session state ### Changed - The AI service's Vercel project builds only when something under `services/ai/` changed: fewer images in its container registry and fewer builds. A redeploy after changing its variables must not be skipped (runbook §3.6) (#98). +- The AI service project deploys only from `main`: pull-request branches create no AI deployment at all, so + they no longer use up the Vercel plan's deployment limits (runbook §3.7) (#104). - A unit correction is stored like the extraction stores units: „Stk.“, „Stück“ or „Meter“ become the ERP units `pcs` and `m`; other units stay as typed. The correction field shows „Stk.“, and the audit event keeps what was typed (#96). diff --git a/docs/technical/deployment-vercel.md b/docs/technical/deployment-vercel.md index 17dce06..bc06cb5 100644 --- a/docs/technical/deployment-vercel.md +++ b/docs/technical/deployment-vercel.md @@ -77,8 +77,7 @@ creation). The script is all-or-nothing; running it twice fails on "role already skips the build unless something under `services/ai/` changed since the last successful deployment (`VERCEL_GIT_PREVIOUS_SHA`, else the parent commit; if git cannot compare, it builds). A skipped build ends as `CANCELED`; skipped builds may still count against the plan's deployment limits. A new branch - without a successful AI deployment compares only its last commit, so an AI preview may be missing there - (production is not affected). **A redeploy runs the same step:** after changing a variable of + without a successful AI deployment compares only its last commit (since #104 only `main` deploys, see 7). **A redeploy runs the same step:** after changing a variable of `requestflow-ai` (§9), redeploy without the Ignored Build Step (untick it in the Redeploy dialog if offered) and check that the deployment reaches **Ready** – `CANCELED` means the new value is not active. Every build pushes an image to the project's container registry, which has a maximum number of images on @@ -87,6 +86,13 @@ creation). The script is all-or-nothing; running it twice fails on "role already `vercel vcr image ls dockerfile --project requestflow-ai` and `vercel vcr image rm dockerfile --project requestflow-ai`), keeping the image of the current production deployment and one rollback candidate. Deleting an image is permanent. +7. **Only `main` deploys (#104):** `services/ai/vercel.json` sets `git.deploymentEnabled` to + `{ "**": false, "main": true }` – a push to any other branch (every PR) creates **no** `requestflow-ai` + deployment at all, not even a skipped one, so PRs no longer use up the plan's deployment limits. When + several patterns match, `true` wins; `**` also covers branch names with `/` (minimatch). A merge to `main` + that touches `services/ai/` still deploys production (step 6 decides whether it builds). CI keeps + building and smoke-testing the AI image on every Dockerfile or lock change (#79), so no AI preview is + needed; the web app's previews keep calling the production AI URL. ## 4. Vercel project diff --git a/services/ai/vercel.json b/services/ai/vercel.json index 0f04c79..9047d94 100644 --- a/services/ai/vercel.json +++ b/services/ai/vercel.json @@ -1,5 +1,11 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", "regions": ["fra1"], - "ignoreCommand": "git diff --quiet \"${VERCEL_GIT_PREVIOUS_SHA:-HEAD^}\" HEAD -- ./" + "ignoreCommand": "git diff --quiet \"${VERCEL_GIT_PREVIOUS_SHA:-HEAD^}\" HEAD -- ./", + "git": { + "deploymentEnabled": { + "**": false, + "main": true + } + } } From 1cc5f6878c2dfdea2b326dba167bd1d6dc836606 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 2 Oct 2026 08:23:48 +0000 Subject: [PATCH 2/2] docs(deploy): precise preview and CI statements in runbook step 7 (#106 review) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1 --- docs/technical/deployment-vercel.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/technical/deployment-vercel.md b/docs/technical/deployment-vercel.md index bc06cb5..c72f169 100644 --- a/docs/technical/deployment-vercel.md +++ b/docs/technical/deployment-vercel.md @@ -77,7 +77,8 @@ creation). The script is all-or-nothing; running it twice fails on "role already skips the build unless something under `services/ai/` changed since the last successful deployment (`VERCEL_GIT_PREVIOUS_SHA`, else the parent commit; if git cannot compare, it builds). A skipped build ends as `CANCELED`; skipped builds may still count against the plan's deployment limits. A new branch - without a successful AI deployment compares only its last commit (since #104 only `main` deploys, see 7). **A redeploy runs the same step:** after changing a variable of + without a successful AI deployment compares only its last commit (since #104 only `main` deploys, see + step 7). **A redeploy runs the same step:** after changing a variable of `requestflow-ai` (§9), redeploy without the Ignored Build Step (untick it in the Redeploy dialog if offered) and check that the deployment reaches **Ready** – `CANCELED` means the new value is not active. Every build pushes an image to the project's container registry, which has a maximum number of images on @@ -90,9 +91,11 @@ creation). The script is all-or-nothing; running it twice fails on "role already `{ "**": false, "main": true }` – a push to any other branch (every PR) creates **no** `requestflow-ai` deployment at all, not even a skipped one, so PRs no longer use up the plan's deployment limits. When several patterns match, `true` wins; `**` also covers branch names with `/` (minimatch). A merge to `main` - that touches `services/ai/` still deploys production (step 6 decides whether it builds). CI keeps - building and smoke-testing the AI image on every Dockerfile or lock change (#79), so no AI preview is - needed; the web app's previews keep calling the production AI URL. + that touches `services/ai/` still deploys production (step 6 decides whether it builds). The setting gates + only deployments triggered by a Git push – a redeploy from the dashboard (§9) still works. No AI preview is + needed: CI builds the image and checks `/healthz` on AI-image changes (#79), and web previews do not call + the AI service (§4: Preview variables stay empty). The preview protection of step 2 only matters if Git + deployments of other branches are ever switched back on. ## 4. Vercel project