feat(queue): fase 2 compleet — zeven MCP-tools met de mis-routing-fix #96
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/queue-tools-push"
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?
Taken 8 t/m 15 van het fase-2-plan: de zeven queue-tools, hun registratie, en de integratietests. Daarmee is fase 2 af.
Wat dit oplost
De s4m-queue adresseert op
(server, model). Vandaag claimtinbox --as claudehet oudste pending antwoord voor dat adres, ongeacht wie het verzoek stuurde — dus twee Claude-sessies op één host stelen elkaars antwoorden, en de bestolen sessie wacht voor niets.queue_wait_replylost dat op met het correlatiefilterin_reply_to = ANY(message_ids)in de WHERE-clause: een sessie kan per constructie alleen antwoorden op haar eigen request-handles claimen.De tools
queue_pushsource='mcp', meta-validatie, repo-autofillqueue_wait_replyqueue_nextqueue_done/queue_failqueue_status/queue_listGeregistreerd stdio-only. De centrale HTTP-server kent de caller-identiteit niet en heeft geen lease-register; daar zouden claims aan het verkeerde adres hangen. Een test bewijst dat HTTP ze niet aanbiedt — mét positieve controle, want een negatieve assertie die niets meer toetst is erger dan geen.
Integratietests tegen een echte database
De unit-tests draaien op een gemockte Prisma-client, en die geeft zijn fixture terug ongeacht wat de query zegt. Vier defecten waren daardoor structureel onzichtbaar — alle vier overleefden ze de mutatietests en alle vier worden ze nu rood tegen
scrum4me_test(volledige migratieset, mét de CHECK-constraints):doneWithReply. Reply-rij, statuswissel en beide NOTIFY's horen samen te committen. Splitsen in twee transacties kwam door élke unit-test heen. Aangetoond met een tijdelijke Postgres-trigger die middenin de transactie faalt: onder de correcte code rolt alles terug; met de mutatie blijft er een weesreply achter waarvan het verzoek opclaimedhangt en nooitdonewordt.claimNextRequest.QUEUE_REQUEST_TYPESvervangen doorQUEUE_RESPONSE_TYPESliet negen tests groen —queue_nextzou antwoorden claimen in plaats van verzoeken.previous_statusuit de pre-update rij. Uit de post-update rij lezen kwam overal doorheen; elke claim-envelope zou dan de nieuwe status als "vorige" dragen.Plus de §8-scenario's zelf: de correlatie-race met antwoorden in omgekeerde volgorde, claim-atomiciteit onder parallellisme, de idempotente-read-voortgang en de volledige eigenaarsmatrix tegen echte rijen.
17 integratietests, elf keer gedraaid, geen flakiness. Zonder
TEST_DATABASE_URLskippen ze netjes.Wat de mutatietests opleverden
Over deze acht taken overleefden aanvankelijk tientallen mutaties. De belangrijkste:
Een autorisatie-bypass. Het claim-token vervangen door een constante kwam door alle zeven
queue_next-tests heen.verifyLocalOwnershipsleutelt de lease op bericht-id en vertrouwt het token als enige bewijs — en bericht-ids zijn zichtbaar viaqueue_list. Met een voorspelbaar token kan een aanroeper binnen hetzelfde procesqueue_doneofqueue_failuitvoeren op werk dat hij nooit claimde. Nu vastgepind met twee claims naast elkaar.Een precedentieregel die het plan zelf load-bearing noemt — expliciete
meta.task.cwdboven decwd-parameter — had geen enkele test. De ontvanger zou zijn werk in de verkeerde map uitvoeren.Een read-only-garantie die op toeval berustte. Dat een write in
queue_statusfaalde, kwam doordat de mock geenupdate-methode had, niet doordat een assertie het verbood.Verificatie
npm run typecheckschoon.npm test: 1306 groen, 18 overgeslagen (twee integratiebestanden zonder env), 177 bestanden.Bekend, niet in deze PR
index.tsecht op, dus een verdwenenregisterQueueTools(server)zou ongemerkt shippen — dezelfde blinde vlek bestond al voorregisterWorktreeTools. Onderzocht: niet te sluiten zonder productiecode-wijziging, wantmain()doet auth en presence-registratie vóór de transport verbindt.scripts/smoke-test.ts:63pint 16 tools; dat waren er al 54 vóór deze PR en nu 61. Draait niet in CI.create_pbi's code-allocatie (withCodeUniqueRetryretryt zonder backoff) — apart gemeld, niet aangeraakt.🤖 Generated with Claude Code
feat(queue): queue_push, queue_status en queue_listto feat(queue): fase 2 compleet — zeven MCP-tools met de mis-routing-fix