fix(dispatch): tijdelijke unknown-inspect maakt een poging niet direct uncertain (T-1973) #104

Merged
janpeter merged 1 commit from feat/t1973-inspect-tolerance into master 2026-10-03 17:59:27 +02:00
Owner

Waarom (T-1973, incident 2026-10-03)

Onder IO-druk op scrum4me-server beantwoordde dockerd stop, kill en inspect van een net gestopt kind te laat. Eén broker-inspect gaf unknown of liep in de timeout van 10 s van de supervisor. De wachtlus gooide dan meteen DISPATCH_RUNTIME_UNCERTAIN, waardoor twee normaal afgeronde reviews (exit 0, geldig resultaat) uncertain werden. Herstel moest handmatig, met stopbewijs en opnieuw indienen, en kostte ongeveer 30 minuten.

Wat

  • In de wachtlus van runDispatchAttempt telt een unknown of een DISPATCH_SUPERVISOR_TIMEOUT van inspect als "nog niet bekend":
    • de heartbeats gaan door en de volgende inspect beslist;
    • dit duurt hooguit INSPECT_GRACE_MS (3 min, ruim binnen lease en max_duration), daarna volgt DISPATCH_RUNTIME_UNCERTAIN;
    • een broker-weigering of een andere staat (bijvoorbeeld created) blijft direct fataal;
    • er wordt nooit gestart of herstart.
  • Per episode komt één begrensde logcode: DISPATCH_RUNTIME_INSPECT_RETRY.
  • ensureStopped is bewust ongewijzigd. De lus gaat pas verder na een door de broker geziene stopped, en een stop op een gestopte container is dan meteen klaar.
  • De bestaande test "unknown inspect produces uncertainty" krijgt inspectGraceMs: 20. De uitkomst is dezelfde veilige uncertain, met de nieuwe semantiek.

Verificatie

  • RED: de tests voor een tijdelijke unknown en een tijdelijke timeout faalden (de poging werd direct uncertain).
  • Supervisor-suite: 58 van 58. Volledige vitest: 1091 geslaagd. Daarnaast falen 2 bestaande macOS-tests (transcript-retention) en 3 docs-audit-publication-tests met een timeout onder parallelle belasting; los draaien die 22 van 22 groen.
  • tsc -p tsconfig.dispatch.json is schoon.
  • Cross-repo contractgate tegen scrum4me-mcp main 6b2a7a3: de eerste run gaf 8 van 9, direct na het starten van een verse Postgres; dat was niet te reproduceren. Daarna drie keer 9 van 9.

Alleen het supervisor-image verandert; de kindcode, de model-images en de profielen niet.

🤖 Generated with Claude Code

## Waarom (T-1973, incident 2026-10-03) Onder IO-druk op scrum4me-server beantwoordde dockerd stop, kill en inspect van een net gestopt kind te laat. Eén broker-inspect gaf `unknown` of liep in de timeout van 10 s van de supervisor. De wachtlus gooide dan meteen `DISPATCH_RUNTIME_UNCERTAIN`, waardoor twee normaal afgeronde reviews (exit 0, geldig resultaat) `uncertain` werden. Herstel moest handmatig, met stopbewijs en opnieuw indienen, en kostte ongeveer 30 minuten. ## Wat - In de wachtlus van `runDispatchAttempt` telt een `unknown` of een `DISPATCH_SUPERVISOR_TIMEOUT` van inspect als "nog niet bekend": - de heartbeats gaan door en de volgende inspect beslist; - dit duurt hooguit `INSPECT_GRACE_MS` (3 min, ruim binnen lease en `max_duration`), daarna volgt `DISPATCH_RUNTIME_UNCERTAIN`; - een broker-weigering of een andere staat (bijvoorbeeld `created`) blijft direct fataal; - er wordt nooit gestart of herstart. - Per episode komt één begrensde logcode: `DISPATCH_RUNTIME_INSPECT_RETRY`. - `ensureStopped` is bewust ongewijzigd. De lus gaat pas verder na een door de broker geziene `stopped`, en een stop op een gestopte container is dan meteen klaar. - De bestaande test "unknown inspect produces uncertainty" krijgt `inspectGraceMs: 20`. De uitkomst is dezelfde veilige `uncertain`, met de nieuwe semantiek. ## Verificatie - RED: de tests voor een tijdelijke `unknown` en een tijdelijke timeout faalden (de poging werd direct `uncertain`). - Supervisor-suite: 58 van 58. Volledige vitest: 1091 geslaagd. Daarnaast falen 2 bestaande macOS-tests (`transcript-retention`) en 3 `docs-audit-publication`-tests met een timeout onder parallelle belasting; los draaien die 22 van 22 groen. - `tsc -p tsconfig.dispatch.json` is schoon. - Cross-repo contractgate tegen scrum4me-mcp main `6b2a7a3`: de eerste run gaf 8 van 9, direct na het starten van een verse Postgres; dat was niet te reproduceren. Daarna drie keer 9 van 9. Alleen het supervisor-image verandert; de kindcode, de model-images en de profielen niet. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(dispatch): tijdelijke unknown-inspect maakt een poging niet direct uncertain (T-1973)
All checks were successful
CI / Build-arg coverage (pull_request) Successful in 3s
CI / Compose config (pull_request) Successful in 10s
CI / Docker build (pull_request) Successful in 1m11s
9239cf426f
Incident 2026-10-03: onder IO-druk op scrum4me-server beantwoordde dockerd
stop/kill/inspect van een net gestopt kind te laat; één broker-inspect gaf
unknown of liep in de 10 s-timeout van de supervisor, en twee afgeronde reviews
werden uncertain (handmatig herstel, 30 min verloren).

