chore(ops-agent): baseline krijgt de Vercel-deploy als slotstap #130

Merged
janpeter merged 1 commit from chore/ops-agent-baseline-vercel-step into main 2026-08-02 10:27:03 +02:00
Owner

Part B Task 6. vercel_deploy_scrum4us + assert_checkout_clean_scrum4us zijn live toegevoegd als de laatste twee stappen van redeploy_scrum4us, achter elke API-gate. Baseline bijgewerkt in dezelfde sessie; runtime drift-baseline mee-gesynct, drift-check no drift / exit 0.

Bewijs uit één echte run

# check uitkomst
V1 dry-run volgorde PASS — 22 stappen, gate_dogfood → vercel_deploy → assert_checkout_clean
V2 drie-weg-match PASS — checkout = origin/main = deployment-sha = 0d1b3774a839
V3 werkboom schoon na de run FAILM package-lock.json; oorzaak gevonden en apart gefixt, zie onder
V4 flow-tijd 1m56s — niet representatief: docker-builds waren cache-hits omdat de laatste commits alleen docs/sops raakten
V5 serving PASSwww.scrum4us.nl, www.scrum4us.com, scrum4us.vercel.app serveren de app
V6 baselines deze PR + runtime; drift no drift

V3: de assert deed zijn werk, maar niet om de verwachte reden

Niet een CLI die buiten de gitignore schrijft, maar vercel build dat npm install draait en daarmee package-lock.json herschrijft — een getrackt bestand, dus gitignore is geen optie. 53 libc-blokken plus een devOptionaldev flip; npm-normalisatie, geen dependency-drift.

Blokkerend: run N faalt op de assert, run N+1 aborteert al op git_pull (git_status_clean). Opgelost in Scrum4Us met apps/web/vercel.jsoninstallCommand: npm ci, wat de lockfile per definitie nooit schrijft. Empirisch bevestigd in een aparte clone: lockfile-sha256 fbe82eafa2a47758 vóór én na de build.

Twee afwijkingen van de beschrijving, bewust

  1. Token niet via --token. Dat zet hem in argv en daarmee in /proc/<pid>/cmdline, leesbaar voor elke lokale gebruiker. De CLI leest de drie variabelen uit de omgeving — geverifieerd met vercel whoami als ops-agent.
  2. cmd: [sh, -c, "<vaste string>"] in plaats van drie losse aanroepen: whitelist.js eist een array zonder shell, en dit is de vorm die 21 andere keys al hanteren. Vaste string, geen externe input.

Voorwaarde die niet klopte

/srv/scrum4us/env/vercel.env had VERCEL_PROJECT_ID = <waarde> met spaties rond de =. Docker weigerde het hele bestand; bij shell-sourcing bleven beide variabelen stil leeg. Hersteld vóór deze stap (waarden bewijsbaar ongewijzigd), en het sops-artefact meegecorrigeerd.

