fix(mcp): merge ProductDoc title/status into plan frontmatter #23

Merged
janpeter merged 2 commits from fix/mcp-plan-frontmatter into main 2026-05-28 15:09:19 +02:00
Owner

Probleem

update_idea_plan_md faalde 15× met Cannot save plan as ProductDoc: content_md is niet parseerbaar (grootste enkele fout-bucket). De tool slaat het plan op als ProductDoc, maar de plan-markdown heeft zijn eigen frontmatter (plan-yaml: pbi/stories) die de ProductDoc-vereiste title/status mist → productDocFrontmatterSchema weigert 'm. ensureProductDocFrontmatter injecteerde alleen frontmatter als die helemaal ontbrak, dus hielp niet bij een bestaand (plan-)frontmatter-blok.

Fix

ensureProductDocFrontmatter is nu merge-aware: het parset het bestaande frontmatter-blok (yaml), injecteert title (uit idea.title) en status: draft alléén wanneer ze ontbreken/ongeldig zijn, en serialiseert terug — bestaande plan-keys (pbi/stories) blijven behouden (productDocFrontmatterSchema is non-strict). Robuust gemaakt tegen niet-object frontmatter (scalar/array → valt terug op injectie); malformed YAML wordt ongemoeid doorgegeven zodat de downstream-parser de precieze fout teruggeeft.

Daarnaast: bij een ProductDocWriteError worden nu de concrete parse-details aan de agent teruggegeven (geen vaag "niet parseerbaar" meer), zodat hij zich kan corrigeren.

Test

__tests__/update-idea-plan-frontmatter.test.ts: 8 tests — inject-when-absent, merge-into-existing (keys behouden), leave-valid-untouched, whitespace-title, invalid-status, non-object (scalar+array), idempotency. tsc --noEmit clean.

## Probleem `update_idea_plan_md` faalde 15× met `Cannot save plan as ProductDoc: content_md is niet parseerbaar` (grootste enkele fout-bucket). De tool slaat het plan op als ProductDoc, maar de plan-markdown heeft zijn **eigen** frontmatter (plan-yaml: `pbi`/`stories`) die de ProductDoc-vereiste `title`/`status` mist → `productDocFrontmatterSchema` weigert 'm. `ensureProductDocFrontmatter` injecteerde alleen frontmatter als die **helemaal** ontbrak, dus hielp niet bij een bestaand (plan-)frontmatter-blok. ## Fix `ensureProductDocFrontmatter` is nu **merge-aware**: het parset het bestaande frontmatter-blok (`yaml`), injecteert `title` (uit `idea.title`) en `status: draft` alléén wanneer ze ontbreken/ongeldig zijn, en serialiseert terug — bestaande plan-keys (`pbi`/`stories`) blijven behouden (`productDocFrontmatterSchema` is non-strict). Robuust gemaakt tegen niet-object frontmatter (scalar/array → valt terug op injectie); malformed YAML wordt ongemoeid doorgegeven zodat de downstream-parser de precieze fout teruggeeft. Daarnaast: bij een `ProductDocWriteError` worden nu de concrete parse-`details` aan de agent teruggegeven (geen vaag "niet parseerbaar" meer), zodat hij zich kan corrigeren. ## Test `__tests__/update-idea-plan-frontmatter.test.ts`: 8 tests — inject-when-absent, merge-into-existing (keys behouden), leave-valid-untouched, whitespace-title, invalid-status, non-object (scalar+array), idempotency. `tsc --noEmit` clean.
Fixes the top error bucket (15 failures): plan markdown ships its own
frontmatter (pbi/stories) that lacked ProductDoc's required title/status.
The updated ensureProductDocFrontmatter now merges title+status into existing
frontmatter instead of only injecting when frontmatter is entirely absent.
Also surfaces err.details in the ProductDocWriteError catch branch.

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!23
No description provided.