feat(queue): gedeeld adres- en statusvocabulaire van de s4m-queue #40

Merged
janpeter merged 3 commits from feat/queue-identity-shared into main 2026-07-25 20:42:21 +02:00
Owner

Eerste van vijf PR's. Spec: scrum4me-mcp docs/superpowers/specs/2026-07-25-queue-identity-shared-module-design.md (nog op branch claude/s4m-queue-chat-search-244a7c).

Waarom

Het vocabulaire van agent_message stond met de hand gekopieerd in s4m-queue/src/types.ts en scrum4me-workers/lib/queue/types.ts, en het fase-2-plan van scrum4me-mcp voegde een derde kopie toe. De kopieen waren al gedivergeerd: beide typeren source als 'cli' | 'dashboard' terwijl de gedeployde CHECK 'mcp' toestaat en fase 2 die waarde gaat schrijven.

Aanleiding is Kimi als derde AI-platform: bij vier kopieen wordt handmatig bijhouden onhoudbaar.

Wat hier in zit

lib/queue-identity.ts (57 regels, nul imports) plus zes tests. Alleen de gesloten woordenlijsten en de triviale guards. validateTaskMeta, AgentMessage en CHANNEL blijven bewust in de consumers.

s4m-queue wordt geen consument: die repo bouwt met kale tsc naar dist/ en draagt geen submodule. Hij houdt een bewuste tweelingkopie, met een header die dat vastlegt (PR 5).

Reviewnotities

  • De reply-mapping is exact gepind. Een code-review vond dat een verwisseling van task: 'result' en info: 'data' door alle tests en door de DDL glipt: de type-CHECK accepteert alle zes waarden en reply_link_matches_type vraagt alleen of het een antwoord-type is. Een reply op een task zou dan blijvend als antwoord-op-een-info worden opgeslagen. Mutatietest bevestigt: tsc laat dit schoon door, alleen de test vangt het.
  • De header zegt expliciet dat er nog geen pariteitsgate is. Die komt in PR 2 (Scrum4Me), die de CHECK-lijsten uit migration.sql tegen dit bestand toetst. Tot die tijd bewaakt geen test de overeenkomst met de DDL.
  • Mutatiescore: 17 mutaties, 10 gevangen. De zeven overlevers zijn lidmaatschapsinhoud van kolommen zonder CHECK (servers/modellen) of juist het geval dat PR 2 gaat afdekken (source/status).

Verificatie

npm run verify groen: dep-gate OK: lib/ is dep-clean, tsc --noEmit schoon, 22 testbestanden / 237 tests.

Na de merge

Drie repos pinnen op de nieuwe main-SHA: Scrum4Me (pariteitstest), scrum4me-workers (re-exports + source-fix), scrum4me-mcp (fase-2-plan). Die volgorde staat in het plan; PR 2 gaat eerst omdat die bewijst dat het vocabulaire klopt.

🤖 Generated with Claude Code

Eerste van vijf PR's. Spec: `scrum4me-mcp` `docs/superpowers/specs/2026-07-25-queue-identity-shared-module-design.md` (nog op branch `claude/s4m-queue-chat-search-244a7c`). ## Waarom Het vocabulaire van `agent_message` stond met de hand gekopieerd in `s4m-queue/src/types.ts` en `scrum4me-workers/lib/queue/types.ts`, en het fase-2-plan van `scrum4me-mcp` voegde een derde kopie toe. De kopieen waren al gedivergeerd: beide typeren `source` als `'cli' | 'dashboard'` terwijl de gedeployde CHECK `'mcp'` toestaat en fase 2 die waarde gaat schrijven. Aanleiding is Kimi als derde AI-platform: bij vier kopieen wordt handmatig bijhouden onhoudbaar. ## Wat hier in zit `lib/queue-identity.ts` (57 regels, nul imports) plus zes tests. Alleen de gesloten woordenlijsten en de triviale guards. `validateTaskMeta`, `AgentMessage` en `CHANNEL` blijven bewust in de consumers. `s4m-queue` wordt geen consument: die repo bouwt met kale `tsc` naar `dist/` en draagt geen submodule. Hij houdt een bewuste tweelingkopie, met een header die dat vastlegt (PR 5). ## Reviewnotities - **De reply-mapping is exact gepind.** Een code-review vond dat een verwisseling van `task: 'result'` en `info: 'data'` door alle tests en door de DDL glipt: de `type`-CHECK accepteert alle zes waarden en `reply_link_matches_type` vraagt alleen of het een antwoord-type is. Een reply op een task zou dan blijvend als antwoord-op-een-info worden opgeslagen. Mutatietest bevestigt: `tsc` laat dit schoon door, alleen de test vangt het. - **De header zegt expliciet dat er nog geen pariteitsgate is.** Die komt in PR 2 (Scrum4Me), die de CHECK-lijsten uit `migration.sql` tegen dit bestand toetst. Tot die tijd bewaakt geen test de overeenkomst met de DDL. - **Mutatiescore:** 17 mutaties, 10 gevangen. De zeven overlevers zijn lidmaatschapsinhoud van kolommen zonder CHECK (servers/modellen) of juist het geval dat PR 2 gaat afdekken (source/status). ## Verificatie `npm run verify` groen: dep-gate `OK: lib/ is dep-clean`, `tsc --noEmit` schoon, 22 testbestanden / 237 tests. ## Na de merge Drie repos pinnen op de nieuwe main-SHA: Scrum4Me (pariteitstest), scrum4me-workers (re-exports + `source`-fix), scrum4me-mcp (fase-2-plan). Die volgorde staat in het plan; PR 2 gaat eerst omdat die bewijst dat het vocabulaire klopt. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
De woordenlijsten van agent_message stonden met de hand gekopieerd in
s4m-queue en scrum4me-workers, en het fase-2-plan van scrum4me-mcp voegde
een derde kopie toe. Deze module wordt de bron voor de twee repos die een
submodule dragen; de CLI houdt een bewuste, gedocumenteerde tweelingkopie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Code-review vond dat een verwisseling in QUEUE_REPLY_TYPE door alle zes tests
en door de DDL heen glipt: de type-CHECK accepteert elke waarde en
reply_link_matches_type vraagt alleen of het een antwoord-type is. De mapping
is de enige niet-afleidbare afspraak hier en staat nu gepind.

