feat(queue): Messages en Jobs gekoppeld bij automatische dispatch (M41 G8) #118

Merged
janpeter merged 5 commits from feat/m41-g8-screen-links into main 2026-10-02 20:22:16 +02:00
Owner

Waarom

M41 increment 4, gat G8: de schermen Messages en Jobs bij automatische dispatch aan elkaar koppelen. De eerste echte review via de pilot op scrum4me-server is geslaagd (verzoek 370745c2-…, NO-GO); dit maakt hem in de UI volgbaar.

Wat

  • G8a (3f44b53): het job-id in de dispatchstatus van Messages linkt naar /jobs?job=<id>.
  • G8b, Messages (70ba58c, 62ba892):
    • /queue/messages?message=<uuid> en ?dispatch=<verzoek-id> openen het bericht, uitgeklapt en in beeld.
    • Zit het bericht niet bij de 100 nieuwste, dan wordt het per id opgehaald, eerst uit de hot-tabel en dan uit het archief. Lukt dat niet: "niet beschikbaar".
  • G8b, Jobs:
    • Het jobdetail toont een Dispatch-rij met het verzoek-id en "Open in Messages" (?dispatch=).
    • Het rootbericht wordt opgezocht via agent_message.dispatch_request_id met in_reply_to IS NULL. scrum4me_web_runtime mag queue_dispatch_requests niet lezen, daarom geen read daarop.
  • G8c (0b635f9):
    • getArtifact(id) in de dispatch-client: gesigneerd, X-Content-SHA256 verplicht, maximaal 32 MiB, hash-mismatch geweigerd.
    • Route GET /api/queue/dispatch/artifacts/[id] (admin, uuid, attachment, no-store, nosniff).
    • Nog geen knop "Rapport downloaden": het id van het rapportartefact bereikt workers niet (niet in DispatchView of meta.result). Het rapport staat wel volledig als body in het reviewed-antwoord.
  • G8d (822b849): listDispatchOptions haalt antwoordadressen via de nieuwe service-route GET /dispatch/v1/reply-addresses (scrum4me-mcp) in plaats van met Prisma. Faalt de service, dan geeft hij configured:false terug, zonder terugval op de database.

Bewijs

  • Elke wijziging test-first; de nieuwe tests zijn eerst rood gezien. Eén uitzondering: de aanpassing in jobs-page.test.ts was al groen.
  • npm run verify geeft exit 0: 166 bestanden en 1406 tests groen, 18 overgeslagen, lint 0 errors. De ene warning (taskCode in job-card.tsx) bestond al.
  • De ?dispatch-query is read-only uitgevoerd als scrum4me_web_runtime op de productiedatabase en vindt root 4eb24990-….

Uitrol (na merge, samen met scrum4me-mcp)

  • S4M_DISPATCH_URL=http://172.18.0.1:4319 en DISPATCH_WORKERS_ASSERTION_KEY in workers.env; dezelfde sleutel in de service-env.
  • Daarna de flow update_scrum4me_workers.

Story ST-1617, taak T-1954.

🤖 Generated with Claude Code

## Waarom M41 increment 4, gat G8: de schermen Messages en Jobs bij automatische dispatch aan elkaar koppelen. De eerste echte review via de pilot op scrum4me-server is geslaagd (verzoek `370745c2-…`, NO-GO); dit maakt hem in de UI volgbaar. ## Wat - **G8a** (`3f44b53`): het job-id in de dispatchstatus van Messages linkt naar `/jobs?job=<id>`. - **G8b, Messages** (`70ba58c`, `62ba892`): - `/queue/messages?message=<uuid>` en `?dispatch=<verzoek-id>` openen het bericht, uitgeklapt en in beeld. - Zit het bericht niet bij de 100 nieuwste, dan wordt het per id opgehaald, eerst uit de hot-tabel en dan uit het archief. Lukt dat niet: "niet beschikbaar". - **G8b, Jobs:** - Het jobdetail toont een Dispatch-rij met het verzoek-id en "Open in Messages" (`?dispatch=`). - Het rootbericht wordt opgezocht via `agent_message.dispatch_request_id` met `in_reply_to IS NULL`. `scrum4me_web_runtime` mag `queue_dispatch_requests` niet lezen, daarom geen read daarop. - **G8c** (`0b635f9`): - `getArtifact(id)` in de dispatch-client: gesigneerd, `X-Content-SHA256` verplicht, maximaal 32 MiB, hash-mismatch geweigerd. - Route `GET /api/queue/dispatch/artifacts/[id]` (admin, uuid, attachment, `no-store`, `nosniff`). - **Nog geen knop "Rapport downloaden":** het id van het rapportartefact bereikt workers niet (niet in `DispatchView` of `meta.result`). Het rapport staat wel volledig als body in het `reviewed`-antwoord. - **G8d** (`822b849`): `listDispatchOptions` haalt antwoordadressen via de nieuwe service-route `GET /dispatch/v1/reply-addresses` (scrum4me-mcp) in plaats van met Prisma. Faalt de service, dan geeft hij `configured:false` terug, zonder terugval op de database. ## Bewijs - Elke wijziging test-first; de nieuwe tests zijn eerst rood gezien. Eén uitzondering: de aanpassing in `jobs-page.test.ts` was al groen. - `npm run verify` geeft exit 0: 166 bestanden en 1406 tests groen, 18 overgeslagen, lint 0 errors. De ene warning (`taskCode` in `job-card.tsx`) bestond al. - De `?dispatch`-query is read-only uitgevoerd als `scrum4me_web_runtime` op de productiedatabase en vindt root `4eb24990-…`. ## Uitrol (na merge, samen met scrum4me-mcp) - `S4M_DISPATCH_URL=http://172.18.0.1:4319` en `DISPATCH_WORKERS_ASSERTION_KEY` in `workers.env`; dezelfde sleutel in de service-env. - Daarna de flow `update_scrum4me_workers`. Story ST-1617, taak T-1954. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Route GET /api/queue/dispatch/artifacts/[id] en client-methode getArtifact (max 32 MiB, sha256 tegen X-Content-SHA256). Nog geen UI-link: het report-artefact-id bereikt workers niet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat(queue): Jobs linkt via verzoek-id naar Messages (M41 G8b)
All checks were successful
CI / Verify (pull_request) Successful in 2m14s
62ba892b8c
De runtime-rol mag queue_dispatch_requests niet lezen. Jobs houdt alleen dispatchRequestId (claude_jobs.dispatch_request_id); de Messages-pagina zoekt het root-bericht via ?dispatch=<verzoek-id> in de queue-DB (hot, dan cold-store).

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

APPROVED

  • Geen blokkerende findings aangetroffen.
  • Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
  • De wijzigingen houden de dispatch-service als autoriteit voor reply-adressen, valideren/verifiëren artifact-bytes vóór verzending, en dekken de nieuwe Jobs/Messages-deeplinks met gerichte tests.
## APPROVED - Geen blokkerende findings aangetroffen. - Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. - De wijzigingen houden de dispatch-service als autoriteit voor reply-adressen, valideren/verifiëren artifact-bytes vóór verzending, en dekken de nieuwe Jobs/Messages-deeplinks met gerichte tests.
Sign in to join this conversation.
No reviewers
No labels
severity/s4
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-workers!118
No description provided.