Part B Task 6. `vercel_deploy_scrum4us` + `assert_checkout_clean_scrum4us` zijn live toegevoegd als de laatste twee stappen van `redeploy_scrum4us`, achter elke API-gate. Baseline bijgewerkt in dezelfde sessie; runtime drift-baseline mee-gesynct, drift-check `no drift` / exit 0. ## Bewijs uit één echte run | # | check | uitkomst | |---|---|---| | V1 | dry-run volgorde | **PASS** — 22 stappen, `gate_dogfood → vercel_deploy → assert_checkout_clean` | | V2 | drie-weg-match | **PASS** — checkout = `origin/main` = deployment-sha = `0d1b3774a839` | | V3 | werkboom schoon na de run | **FAIL** — `M package-lock.json`; oorzaak gevonden en apart gefixt, zie onder | | V4 | flow-tijd | 1m56s — **niet representatief**: docker-builds waren cache-hits omdat de laatste commits alleen docs/sops raakten | | V5 | serving | **PASS** — `www.scrum4us.nl`, `www.scrum4us.com`, `scrum4us.vercel.app` serveren de app | | V6 | baselines | deze PR + runtime; drift `no drift` | ## V3: de assert deed zijn werk, maar niet om de verwachte reden Niet een CLI die buiten de gitignore schrijft, maar `vercel build` dat `npm install` draait en daarmee **`package-lock.json` herschrijft** — een getrackt bestand, dus gitignore is geen optie. 53 `libc`-blokken plus een `devOptional`→`dev` flip; npm-normalisatie, geen dependency-drift. Blokkerend: run N faalt op de assert, run N+1 aborteert al op `git_pull` (`git_status_clean`). Opgelost in Scrum4Us met `apps/web/vercel.json` → `installCommand: npm ci`, wat de lockfile per definitie nooit schrijft. Empirisch bevestigd in een aparte clone: lockfile-sha256 `fbe82eafa2a47758` vóór én na de build. ## Twee afwijkingen van de beschrijving, bewust 1. **Token niet via `--token`.** Dat zet hem in `argv` en daarmee in `/proc/<pid>/cmdline`, leesbaar voor elke lokale gebruiker. De CLI leest de drie variabelen uit de omgeving — geverifieerd met `vercel whoami` als `ops-agent`. 2. **`cmd: [sh, -c, "<vaste string>"]`** in plaats van drie losse aanroepen: `whitelist.js` eist een array zonder shell, en dit is de vorm die 21 andere keys al hanteren. Vaste string, geen externe input. ## Voorwaarde die niet klopte `/srv/scrum4us/env/vercel.env` had `VERCEL_PROJECT_ID = <waarde>` met spaties rond de `=`. Docker weigerde het hele bestand; bij shell-sourcing bleven beide variabelen stil **leeg**. Hersteld vóór deze stap (waarden bewijsbaar ongewijzigd), en het sops-artefact meegecorrigeerd.
chore(ops-agent): baseline krijgt de Vercel-deploy als slotstap
Some checks failed
CI / Root app checks (pull_request) Failing after 4m19s
CI / Ops-agent checks (pull_request) Successful in 14s
CI / Deploy artifact checks (pull_request) Successful in 12s
CI / Docker image build (pull_request) Successful in 1m25s
197b883ecc
vercel_deploy_scrum4us + assert_checkout_clean_scrum4us zijn live toegevoegd als
laatste twee stappen van redeploy_scrum4us, achter elke API-gate. Baseline in
dezelfde sessie bijgewerkt; runtime drift-baseline mee-gesynct
(.bak.vercelstep-20260802-101257).

Twee afwijkingen van de aangeleverde beschrijving, beide bewust:

1. Token NIET via --token. Dat zet hem in argv en daarmee in /proc/<pid>/cmdline,
   leesbaar voor elke lokale gebruiker. De Vercel CLI leest VERCEL_TOKEN,
   VERCEL_ORG_ID en VERCEL_PROJECT_ID uit de omgeving; geverifieerd met
   `vercel whoami` als ops-agent.
2. De drie npx-aanroepen konden niet als losse cmd-array (whitelist eist een
   array zonder shell). Gebruikt is cmd: [sh, -c, "<vaste string>"], de vorm die
   21 andere keys in dit bestand al hanteren, met vaste string zonder externe input.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
s4m-codex-reviewer left a comment

APPROVED

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

  • Geen blokkerende of error-severity findings gevonden.

Review-notities

  • deploy/ops-agent/baseline/commands.yml:857 voegt de Vercel deploy toe als expliciet gewhitelist ops-agent command, passend bij het gedocumenteerde exec-only command/flow-model.
  • deploy/ops-agent/baseline/commands.yml:876 gebruikt VERCEL_TOKEN via environment in plaats van argv; dat voorkomt token-lek via procesargumenten.
  • deploy/ops-agent/baseline/commands.yml:890 voegt een checkout-clean guard toe na de build/deploy-stap, wat drift in de baseline-flow detecteerbaar maakt.
  • deploy/ops-agent/baseline/flows/redeploy_scrum4us.yml:125 plaatst de Vercel deploy na de bestaande API-gates en abort bij falen, consistent met de beoogde API-voor-UI volgorde.
# APPROVED Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - Geen blokkerende of error-severity findings gevonden. ## Review-notities - `deploy/ops-agent/baseline/commands.yml:857` voegt de Vercel deploy toe als expliciet gewhitelist ops-agent command, passend bij het gedocumenteerde exec-only command/flow-model. - `deploy/ops-agent/baseline/commands.yml:876` gebruikt `VERCEL_TOKEN` via environment in plaats van argv; dat voorkomt token-lek via procesargumenten. - `deploy/ops-agent/baseline/commands.yml:890` voegt een checkout-clean guard toe na de build/deploy-stap, wat drift in de baseline-flow detecteerbaar maakt. - `deploy/ops-agent/baseline/flows/redeploy_scrum4us.yml:125` plaatst de Vercel deploy na de bestaande API-gates en abort bij falen, consistent met de beoogde API-voor-UI volgorde.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/Ops-dashboard!130
No description provided.