Verder: de header beweerde dat een pariteitstest in Scrum4Me dit bestand
bewaakt — die wordt pas later gebouwd. QUEUE_TERMINAL_STATUSES en
QUEUE_REPLY_TYPE gebruiken nu `as const satisfies` (smal element-type plus
onveranderlijkheid), en QUEUE_MESSAGE_TYPES vult de lijst aan die bij het al
bestaande QueueMessageType hoorde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs(queue): corrigeer spec-pad en scherp de gate-nuance aan
All checks were successful
CI / Verify (pull_request) Successful in 18s
39e307cc1f
Review-nits: het spec-pad miste een slash, 'drie plekken' was dubbelzinnig, en
de header liet weg dat type en status nog wél een indirect net hebben (hun
CHECK weigert een onbekende waarde bij de INSERT) terwijl source dat niet
heeft — schrijvers zetten daar een hardcoded literal neer, dus een ontbrekend
lid wordt nooit uitgeprobeerd. Dat is precies waarom de drift in source zat.

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

Verdict: COMMENT

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

  • warninglib/queue-identity.ts:64 — De toelichting bij QUEUE_REPLY_TYPE zegt dat as const satisfies voorkomt dat properties schrijfbaar zijn en noemt runtime-risico in een langlopend serverproces. In de uitgevoerde JavaScript blijft het object echter gewoon muteerbaar; as const beschermt alleen de TypeScript-typekant. Als runtime-mutatie hier echt een risico is, gebruik Object.freeze(...) of pas de comment aan zodat die geen runtime-garantie suggereert.

Samenvatting

De nieuwe module is pure TypeScript, introduceert geen verboden runtime-dependencies en sluit inhoudelijk aan bij de productdocs voor scrum4me-shared als canonieke bron voor gedeelde status-/vocabulairelogica. De toegevoegde tests pinnen de belangrijkste mappings en guards. Geen blokkerende findings gevonden.

# Verdict: COMMENT Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - **warning** — `lib/queue-identity.ts:64` — De toelichting bij `QUEUE_REPLY_TYPE` zegt dat `as const satisfies` voorkomt dat properties schrijfbaar zijn en noemt runtime-risico in een langlopend serverproces. In de uitgevoerde JavaScript blijft het object echter gewoon muteerbaar; `as const` beschermt alleen de TypeScript-typekant. Als runtime-mutatie hier echt een risico is, gebruik `Object.freeze(...)` of pas de comment aan zodat die geen runtime-garantie suggereert. ## Samenvatting De nieuwe module is pure TypeScript, introduceert geen verboden runtime-dependencies en sluit inhoudelijk aan bij de productdocs voor `scrum4me-shared` als canonieke bron voor gedeelde status-/vocabulairelogica. De toegevoegde tests pinnen de belangrijkste mappings en guards. Geen blokkerende findings gevonden.
Sign in to join this conversation.
No reviewers
No labels
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-shared!40
No description provided.