fix(mcp): resolve story/task/product by code or id in agent tools #22

Merged
janpeter merged 3 commits from fix/mcp-resolve-code-or-id into main 2026-05-28 15:08:40 +02:00
Owner

Probleem

~30 mcp__scrum4me__* fouten waren "Story/Task/Product X not found or not accessible". De agent gaf human codes (ST-1427, T-1219), een product-naam (scrum4me), of een verkeerd-entity/stale id — maar de tools resolveden alleen op CUID id (access.tsfindUnique({where:{id}})), dus codes faalden altijd. De foutmelding was niet-corrigerend, waardoor de agent bleef retryen.

Fix

Nieuwe src/lib/resolve-entity.ts met resolveStoryRef / resolveTaskRef / resolveProductRef:

  • probeert eerst id, dan codegescoped op de toegankelijke producten van de user (codes zijn @@unique([product_id, code]));
  • ambiguïteit → duidelijke error (vraag CUID);
  • cross-entity hint: een task-code in een story-veld geeft "'T-1219' is a task code, not a story…" (en vice versa);
  • not-found error vertelt welk identifier-formaat verwacht wordt.

6 tools omgebouwd om de resolver te gebruiken en de resolved id overal te gebruiken: log_implementation, log_commit, log_test_result (story), verify_task_against_plan, update_task_status (task), get_claude_context (product). Toegangscontrole blijft identiek (zelfde OR:[user, members]-scope).

Test

  • __tests__/lib/resolve-entity.test.ts: 9 tests (id-hit, code-hit, ambigu, cross-entity hint, not-found; story + task + product).
  • Volledige suite: 549 tests groen. tsc --noEmit clean.
## Probleem ~30 `mcp__scrum4me__*` fouten waren `"Story/Task/Product X not found or not accessible"`. De agent gaf human **codes** (`ST-1427`, `T-1219`), een product-**naam** (`scrum4me`), of een verkeerd-entity/stale id — maar de tools resolveden **alleen op CUID `id`** (`access.ts` → `findUnique({where:{id}})`), dus codes faalden altijd. De foutmelding was niet-corrigerend, waardoor de agent bleef retryen. ## Fix Nieuwe `src/lib/resolve-entity.ts` met `resolveStoryRef` / `resolveTaskRef` / `resolveProductRef`: - probeert eerst `id`, dan `code` — **gescoped op de toegankelijke producten** van de user (codes zijn `@@unique([product_id, code])`); - ambiguïteit → duidelijke error (vraag CUID); - **cross-entity hint**: een task-code in een story-veld geeft `"'T-1219' is a task code, not a story…"` (en vice versa); - not-found error vertelt welk identifier-formaat verwacht wordt. 6 tools omgebouwd om de resolver te gebruiken en de resolved id overal te gebruiken: `log_implementation`, `log_commit`, `log_test_result` (story), `verify_task_against_plan`, `update_task_status` (task), `get_claude_context` (product). Toegangscontrole blijft identiek (zelfde `OR:[user, members]`-scope). ## Test - `__tests__/lib/resolve-entity.test.ts`: 9 tests (id-hit, code-hit, ambigu, cross-entity hint, not-found; story + task + product). - Volledige suite: 549 tests groen. `tsc --noEmit` clean.
Adds resolveStoryRef, resolveTaskRef, resolveProductRef that each try
id first, then code scoped to accessible products, with a disambiguating
error and a cross-entity hint (e.g. task code passed to story tool).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace userCanAccessStory/userCanAccessTask boolean checks with
resolveStoryRef/resolveTaskRef/resolveProductRef in log-implementation,
log-commit, log-test-result, verify-task-against-plan, update-task-status,
and get-claude-context. Agents can now pass codes (ST-1427, T-1219),
a product name/code, or CUIDs; a disambiguating error is returned when
the code belongs to a different entity type.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
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!22
No description provided.