[ISS-12] Dispatch: herstarte supervisor laat geclaimde poging wees achter (CLAIMED na lease_expired, geen reclaim) #189
Labels
No labels
severity/s2
severity/s3
severity/s4
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
janpeter/scrum4me-mcp#189
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Status: investigating · Severity: s3_major · Gemeld door: scrum4me-server:claude · Occurrences: 1 (laatst: 2026-10-05T01:13:37.601Z) · PBI: PBI-35 · Aangemaakt: 2026-10-05T01:13:37.601Z
Registratie
Wat er gebeurde (2026-10-05, scrum4me-server)
fb08c6d2-17c2-43dc-8442-84d585c8fbc5(QUEUE_REVIEW, CLAUDE) wordt geclaimd door slotb41d91ae…(managed:srv-review-claude-1), incarnatie3a5d05f4…, attempt79314efd…; jobf2de30c0-9452-457b-b55e-79b6232021e5gaat naarCLAIMED.limit 262144kB; /tmp-tmpfs telt mee) tijdensget_artifact, nog vóór er een broker-scope bestond.d70a54d5…; de oude wordt afgemeld om 00:43:54Z.lease_expiredom 00:45:53Z — maar verzoek, attempt en job blijvenCLAIMED, en de reservering blijft bezet.UNCERTAIN-overgang. De slot-heartbeat en de worker-heartbeat lopen gewoon door, dus er komt ook geen stale-reclaim.CANCEL_REQUESTEDmetstop_required.Verwacht
lease_expiredop een unstarted attempt waarvan de incarnatie is afgemeld) sluit de poging zelf af, zoals bijDISPATCH_PREPARED_SOURCES_REFUSED:DISPATCH_*-reden en een failed-resultaat, slot vrij;UNCERTAIN.scope_idnull) is aantoonbaar zonder uitvoering. Dat hoort geen operator-attestatie te vereisen.Workaround (gebruikt)
PUT /dispatch/v1/requests/:id/evidence/<key>(kind: operator_attested, binding op de oude incarnatie,scopeId"unstarted:").POST /requests/:id/recovermetclose_cancelled→ verzoek en jobCANCELLED, reservering vrijgegeven (01:11:21Z).Mitigatie
De
mem_limitvan de supervisor is verhoogd van 256m naar 512m (scrum4me-docker PR #109 + host-overlay). Dat neemt de trigger weg, maar niet het wees-gedrag.Onderzoek
2026-10-05T10:04:59.126Z — scrum4me-server:claude
Analyse (2026-10-05, scrum4me-server:claude)
Correctie op de beschrijving. De DB-events van request
fb08c6d2laten zien datlease_expired(00:45:53Z) het request wél naarUNCERTAINzette (uncertain(),src/dispatch/attempts.ts:308-314). Wat bleef hangen:claude_jobsop CLAIMED en de reservering bezet. UNCERTAIN is by design een hold-state die alleen via operator-recover sluit (runbookqueue-dispatch.md§9.1–9.2).Waarom de supervisor het niet zelf kan:
bin/run-dispatch-attempt.tserft na een herstart bewust niets. Er is geen journal-scan, en de AttemptProof met de credential staat alleen in het geheugen. De claim-stop (/attempts/claim-stop) vereist die proof en request-state CLAIMED, maar nalease_expiredis het request UNCERTAIN. Een supervisor-fix in scrum4me-docker kan dit faalpad dus niet dichten.Waarom de service het wél kan bewijzen. Het ontwerp sluit auto-close bij lease-expiry uit, omdat er "een container kan bestaan". De sterkere invariant is echter:
signPermitwordt alleen aangeroepen instartDispatchAttempt. Die zet in dezelfde transactiestarted_at/scope_iden emitstarted_scope.verifyBrokerPermit, scrum4me-dockerlib/dispatch-runtime-broker.ts:240).startDispatchAttemptvereistactive(), dus!signed_off_at. Een afgemelde incarnatie krijgt nooit meer een permit.Uit
started_at IS NULL∧scope_id IS NULL∧ geenstarted_scope∧ incarnatiesigned_off_at IS NOT NULLvolgt daarom: er is nooit een container gestart en dat kan ook niet meer. Hooguit staat er een created container of scope-dir als restant, wat een resourcelek is en geen uitvoering.Voorgestelde fix: alleen in de service (scrum4me-mcp). Een sweep in de
lease-tick sluit pogingen met die signatuur af:DISPATCH_INCARNATION_SIGNED_OFF_BEFORE_START. De job gaat naar FAILED en de reservering komt vrij.Het plan wacht op GO van JP.
2026-10-05T10:17:07.175Z — scrum4me-server:claude
Voortgang (2026-10-05)
JP gaf GO op het plan (alleen een fix in de service). De gematerialiseerde onderdelen zijn PBI-35, ST-055 en T-172 t/m T-174 (sprint S-2026-10-05-1).
PR's (niet gemerged)
closeSignedOffUnstartedAttemptsen de regressietest.Testresultaten
Open: review, merge en deploy wachten op een aparte GO van JP. De mitigatie van mem_limit naar 512m blijft staan.
Oplossing
Nog geen oplossing.