feat(dispatch): QUEUE_REVIEW sluitend — leesbewijs, opdrachtbron, repository en antwoord-id (M41) #175

Merged
janpeter merged 4 commits from feat/m41-review-contract into main 2026-10-02 15:43:55 +02:00
Owner

Samenvatting

M41 increment 1 (sprint S-2026-10-02-1, story ST-1614, taken T-1923…T-1926): maakt een QUEUE_REVIEW aan de servicekant sluitend.

  • T2 — antwoord-id (G6). DispatchView geeft root_message_id en reply_message_id terug (requests.ts, lifecycle.ts). De tool-beschrijvingen van dispatch_review en dispatch_task noemen queue_wait_reply op het root-id.
  • T3 — leesbewijs (G1). Een echte review kon nooit slagen: completion.ts eiste een source_read van de agent-gateway, en geen uitgerold kind heeft daar een token voor.
    • Nu schrijft loadBoundSourceArtifact (GET /artifacts/:id met pogingsbewijs) een source_delivered-event. Dat gebeurt alleen voor gepinde reviewdocumenten met kloppende hash, idempotent en binnen de vergrendelde pogingstransactie.
    • assertReviewSourceReceipts accepteert beide soorten bewijs, met dezelfde artefact- en pogingsbinding.
    • Het bewijst aflevering van exact die bytes aan deze poging, niet dat het model ze las.
    • Geen migratie nodig: queue_dispatch_events.type heeft geen CHECK.
  • T4 — opdracht voor het kind (G2).
    • Elk verzoek krijgt een servicebron __dispatch_input: de canonieke DispatchInput, met sha256 = input_hash. Hij staat in het ondertekende manifest en in de pogingscontext.
    • Queue-prompts verwijzen naar /sources/<key> in plaats van /work.
  • T5 — codebase (G5). dispatch_review accepteert optioneel repository {product_id, base_sha}. De prompts beschrijven de read-only checkout in /work.
  • vendor/scrum4me-shared → b3d2b98 (scrum4me-shared#68), inclusief de parity-pin.

Test

Elke wijziging eerst rood, daarna groen.

Gate Resultaat
npm run typecheck groen
npm test 248 files, 2020 tests groen
scripts/run-dispatch-ci.mjs (wegwerp-pg17, gepinde Scrum4Me-schemabron) 27 files, 278 tests groen (DISPATCH_CI_PASSED; was 268)

De cross-repo contractgate in scrum4me-docker draait 9/9 groen tegen deze branch, met twee nieuwe QUEUE_REVIEW-gevallen die SUCCEEDED/GO halen. Tegen main faalt hij (DISPATCH_INPUT_UNREADABLE).

Merge-volgorde

Na scrum4me-shared#68; daarna s4m-queue, scrum4me-docker en Scrum4Me-docs.

Open risico's (increment 2)

  • snapshot (task_implementation) zit niet in de payload van het kind.
  • Verzoeken die vóór uitrol zijn voorbereid, hebben geen __dispatch_input.
  • Operatorregel: zet DISPATCH_AGENT_OUTPUT_KEY niet. De broker weigert een startpermit met agent_token.

🤖 Generated with Claude Code

## Samenvatting M41 increment 1 (sprint S-2026-10-02-1, story ST-1614, taken T-1923…T-1926): maakt een `QUEUE_REVIEW` aan de servicekant sluitend. - **T2 — antwoord-id (G6).** `DispatchView` geeft `root_message_id` en `reply_message_id` terug (`requests.ts`, `lifecycle.ts`). De tool-beschrijvingen van `dispatch_review` en `dispatch_task` noemen `queue_wait_reply` op het root-id. - **T3 — leesbewijs (G1).** Een echte review kon nooit slagen: `completion.ts` eiste een `source_read` van de agent-gateway, en geen uitgerold kind heeft daar een token voor. - Nu schrijft `loadBoundSourceArtifact` (`GET /artifacts/:id` met pogingsbewijs) een `source_delivered`-event. Dat gebeurt alleen voor gepinde reviewdocumenten met kloppende hash, idempotent en binnen de vergrendelde pogingstransactie. - `assertReviewSourceReceipts` accepteert beide soorten bewijs, met dezelfde artefact- en pogingsbinding. - Het bewijst aflevering van exact die bytes aan deze poging, niet dat het model ze las. - Geen migratie nodig: `queue_dispatch_events.type` heeft geen CHECK. - **T4 — opdracht voor het kind (G2).** - Elk verzoek krijgt een servicebron `__dispatch_input`: de canonieke `DispatchInput`, met sha256 = `input_hash`. Hij staat in het ondertekende manifest en in de pogingscontext. - Queue-prompts verwijzen naar `/sources/<key>` in plaats van `/work`. - **T5 — codebase (G5).** `dispatch_review` accepteert optioneel `repository {product_id, base_sha}`. De prompts beschrijven de read-only checkout in `/work`. - `vendor/scrum4me-shared` → `b3d2b98` (scrum4me-shared#68), inclusief de parity-pin. ## Test Elke wijziging eerst rood, daarna groen. | Gate | Resultaat | |---|---| | `npm run typecheck` | groen | | `npm test` | 248 files, 2020 tests groen | | `scripts/run-dispatch-ci.mjs` (wegwerp-pg17, gepinde Scrum4Me-schemabron) | 27 files, 278 tests groen (`DISPATCH_CI_PASSED`; was 268) | De cross-repo contractgate in scrum4me-docker draait 9/9 groen tegen deze branch, met twee nieuwe `QUEUE_REVIEW`-gevallen die `SUCCEEDED`/`GO` halen. Tegen main faalt hij (`DISPATCH_INPUT_UNREADABLE`). ## Merge-volgorde Na scrum4me-shared#68; daarna s4m-queue, scrum4me-docker en Scrum4Me-docs. ## Open risico's (increment 2) - `snapshot` (task_implementation) zit niet in de payload van het kind. - Verzoeken die vóór uitrol zijn voorbereid, hebben geen `__dispatch_input`. - **Operatorregel:** zet `DISPATCH_AGENT_OUTPUT_KEY` niet. De broker weigert een startpermit met `agent_token`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
DispatchView carries root_message_id and reply_message_id (shared b3d2b98),
so a requester waits on the dispatch answer with queue_wait_reply on the
root id. Bumps vendor/scrum4me-shared to the M41 T1 commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Een gepind document dat de gebonden supervisor met zijn attempt-proof
downloadt (GET /artifacts/:id) schrijft één source_delivered-event
(actor attempt_supervisor, idempotent per attempt en key).
assertReviewSourceReceipts accepteert dat naast de gateway-source_read,
met dezelfde artifact- en attempt-binding. Servicebronnen leveren geen
bewijs op. Zonder dit eindigde elke echte review in
review_sources_unverified, omdat geen gedeployd kind een gateway-token heeft.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bronvoorbereiding slaat per request de canonieke DispatchInput op als
servicebron __dispatch_input (sha256 = input_hash, attempt_id NULL); een
afwijkende hash laat de voorbereiding falen (source_input_mismatch). De
bron staat in sources_prepared, dus ook in de attempt-context en het
ondertekende manifest, en de gebonden attempt kan hem downloaden zonder
leesbewijs. De queue-prompts noemen nu /sources/<key> en
/sources/__dispatch_input; /work is leeg tenzij er een checkout is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat(dispatch): dispatch_review met optionele repository (M41 T5)
All checks were successful
CI / Final merge attestation and immutable publication (pull_request) Has been skipped
CI / PR candidate (never published) (pull_request) Successful in 5m18s
8bd763352d
dispatch_review accepteert een optionele repository { product_id, base_sha }
(40 hex) en zet die in requirements naast runtime, access read en lege
environment_keys, zoals dispatch_task al deed. De reviewprompts zeggen dat
/work dan een read-only depth-1 checkout van base_sha is en dat elke claim
daartegen gecontroleerd en met path:line geciteerd wordt.

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

Verdict: APPROVED

Geen blocking findings gevonden.

  • Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
  • De wijziging bindt de canonieke dispatch-input als ondertekend bronartefact, houdt review-afleverbewijzen attempt-gebonden, projecteert root/reply-id's in de publieke view en valideert de optionele read-only repository-pin.
  • Gerichte integratie- en contracttests zijn toegevoegd voor deze paden.
## Verdict: APPROVED Geen blocking findings gevonden. - Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. - De wijziging bindt de canonieke dispatch-input als ondertekend bronartefact, houdt review-afleverbewijzen attempt-gebonden, projecteert root/reply-id's in de publieke view en valideert de optionele read-only repository-pin. - Gerichte integratie- en contracttests zijn toegevoegd voor deze paden.
Sign in to join this conversation.
No reviewers
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-mcp!175
No description provided.