chore(ops-agent): baseline krijgt de destructieve-migratie-gate #128

Merged
janpeter merged 1 commit from chore/ops-agent-baseline-migration-gate into main 2026-08-02 09:54:23 +02:00
Owner

Part B Task 5, fase 2. preflight_migrations_scrum4us is live gewired als stap direct vóór prisma_migrate_deploy_scrum4us met on_failure: abort; deze PR zet de baseline er in dezelfde sessie achteraan.

Bewijs

# check uitkomst
V1 negatieve controle: ongemarkeerde DROP TABLE FAIL zoals bedoeld, exit 1 — 1 pending scanned, 0 already-applied skipped, noemt het statement
V1b dezelfde migratie mét destructive-approved-marker exit 0 — de gate onderscheidt, weigert niet alles
V2 echte tree via POST /agent/v1/exec OK + exit 0
V3 skipped-telling 0 pending scanned, **22** already-applied skipped — niet nul, dus de mount klopt en de scan is niet vacuüm
V4 dry-run volgorde 20 stappen; gate=8, migratie=9 — direct ervoor
V5 drift-check na sync no drift, exit 0

Fase 1 (deploy van b985dc1) ging aan deze wiring vooraf: 19/19 stappen exit 0, No pending migrations to apply., en de scanner zit aantoonbaar in het draaiende image. Zonder die volgorde zou de nieuwe stap op elke run falen en met abort elke deploy blokkeren.

Afwijking van de aangeleverde YAML — bewust

De opdracht gaf:

cmd: docker
args:
  - run
  - --rm
  ...

Dat past niet op het schema van deze host. whitelist.js:21 eist cmd als niet-lege array, en args.allowed is een whitelist voor argumenten die de caller meegeeft — niet voor de vlaggen van het commando zelf. Letterlijk overnemen zou commands.yml laten afkeuren bij het laden, en dat raakt álle 99 keys, niet alleen deze. De docker-aanroep is inhoudelijk identiek overgenomen, in cmd-array-vorm, consistent met preflight_env_scrum4us ernaast.

Vorm

--network + --env-file + mount zijn alle drie nodig: de scanner leest de migratie-bestanden (dus mount) en haalt de reeds-toegepaste set uit de database (dus netwerk + MIGRATE_DATABASE_URL). Een env-only kopie van preflight_budget zou een lege map scannen en vacuüm slagen — exact de val die V3 afdekt. SCRUM4US_MIGRATIONS_APPLIED_SOURCE=db staat expliciet: een deploy-gate hoort zijn modus te benoemen.

Scope

Geen tweede redeploy_scrum4us gedraaid — de eerste echte run van de stap is de volgende gewone deploy. Runtime drift-baseline mee-gesynct (.bak.migrgate-20260802-094823), want de timer vergelijkt tegen die kopie en niet tegen deze clone.

Part B Task 5, fase 2. `preflight_migrations_scrum4us` is live gewired als stap **direct vóór** `prisma_migrate_deploy_scrum4us` met `on_failure: abort`; deze PR zet de baseline er in dezelfde sessie achteraan. ## Bewijs | # | check | uitkomst | |---|---|---| | V1 | negatieve controle: ongemarkeerde `DROP TABLE` | **FAIL zoals bedoeld**, exit 1 — `1 pending scanned, 0 already-applied skipped`, noemt het statement | | V1b | dezelfde migratie mét `destructive-approved`-marker | exit 0 — de gate onderscheidt, weigert niet alles | | V2 | echte tree via `POST /agent/v1/exec` | `OK` + `exit 0` | | V3 | **skipped-telling** | `0 pending scanned, **22** already-applied skipped` — niet nul, dus de mount klopt en de scan is niet vacuüm | | V4 | dry-run volgorde | 20 stappen; gate=8, migratie=9 — direct ervoor | | V5 | drift-check na sync | `no drift`, exit 0 | Fase 1 (deploy van `b985dc1`) ging aan deze wiring vooraf: 19/19 stappen exit 0, `No pending migrations to apply.`, en de scanner zit aantoonbaar in het draaiende image. Zonder die volgorde zou de nieuwe stap op elke run falen en met `abort` elke deploy blokkeren. ## Afwijking van de aangeleverde YAML — bewust De opdracht gaf: ```yaml cmd: docker args: - run - --rm ... ``` Dat past niet op het schema van deze host. `whitelist.js:21` eist `cmd` als **niet-lege array**, en `args.allowed` is een whitelist voor argumenten die de **caller** meegeeft — niet voor de vlaggen van het commando zelf. Letterlijk overnemen zou `commands.yml` laten afkeuren bij het laden, en dat raakt álle 99 keys, niet alleen deze. De docker-aanroep is inhoudelijk identiek overgenomen, in `cmd`-array-vorm, consistent met `preflight_env_scrum4us` ernaast. ## Vorm `--network` + `--env-file` + mount zijn alle drie nodig: de scanner leest de migratie-**bestanden** (dus mount) en haalt de reeds-toegepaste set uit de database (dus netwerk + `MIGRATE_DATABASE_URL`). Een env-only kopie van `preflight_budget` zou een lege map scannen en vacuüm slagen — exact de val die V3 afdekt. `SCRUM4US_MIGRATIONS_APPLIED_SOURCE=db` staat expliciet: een deploy-gate hoort zijn modus te benoemen. ## Scope Geen tweede `redeploy_scrum4us` gedraaid — de eerste echte run van de stap is de volgende gewone deploy. Runtime drift-baseline mee-gesynct (`.bak.migrgate-20260802-094823`), want de timer vergelijkt tegen die kopie en niet tegen deze clone.
chore(ops-agent): baseline krijgt de destructieve-migratie-gate
Some checks failed
CI / Root app checks (pull_request) Failing after 5m1s
CI / Ops-agent checks (pull_request) Successful in 29s
CI / Deploy artifact checks (pull_request) Successful in 12s
CI / Docker image build (pull_request) Successful in 1m18s
e5b3c06547
preflight_migrations_scrum4us is live gewired als stap direct voor
prisma_migrate_deploy_scrum4us (on_failure: abort). Deze commit zet de
version-controlled baseline er in dezelfde sessie achteraan, zodat we niet
opnieuw de host-only drift creeren die de vorige taak net heeft opgeruimd.

De aangeleverde YAML is bewust NIET letterlijk overgenomen: die gaf `cmd: docker`
met een `args:`-lijst voor de docker-vlaggen, terwijl whitelist.js `cmd` als
niet-lege ARRAY eist en `args.allowed` een whitelist is voor argumenten die de
CALLER meegeeft — een andere betekenis. Letterlijk overnemen had de hele
commands.yml laten afkeuren bij het laden. De docker-aanroep zelf is identiek.

Runtime drift-baseline is mee-gesynct (.bak.migrgate-20260802-094823); de timer
vergelijkt tegen die kopie, niet tegen deze clone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
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!128
No description provided.