feat(ops-agent): compose-collision meldt alleen bij verandering (ISS-5, T-132) #270

Merged
janpeter merged 2 commits from feat/compose-collision-meldt-bij-verandering into main 2026-09-29 16:09:48 +02:00
Owner

Stap 6 van het ontwerp Losse compose-kopieën structureel voorkomen (scrum4me-server docs/superpowers/specs/2026-09-28-compose-kopieen-structureel-design.md, GO ronde 4). ISS-5, T-132.

Wijziging

  • A2 --idempotency-key compose-collision:<host>:<date -u +%G-W%V>:<hash16>; hash over de gesorteerde destructieve bevindingen, waarschuwingen tellen niet mee. Geen statusbestand.
  • A3 destructief als de status running( bevat (was: begint met).
  • A4 scanner-hash (12 tekens) in de eerste logregel van elke run, ook schoon en bij gebruiksfout; bron: bestand → COMPOSE_COLLISION_SCANNER_SHA → onbekend. Rapportkop noemt scanner-hash, bevindingen-hash en week.

Read-only en exitcodes 0/1/2 ongewijzigd. De runtime-kopieën op de hosts veranderen pas bij uitrol (T-138).

Tests

test/compose-collision-check.test.ts, 11 tests met nagebootste docker en s4m-queue.

  • Rood vóór de wijziging: 8 faalden (alle A2/A3/A4-tests), 3 slaagden (bestaand gedrag).
  • Groen erna: 11/11; samen met control-room-foundation-install.test.ts 42/42.
  • Mutaties (sleutel weg, prefix-toets terug, hash-log na de schone uitgang, weekjaar weg) worden elk door ten minste één test gevangen.
  • shellcheck: dezelfde bevindingen als op main, geen nieuwe.

Droogloop (read-only, via stdin, DRIFT_NO_NOTIFY=1)

Scanner-hash lokaal en op beide hosts 4b2f739bea75.

  • scrum4me-server: exit 1, 1 destructief (/srv/scrum4me/forgejo, kopie van 17:23Z), 4 waarschuwingen.
  • max2: exit 1, 23 destructief, 21 waarschuwingen (nog niet opgeruimd, T-134). media-organizer met status exited(1), running(4) telt nu als destructief (A3).
  • s4m-queue --help noemt --idempotency-key op beide hosts.

🤖 Generated with Claude Code

Stap 6 van het ontwerp *Losse compose-kopieën structureel voorkomen* (scrum4me-server `docs/superpowers/specs/2026-09-28-compose-kopieen-structureel-design.md`, GO ronde 4). ISS-5, T-132. ## Wijziging - **A2** `--idempotency-key compose-collision:<host>:<date -u +%G-W%V>:<hash16>`; hash over de gesorteerde destructieve bevindingen, waarschuwingen tellen niet mee. Geen statusbestand. - **A3** destructief als de status `running(` bevat (was: begint met). - **A4** scanner-hash (12 tekens) in de eerste logregel van elke run, ook schoon en bij gebruiksfout; bron: bestand → `COMPOSE_COLLISION_SCANNER_SHA` → `onbekend`. Rapportkop noemt scanner-hash, bevindingen-hash en week. Read-only en exitcodes 0/1/2 ongewijzigd. De runtime-kopieën op de hosts veranderen pas bij uitrol (T-138). ## Tests `test/compose-collision-check.test.ts`, 11 tests met nagebootste `docker` en `s4m-queue`. - Rood vóór de wijziging: 8 faalden (alle A2/A3/A4-tests), 3 slaagden (bestaand gedrag). - Groen erna: 11/11; samen met `control-room-foundation-install.test.ts` 42/42. - Mutaties (sleutel weg, prefix-toets terug, hash-log na de schone uitgang, weekjaar weg) worden elk door ten minste één test gevangen. - shellcheck: dezelfde bevindingen als op `main`, geen nieuwe. ## Droogloop (read-only, via stdin, `DRIFT_NO_NOTIFY=1`) Scanner-hash lokaal en op beide hosts `4b2f739bea75`. - scrum4me-server: exit 1, 1 destructief (`/srv/scrum4me/forgejo`, kopie van 17:23Z), 4 waarschuwingen. - max2: exit 1, 23 destructief, 21 waarschuwingen (nog niet opgeruimd, T-134). `media-organizer` met status `exited(1), running(4)` telt nu als destructief (A3). - `s4m-queue --help` noemt `--idempotency-key` op beide hosts. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(ops-agent): compose-collision meldt alleen bij verandering (ISS-5, T-132)
Some checks failed
CI / Select checks (pull_request) Successful in 39s
CI / Ops-agent checks (pull_request) Successful in 39s
CI / Root app checks (pull_request) Failing after 1m34s
CI / Deploy artifact checks (pull_request) Successful in 26s
CI / DB access operator (pull_request) Successful in 1m18s
CI / Mac foundation hermetic checks (pull_request) Successful in 2m13s
CI / Docker image build (pull_request) Successful in 3m38s
CI / Mac foundation reproducible build (pull_request) Successful in 3m10s
CI / Publish post-merge release evidence (pull_request) Has been skipped
CI / Required checks (pull_request) Failing after 21s
764880c487
- A2: push met --idempotency-key compose-collision:<host>:<ISO-weekjaar-week>:<hash16>;
  de hash dekt alleen destructieve bevindingen. Ongewijzigd = geen tweede
  bericht binnen de week; wijziging = direct nieuw bericht; nieuwe week =
  herinnering.
- A3: destructief als de status `running(` bevat, niet alleen als hij ermee
  begint (`exited(1), running(4)` was ten onrechte een waarschuwing).
- A4: eerste logregel van elke run noemt de scanner-hash (bestand, anders
  COMPOSE_COLLISION_SCANNER_SHA, anders onbekend); het rapport noemt hem in de kop.

Scanner blijft read-only; exitcodes 0/1/2 ongewijzigd.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
s4m-codex-reviewer approved these changes 2026-09-28 19:37:14 +02:00
Dismissed
s4m-codex-reviewer left a comment

APPROVED

Findings

  • Geen blokkerende of error-severity findings aangetroffen.

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

De scanner gebruikt nu een deterministische idempotency-key voor destructieve bevindingen, behandelt gemengde Compose-statussen met draaiende containers correct en dekt dit af met gerichte regressietests. Bash-syntaxiscontrole is geslaagd.

# APPROVED ## Findings - Geen blokkerende of error-severity findings aangetroffen. Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. De scanner gebruikt nu een deterministische idempotency-key voor destructieve bevindingen, behandelt gemengde Compose-statussen met draaiende containers correct en dekt dit af met gerichte regressietests. Bash-syntaxiscontrole is geslaagd.
janpeter scheduled this pull request to auto merge when all checks succeed 2026-09-28 19:37:44 +02:00
janpeter scheduled this pull request to auto merge when all checks succeed 2026-09-28 20:10:24 +02:00
test(ci): registreer compose-collision-check in de base-groep
All checks were successful
CI / Select checks (pull_request) Successful in 33s
CI / Ops-agent checks (pull_request) Successful in 2m46s
CI / DB access operator (pull_request) Successful in 2m37s
CI / Deploy artifact checks (pull_request) Successful in 40s
CI / Root app checks (pull_request) Successful in 8m41s
CI / Docker image build (pull_request) Successful in 1m27s
CI / Mac foundation hermetic checks (pull_request) Successful in 4m27s
CI / Mac foundation reproducible build (pull_request) Successful in 6m2s
CI / Publish post-merge release evidence (pull_request) Has been skipped
CI / Required checks (pull_request) Successful in 1m35s
db661a7d3d
Zonder registratie stopt Root app checks direct: elke getrackte test moet in
precies één groep staan.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
s4m-codex-reviewer left a comment

Verdict: APPROVED

  • Geen bevindingen met blocker- of comment-severity.

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

De wijziging houdt de notificatie-idempotency deterministisch op basis van alleen destructieve bevindingen, herkent gemengde Compose-statussen met nog draaiende services, en bevat gerichte regressietests die in de CI-testgroep zijn opgenomen.

# Verdict: APPROVED - Geen bevindingen met blocker- of comment-severity. geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. De wijziging houdt de notificatie-idempotency deterministisch op basis van alleen destructieve bevindingen, herkent gemengde Compose-statussen met nog draaiende services, en bevat gerichte regressietests die in de CI-testgroep zijn opgenomen.
Sign in to join this conversation.
No reviewers
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!270
No description provided.