In de wachtlus telt een unknown of een DISPATCH_SUPERVISOR_TIMEOUT van inspect
nu als "nog niet bekend": heartbeats gaan door en de volgende inspect beslist,
binnen INSPECT_GRACE_MS (3 min, ruim binnen lease en max_duration). Pas daarna
DISPATCH_RUNTIME_UNCERTAIN. Een broker-weigering of een andere staat blijft
direct fataal; er wordt nooit gestart of herstart. Eén begrensde logcode
DISPATCH_RUNTIME_INSPECT_RETRY per episode.

ensureStopped bewust ongewijzigd: de lus gaat pas door bij een door de broker
geziene stopped, en een stop op een gestopte container is dan direct klaar.

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

COMMENT

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

Geen blokkerende codefout vastgesteld. De wijziging blijft binnen de bestaande supervisor-portstructuur; stopbewijs, centrale result-receipt en cleanup-volgorde blijven behouden. Vanwege onderstaande dekkingstekorten en beperkte runtime-verificatie geef ik geen APPROVED.

Findings

  • WARNING — tests/dispatch-supervisor.test.ts:489: De time-outtest reject direct met DISPATCH_SUPERVISOR_TIMEOUT; hij test geen inspect die werkelijk blijft hangen en door bounded na 10 s wordt begrensd. Voeg een fake-timer-test toe voor die route en regressietests voor stopRequired/abort tijdens unknown en reset van de grace na running.
  • INFO — lib/dispatch-supervisor.ts:145: Documenteer de nieuwe 180 s grace en DISPATCH_RUNTIME_INSPECT_RETRY in de lifecycle-sectie van docs/dispatch-runtime-operator.md, inclusief doorlopende heartbeats en welke fouten direct fataal blijven. Deze operationele gedragswijziging staat nu uitsluitend in broncommentaar.

Verificatie

Forgejo refs/pull/104/head komt overeen met 9239cf426f4c95b552947af9e8ea806b3d872547. Typecheck (node node_modules/typescript/bin/tsc -p tsconfig.dispatch.json) en diff-whitespacecontrole slagen. De testsuite is geprobeerd, maar start niet: /tmp verhindert uitvoering en laden van de native Rolldown-module (Permission denied / failed to map segment). De WASM-fallback-installatie faalde eveneens. Dit is een omgevingsbeperking; testresultaten zijn niet als geslaagd aangemerkt.

# COMMENT geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. Geen blokkerende codefout vastgesteld. De wijziging blijft binnen de bestaande supervisor-portstructuur; stopbewijs, centrale result-receipt en cleanup-volgorde blijven behouden. Vanwege onderstaande dekkingstekorten en beperkte runtime-verificatie geef ik geen APPROVED. ## Findings - **WARNING — __tests__/dispatch-supervisor.test.ts:489**: De time-outtest reject direct met `DISPATCH_SUPERVISOR_TIMEOUT`; hij test geen inspect die werkelijk blijft hangen en door `bounded` na 10 s wordt begrensd. Voeg een fake-timer-test toe voor die route en regressietests voor `stopRequired`/abort tijdens `unknown` en reset van de grace na `running`. - **INFO — lib/dispatch-supervisor.ts:145**: Documenteer de nieuwe 180 s grace en `DISPATCH_RUNTIME_INSPECT_RETRY` in de lifecycle-sectie van `docs/dispatch-runtime-operator.md`, inclusief doorlopende heartbeats en welke fouten direct fataal blijven. Deze operationele gedragswijziging staat nu uitsluitend in broncommentaar. ## Verificatie Forgejo `refs/pull/104/head` komt overeen met `9239cf426f4c95b552947af9e8ea806b3d872547`. Typecheck (`node node_modules/typescript/bin/tsc -p tsconfig.dispatch.json`) en diff-whitespacecontrole slagen. De testsuite is geprobeerd, maar start niet: `/tmp` verhindert uitvoering en laden van de native Rolldown-module (`Permission denied` / `failed to map segment`). De WASM-fallback-installatie faalde eveneens. Dit is een omgevingsbeperking; testresultaten zijn niet als geslaagd aangemerkt.
janpeter merged commit 50107904a3 into master 2026-10-03 17:59:27 +02:00
Sign in to join this conversation.
No reviewers
No labels
severity/s3
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/scrum4me-docker!104
No description provided.