refactor(queue): vocabulaire uit scrum4me-shared, source krijgt mcp #71

Merged
janpeter merged 2 commits from feat/queue-identity-shared into main 2026-07-25 22:02:41 +02:00
Owner

Derde van vijf PR's. Volgt op scrum4me-shared #40 (gemerged) en Scrum4Me #140 (open). Spec: scrum4me-mcp docs/superpowers/specs/2026-07-25-queue-identity-shared-module-design.md §6.2.

Waarom

lib/queue/types.ts droeg een handkopie van het queue-vocabulaire — de bestandsheader zei dat zelf. Sinds #40 in scrum4me-shared is er één gedeelde definitie; deze PR maakt workers daar consument van.

En hij repareert een echte drift: AgentMessage.source was 'cli' | 'dashboard' terwijl de gedeployde CHECK 'mcp' toestaat en fase 2 die waarde gaat schrijven.

Ontwerpdoel: nul call-sites wijzigen

lib/queue/types.ts re-exporteert het vocabulaire onder exact de namen die het al gebruikte. Alle zeven consumenten blijven ongemoeid — vijf in productiecode plus twee tests. De diff raakt precies twee paden: dit bestand en de submodule-pointer.

Het bestand blijft bestaan omdat het de workers-eigen vormen houdt (AgentMessage, NotifyEnvelope, CHANNEL, STALE_CLAIM_INTERVAL, retentie, validateTaskMeta). De re-export is dus geen extra laag maar één bestand met gemengde inhoud, waarvan de herkomst per export leesbaar is.

