fix(dispatch): sluit nooit gestarte pogingen van een afgemelde incarnatie (ISS-12) #191
No reviewers
Labels
No labels
severity/s2
severity/s3
severity/s4
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
janpeter/scrum4me-mcp!191
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/iss12-signed-off-unstarted"
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?
Fix voor ISS-12 (Forgejo #189). Na een OOM-herstart van de supervisor bleef de geclaimde poging als wees achter.
Faalpad (2026-10-05)
79314efd.get_artifact, nog vóór er een scope bestond.lease_expireden gaat het request naarUNCERTAIN.claude_jobsblijft echter opCLAIMEDstaan en de reservering blijft bezet.stop_requiredhangen tot handmatigeoperator_recovery.Waar de fix hoort: de service
De supervisor (scrum4me-docker) erft na een herstart bewust niets. Hij heeft geen journal-scan, en de AttemptProof staat alleen in het geheugen. Bovendien eist claim-stop request-state
CLAIMED. De supervisor kan de wees dus niet sluiten.Fix
De nieuwe tick-stap
closeSignedOffUnstartedAttempts(src/dispatch/orphans.ts) sluit pogingen met deze signatuur:signed_off_at)scope_idenstarted_atzijn leegstarted_scopeDe stap legt eerst stopbewijs vast (
stop_accepted, kindsigned_off_unstarted). Daarna:CLAIMEDofUNCERTAINwordtFAILEDmet summaryDISPATCH_INCARNATION_SIGNED_OFF_BEFORE_START;CANCEL_REQUESTEDwordtCANCELLED.In beide gevallen worden job en attempt terminaal en komt de reservering vrij. De signatuur wordt onder de lifecycle-locks opnieuw gecontroleerd.
Waarom dit veilig is
signPermitwordt alleen aangeroepen instartDispatchAttempt, in dezelfde transactie diestarted_at/scope_idzet enstarted_scopeemit.verifyBrokerPermit).active()weigert een afgemelde incarnatie, dus die krijgt nooit meer een permit.Er heeft dus niets gedraaid en er kan niets meer gaan draaien. Hooguit blijft een created, nooit gestarte container achter. Een poging van een nog actieve incarnatie houdt het bestaande gedrag: na lease-verloop wordt die
UNCERTAINen vraagt operator-herstel.Tests
f9e7b06voegt alleen de regressietest toe en is rood op origin/main. De incidentvolgorde blijftUNCERTAINen de cancel blijftCANCEL_REQUESTED.2167725is groen.attempts.integration.test.ts: 30/30npm run test:dispatch: 295/295 (lokale wegwerp-pg17, schema-pin6dc581da)npm test: 2103 passed, 69 skippedtypecheckentypecheck:testszijn schoon.Runbook: Scrum4Me PR
docs/iss12-signed-off-unstarted(§9.1/9.2).Niet mergen of deployen zonder aparte GO van JP.
🤖 Generated with Claude Code
COMMENT
Geen blokkerende codefinding gevonden; wel een kleine onnauwkeurigheid en beperkte onafhankelijke verificatie.
finishStoppedCancellationschrijft viasrc/dispatch/lifecycle.ts:60dat de supervisor beëindiging bevestigde. In dit nieuwe pad leidt de service zelf het bewijs af en heeft de supervisor niets bevestigd. Gebruik een passende of neutrale rapporttekst, zodat het resultaat dezelfde herkomst beschrijft als het audit-event.Plan gekoppeld via commits; references: ST-055. Er is niets omitted. De diff bevat de vijf functionele scenario’s uit de acceptatiecriteria, inclusief UNCERTAIN, annulering, negatieve controles en herhaalde tick. De afsluiting hergebruikt lifecycle-locks, resultaatregistratie en vrijgave van reserveringen. De runbookwijziging (§9.1/9.2, T-174) valt buiten deze diff en wordt in de PR expliciet als aparte Scrum4Me-PR genoemd; daarom is dat hier geen blokkerende finding. De inhoud van die aparte wijziging is niet geverifieerd.
Verificatie: head SHA komt overeen met de payload;
git diff --checkis schoon. Forgejo rapporteert een geslaagde PR-candidate CI voor deze SHA. De rood-op-main/groen-met-fix-resultaten staan in de PR-beschrijving; ik heb ze niet zelfstandig gereproduceerd. Lokaal stranddenpm ciop esbuild EACCES; installatie zonder scripts slaagde, maar beide typechecks missen daardoor de gegenereerde Prisma Client. De dispatch-testguard weigert uitvoering wegens ontbrekende DISPATCH_TEST_SCHEMA_ROOT en er is geen lokale PostgreSQL-testomgeving. Deze omgevingsbeperkingen zijn geen aangetoonde PR-regressie, maar rechtvaardigen hier het voorzichtige COMMENT-verdict.Bij de laatste controle was de PR inmiddels gemerged; deze review betreft uitsluitend commit
2167725c456e1e1a5a02442928568a90625bd0fb.