feat(dispatch): usage van een dispatchpoging op de job (T-1972) #179
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!179
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/t1972-dispatch-usage"
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?
Waarom (T-1972, PBI-175 / ST-1622)
QUEUE_REVIEW-dispatchjobs hadden geen usage-data. Alle 20 van de afgelopen 14 dagen hadden geen tokens, geen
model_iden geenusage_capture_status. Het afgesloten kind heeft geen MCP en geen hook, enterminalizeAttemptzette alleenstatusenfinished_at. De usage staat wel in het transcript; de supervisor stuurt hem nu mee (scrum4me-docker, aparte PR).Wat
POST /attempts/resultaccepteert een optioneelusage-veld (z.unknown()); de route parseert het bewust niet zelf.src/dispatch/usage.ts:dispatchUsageSchema: strict, met begrensde int4-tellingen en een modeltoken.dispatchUsageColumns: zet de usage om naar de kolommen. Het prijsmodel volgt de Codex-runner: het waargenomen model geeftobserved_event, andersrequested_modelmetcli_model, andersmissing_model.writeDispatchUsage.finishResultschrijft de usage in dezelfde transactie naterminalizeAttempt, alleen bij een vers resultaat. Een replay keert eerder terug en verandert niets.usage_capture_source='dispatch_transcript'.Grenzen. De cijfers komen van het afgesloten kind en zijn dus rapportage. Ongeldige usage wordt
parse_erroren weigert het resultaat nooit. Zonderusage(een oudere supervisor of het recovery-pad) blijven de kolommen leeg. De rolscrum4me_dispatchheeft al UPDATE opclaude_jobs, dus er is geen policywijziging nodig.Uitrolvolgorde. Deze service moet live zijn vóór een supervisor die
usagemeestuurt. De huidige route is strict en weigert het veld; de poging blijft dan oppending_receiptstaan (gemeten in de docker-contractgate).Verificatie
DISPATCH_INVALID_INPUT.npx vitest run: 2031 geslaagd en 69 overgeslagen.tsc --noEmitis schoon.vitest.dispatch.config.tsop een wegwerp-Postgres): 283 van 283, waarvan 5 nieuw:parse_error, en het resultaat wordt toch geaccepteerd;🤖 Generated with Claude Code
REQUEST_CHANGES
geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
submitStopeerstfinishStoppedCancellationaan, dat het canonieke resultaat zonder usage vastlegt. Het latere supervisor-resultaat met usage verlaatcompletion.acceptvervolgens via de bestaande terminal/replay-afhandeling en bereikt deze opslag niet. Daardoor ontbreken de verbruikte tokens van geannuleerde pogingen op de job. Ondersteun een poging-gebonden, eenmalige usage-opslag voor dit pad zonder het canonieke resultaat te wijzigen; voeg dekking toe voor cancel → stop → result met usage.De overige wijzigingen sluiten aan bij de bestaande transactionele completion-flow: begrensde tellingen, geparameteriseerde SQL, optionele usage en behoud van replay-idempotentie. De nieuwe tests dekken succesvolle resultaten, ongeldige usage en model-fallback, maar niet bovenstaand annuleringstraject. Er is geen gebruikers-/API-documentatie toegevoegd voor het nieuwe optionele usage-contract.
Verificatie op commit
5c2bbd940121e0f8b2f537c459ec9c94831bed4c: bron- en test-typecheck geslaagd na Prisma-generatie; vier zelfstandige checks van de daadwerkelijke usage-conversie geslaagd. Vitest kon niet starten door de uitvoerbeperking op native bindings in/tmp; dispatch-integratietests konden niet draaien doordatDISPATCH_TEST_SCHEMA_ROOTontbreekt. Dit zijn beperkingen van de reviewomgeving, geen bewezen testregressies.REQUEST_CHANGES
geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
src/dispatch/completion.ts:42(ook de resultaatcontrole op regels 109–110): de nieuwe opslag voor late usage staat uitsluitend in de eerste transactie. Wanneer annulering ná de prepare-transactie maar vóór de afsluitende transactie een canoniek cancellation-resultaat schrijft, retourneert de tweedeold-takterminal_resultzonder de meegestuurde usage te registreren. Daardoor ontbreken de verbruikscijfers ondanks een geldige inzending. Voeg ook daar de attempt-gebondenwriteDispatchUsage(..., { once: true })toe, met behoud van het canonieke resultaat en replaygedrag. Dek annulering tussen beide transacties af met een deterministische concurrentietest; de toegevoegde test annuleert vóór de eerste transactie.Controle
PR en head
7756e4cde3e7d36a729b081884544375e103dfcbgecontroleerd. Productarchitectuur en de standaard voor bron- en test-typechecks geraadpleegd; de gepinde databasepolicy geeft de dispatchrol de benodigde SELECT/UPDATE-rechten. Beide typechecks slagen. De race is gereproduceerd met de werkelijke completion-controlflow en een gesimuleerde database:terminal_result, nul usage-writes. Vitest kon hier niet starten vanwege native-codebeperkingen op/tmp; PostgreSQL-integratietests zijn niet lokaal uitgevoerd. De verificatieclaims in de PR-beschrijving zijn niet zelfstandig bevestigd.REQUEST_CHANGES
geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
verifyCodeArtifact(). Omdat de poging al gestopt is, kancancel.ts:45ondertussen het canonieke annuleringsresultaat zonder usage vastleggen. De tweedeold-tak retourneert danterminal_resultzonder usage op te slaan. Pas ook hier de attempt-gebondenwriteDispatchUsage(..., {once:true})toe en test deze interleaving. De nieuwe annuleringstest dekt uitsluitend annulering vóór de resultaatcall.{proof,result}. Documenteer het object, de statussen, model-fallback, foutafhandeling en replay-semantiek.Verificatie
PR resolveert; beoordeelde head:
68db5368ad22e373ecb6ac139d63ba261134ded5. Usage-unit-tests: 11/11 geslaagd. Bron- en test-typecheck: geslaagd.git diff --check: geslaagd. Dispatch-integratietests niet uitgevoerd: preflight stopt metDISPATCH_TEST_SCHEMA_ROOT_REQUIRED; de vereiste geïsoleerde databasefixture is hier niet beschikbaar. De racefinding berust op de gecontroleerde control flow, niet op een uitgevoerde race-reproductie.De begrensde schema-validatie, bestaande transacties/job-locks en scheiding van usage en canoniek resultaat passen verder bij de bestaande patronen.
COMMENT
geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
De wijziging houdt parsing in het domein en gebruiksregistratie binnen de resultaattransactie. Tests dekken validatie, model-fallback, replay en annulering tussen de twee transacties; README beschrijft het protocol en de uitrolvolgorde. Geen bewezen blokkerende finding, maar onderstaande gedragsafwijking en verificatiebeperking verhinderen een onvoorwaardelijke goedkeuring.
DISPATCH_TEST_SCHEMA_ROOT_REQUIRED). Vitest start bovendien niet doordat de native binding op eennoexec-filesysteem staat. Beide TypeScript-checks (srcen tests) en aanvullende directe checks voor usage-validatie, model-fallback en write-once met een database-mock slaagden. Deze aanvullende checks vervangen de integratiesuite niet.Beoordeeld op commit
02ac8c5437633af0da5a9a36bebaec6d3a04332c; de Forgejo PR-head is tegen deze SHA gecontroleerd.