Reviewnotities

  • De drie-bloks-structuur is noodzakelijk, niet stilistisch. De reviewer testte beide samenvoegingen: de type-re-exports in het waarde-blok stoppen faalt met TS1205 onder isolatedModules, en het import type-blok weglaten faalt 14× met TS2304 — export type {…} from vult de lokale scope niet, terwijl AgentMessage en NotifyEnvelope die namen wél nodig hebben.
  • Volgorde blijft behouden. messages-view.tsx gebruikt SERVERS[1], MODELS[0] en REQUEST_TYPES[0] als useState-seeds; die leveren nog steeds 'scrum4me-server', 'claude' en 'task'.
  • De source-verbreding breekt geen exhaustiviteit. De enige lezer rendert de waarde als ReactNode; de schrijvers zetten 'dashboard' hardcoded in SQL-tekst.
  • @shared/queue-identity belandt nu in de client-bundle (types.ts wordt geïmporteerd door een 'use client'-component). Het is een pure constanten-module zonder node-imports, en zes bestaande client-componenten importeren al runtime-waarden uit @shared/*.
  • lib/queue/ops-db.ts heeft nog één SQL-literal status IN ('done','failed','cancelled'). Bewust ongemoeid: dat is SQL-tekst, geen TS-waarde.

Verificatie

Baseline vóór de wijziging en uitkomst erna zijn identiek: npm run typecheck exit 0, en 46 tests groen in de drie queue-testbestanden. De reviewer draaide daarnaast de volledige suite (113 bestanden, 777 tests groen) en een wegwerp-equivalentietest die oude en nieuwe module naast elkaar importeert: identieke array-inhoud en -volgorde, identieke replyTypeFor-uitkomst, identiek guard-gedrag over 18 probes.

ops-db-realdb.test.ts is niet gedraaid — die vraagt een database.

Na de merge

De header van scrum4me-shared/lib/queue-identity.ts beschrijft workers dan nog als handkopie. Die krijgt een kleine vervolg-PR samen met de pariteitsgate-tekst.

🤖 Generated with Claude Code

Derde van vijf PR's. Volgt op `scrum4me-shared` #40 (gemerged) en `Scrum4Me` #140 (open). Spec: `scrum4me-mcp` `docs/superpowers/specs/2026-07-25-queue-identity-shared-module-design.md` §6.2. ## Waarom `lib/queue/types.ts` droeg een handkopie van het queue-vocabulaire — de bestandsheader zei dat zelf. Sinds #40 in `scrum4me-shared` is er één gedeelde definitie; deze PR maakt workers daar consument van. En hij repareert een echte drift: `AgentMessage.source` was `'cli' | 'dashboard'` terwijl de gedeployde CHECK `'mcp'` toestaat en fase 2 die waarde gaat schrijven. ## Ontwerpdoel: nul call-sites wijzigen `lib/queue/types.ts` re-exporteert het vocabulaire onder exact de namen die het al gebruikte. Alle zeven consumenten blijven ongemoeid — vijf in productiecode plus twee tests. De diff raakt precies twee paden: dit bestand en de submodule-pointer. Het bestand blijft bestaan omdat het de workers-eigen vormen houdt (`AgentMessage`, `NotifyEnvelope`, `CHANNEL`, `STALE_CLAIM_INTERVAL`, retentie, `validateTaskMeta`). De re-export is dus geen extra laag maar één bestand met gemengde inhoud, waarvan de herkomst per export leesbaar is. ## Reviewnotities - **De drie-bloks-structuur is noodzakelijk, niet stilistisch.** De reviewer testte beide samenvoegingen: de type-re-exports in het waarde-blok stoppen faalt met TS1205 onder `isolatedModules`, en het `import type`-blok weglaten faalt 14× met TS2304 — `export type {…} from` vult de lokale scope niet, terwijl `AgentMessage` en `NotifyEnvelope` die namen wél nodig hebben. - **Volgorde blijft behouden.** `messages-view.tsx` gebruikt `SERVERS[1]`, `MODELS[0]` en `REQUEST_TYPES[0]` als `useState`-seeds; die leveren nog steeds `'scrum4me-server'`, `'claude'` en `'task'`. - **De `source`-verbreding breekt geen exhaustiviteit.** De enige lezer rendert de waarde als ReactNode; de schrijvers zetten `'dashboard'` hardcoded in SQL-tekst. - **`@shared/queue-identity` belandt nu in de client-bundle** (types.ts wordt geïmporteerd door een `'use client'`-component). Het is een pure constanten-module zonder node-imports, en zes bestaande client-componenten importeren al runtime-waarden uit `@shared/*`. - `lib/queue/ops-db.ts` heeft nog één SQL-literal `status IN ('done','failed','cancelled')`. Bewust ongemoeid: dat is SQL-tekst, geen TS-waarde. ## Verificatie Baseline vóór de wijziging en uitkomst erna zijn identiek: `npm run typecheck` exit 0, en 46 tests groen in de drie queue-testbestanden. De reviewer draaide daarnaast de volledige suite (113 bestanden, 777 tests groen) en een wegwerp-equivalentietest die oude en nieuwe module naast elkaar importeert: identieke array-inhoud en -volgorde, identieke `replyTypeFor`-uitkomst, identiek guard-gedrag over 18 probes. `ops-db-realdb.test.ts` is niet gedraaid — die vraagt een database. ## Na de merge De header van `scrum4me-shared/lib/queue-identity.ts` beschrijft workers dan nog als handkopie. Die krijgt een kleine vervolg-PR samen met de pariteitsgate-tekst. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
lib/queue/types.ts re-exporteert het adres- en statusvocabulaire onder zijn
bestaande namen, zodat de vijf importers ongewijzigd blijven. AgentMessage.source
was 'cli' | 'dashboard' terwijl de gedeployde CHECK 'mcp' toestaat en fase 2 die
waarde gaat schrijven; dat is nu QueueSource.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs(queue): corrigeer het aantal consumenten in de header
All checks were successful
CI / Verify (pull_request) Successful in 1m51s
0b25fffcca
Het comment zei vijf importers; het zijn er zeven. Naast de vijf in
productiecode importeert ook __tests__/app/queue-messages-view.test.tsx het
bestand, en __tests__/lib/queue/ops-db-retention.test.ts doet dat dynamisch.
Alle zeven blijven ongewijzigd -- het aantal klopte alleen niet.

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

Verdict: REQUEST_CHANGES

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

Findings

  • errorlib/queue/types.ts:83 / __tests__/lib/queue/fixtures/agent_message.sql:41: AgentMessage.source komt nu uit QueueSource, en de gebumpte shared module bevat QUEUE_SOURCES = ['cli', 'dashboard', 'mcp']. De workers realdb-fixture houdt de database-CHECK echter op ('cli','dashboard'). Daarmee is het nieuwe typecontract niet paritair met de DB-constraint die deze app test en documenteert; zodra een pad een mcp-bron leest/schrijft of een realdb-test dit gaat bewijzen, loopt dit uiteen. Neem de bijbehorende ops-migratie/fixture-update of een expliciete pariteitsbewaking mee in dezelfde wijziging.

Verificatie

  • Submodule-inhoud gecontroleerd: vendor/scrum4me-shared/lib/queue-identity.ts exporteert QUEUE_SOURCES inclusief mcp.
  • node node_modules/typescript/bin/tsc --noEmit geprobeerd; resultaat is niet bruikbaar voor deze PR door niet-gegenereerde Prisma-types in de tijdelijke checkout.
  • Gerichte Vitest-run geprobeerd; startte niet door Rollup optional-native loading in /tmp.
# Verdict: REQUEST_CHANGES Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - **error** — `lib/queue/types.ts:83` / `__tests__/lib/queue/fixtures/agent_message.sql:41`: `AgentMessage.source` komt nu uit `QueueSource`, en de gebumpte shared module bevat `QUEUE_SOURCES = ['cli', 'dashboard', 'mcp']`. De workers realdb-fixture houdt de database-CHECK echter op `('cli','dashboard')`. Daarmee is het nieuwe typecontract niet paritair met de DB-constraint die deze app test en documenteert; zodra een pad een `mcp`-bron leest/schrijft of een realdb-test dit gaat bewijzen, loopt dit uiteen. Neem de bijbehorende ops-migratie/fixture-update of een expliciete pariteitsbewaking mee in dezelfde wijziging. ## Verificatie - Submodule-inhoud gecontroleerd: `vendor/scrum4me-shared/lib/queue-identity.ts` exporteert `QUEUE_SOURCES` inclusief `mcp`. - `node node_modules/typescript/bin/tsc --noEmit` geprobeerd; resultaat is niet bruikbaar voor deze PR door niet-gegenereerde Prisma-types in de tijdelijke checkout. - Gerichte Vitest-run geprobeerd; startte niet door Rollup optional-native loading in `/tmp`.
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-workers!71
No description provided.