docs: M12 backlog entry + mcp-integration runbook for idea-jobs (M12 T-517)

docs/backlog/index.md:
- New M12 row in milestone-overview
- Full M12 section with 10 stories (8 done, ST-1197 extern + ST-1201 in
  progress); each story lists its task IDs

docs/runbooks/mcp-integration.md:
- wait_for_job payload contract documented per kind discriminator
  (TASK_IMPLEMENTATION vs IDEA_GRILL vs IDEA_MAKE_PLAN)
- Per-kind agent behavior table
- 5 new MCP-tools documented: get_idea_context, update_idea_grill_md,
  update_idea_plan_md, log_idea_decision; plus extended ask_user_question
  contract (story_id|idea_id xor)
- Batch-loop step 2 expanded to switch on kind

docs/INDEX.md auto-regenerated (83 docs).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Janpeter Visser 2026-05-04 21:45:54 +02:00
parent 6721003572
commit 7269e9732d
2 changed files with 67 additions and 3 deletions

View file

@ -36,6 +36,7 @@ De MVP is klaar wanneer Lars — de primaire persona — de volledige cyclus kan
| M9: Actief Product Backlog | Persistente actieve PB-keuze, gesplitste navigatie, disabled-states | ST-901 ST-907 |
| M10: Password-loze inlog via QR-pairing | Mobiel als bevestigingskanaal voor desktop-login zonder wachtwoord | ST-1001 ST-1008 |
| M11: Claude vraagt, gebruiker antwoordt | Persistent vraag-antwoord-kanaal tussen Claude (MCP) en de actieve gebruiker | ST-1101 ST-1108 |
| M12: Ideeën & Grill/Plan jobs | Idee-entity tussen Todo en PBI; interactief grillen + deterministisch materialiseren | ST-1192 ST-1201 |
---
## Backlog
@ -755,6 +756,49 @@ Persistent vraag-antwoord-kanaal tussen Claude Code (via MCP) en de actieve Scru
---
### M12: Ideeën & Grill/Plan jobs
**Implementatieplan:** [docs/plans/M12-ideas.md](../plans/M12-ideas.md)
**Dialog-profiel:** [docs/specs/dialogs/idea.md](../specs/dialogs/idea.md)
Idee is een nieuw concept tussen Todo en PBI. Strikt user_id-only (privé), met
twee Claude-jobs: **Grill Me** (interactief vragen-stellen via MCP) en **Make
Plan** (single-pass yaml-frontmatter genereren). De **Materialiseer**-knop
parseert het plan deterministisch en creëert PBI + stories + taken.
- [x] **ST-1192** — DB-schema & migratie voor Idea (T-491, T-492, T-489)
- Idea-model + IdeaLog-model + 3 enums; ClaudeJob.task_id nullable + idea_id +
kind; ClaudeQuestion.story_id nullable + idea_id; check-constraints +
pg_notify-trigger update
- [x] **ST-1193** — Lib + schemas + embedded prompts (T-493, T-494, T-495)
- zod-schemas, status-mapper + transition-guard, atomic code-generator,
yaml-frontmatter parser, embedded grill+make-plan prompts
- [x] **ST-1194** — Server actions + Todo→Idea promotie (T-496..T-499)
- CRUD, md-edit, job-triggers, materialize, relink, promoteTodoToIdeaAction
- [x] **ST-1195** — REST API + proxy demo-laag (T-500, T-501)
- /api/ideas + /api/ideas/[id]; demo-403 via proxy.ts catch-all
- [x] **ST-1196** — Realtime SSE + idea-store (T-502, T-503)
- SSE-routing voor idea-events; Zustand idea-store; extension van bestaande
notifications-realtime hook
- [ ] **ST-1197** — MCP-server tools (extern: madhura68/scrum4me-mcp)
- get_idea_context, update_idea_grill_md, update_idea_plan_md, log_idea_decision;
uitbreiding ask_user_question/wait_for_job/update_job_status; Docker rebuild
- [x] **ST-1198** — UI lijstpagina + row-actions (T-507, T-508, T-509)
- /ideas pagina, IdeaList tabel met filters, IdeaRowActions met
disabled-rules per status, idea-status-badge helper
- [x] **ST-1199** — UI detail + dialog + tabs (T-510..T-513)
- /ideas/[id] met 4 tabs (Idee/Grill/Plan/Timeline); md-editor met
yaml-validate; timeline met UNION view; pbi-link-card; dialog-profiel doc
- [x] **ST-1200** — Promote-from-Todo + sidebar (T-514, T-515)
- "→ Idee" knop in TodoCard, PromoteIdeaDialog, "Ideeën" nav-entry
- [ ] **ST-1201** — End-to-end smoke + docs-update (T-516, T-517)
- Volledige flow doorlopen volgens M12-ideas.md verificatie-script;
docs/runbooks/mcp-integration.md uitbreiden voor IDEA_*-job-kinds
- Done when: docs/INDEX.md opnieuw gegenereerd, alle stories ✓, MCP-server
PR met passende versie-bump gedeployed
---
## v2 Backlog (na MVP)
- [ ] Uitnodigingsflow voor teams — e-mailuitnodiging of link-gebaseerd; nu kunnen alleen admins met toegang tot het systeem Developers toevoegen via gebruikersnaam

View file

@ -35,15 +35,35 @@ Scrum4Me heeft een eigen MCP-server in repo [`madhura68/scrum4me-mcp`](https://g
- `mcp__scrum4me__cancel_question` — asker-only annulering van een eigen open vraag
**Job queue — agent worker mode (M13):**
- `mcp__scrum4me__wait_for_job` — blokkeert ≤600s, claimt atomisch een QUEUED-job via FOR UPDATE SKIP LOCKED; retourneert volledige task-context (implementation_plan, story, pbi, sprint, repo_url). Zet stale CLAIMED-jobs (>30min) eerst terug naar QUEUED. Wanneer de full block-time verstrijkt zonder claim is de queue leeg.
- `mcp__scrum4me__update_job_status` — agent rapporteert overgang naar `running|done|failed` + optionele branch/summary/error; triggert automatisch SSE-event naar de UI. Auth: Bearer-token moet matchen `claimed_by_token_id`.
- `mcp__scrum4me__wait_for_job` — blokkeert ≤600s, claimt atomisch een QUEUED-job via FOR UPDATE SKIP LOCKED. **Sinds M12** retourneert de payload een `kind`-discriminator:
- `kind: 'TASK_IMPLEMENTATION'` (default) — payload met `implementation_plan`, `story`, `pbi`, `sprint`, `repo_url`
- `kind: 'IDEA_GRILL'` of `'IDEA_MAKE_PLAN'` — payload met `idea`, `product`, `repo_url`, en `prompt_text` (de embedded prompt uit `lib/idea-prompts/`)
Stale CLAIMED-jobs (>30min) worden eerst terug naar QUEUED gezet. Lege queue na block-time = klaar.
- `mcp__scrum4me__update_job_status` — agent rapporteert `running|done|failed` + optionele branch/summary/error; triggert automatisch SSE-event. Bij `failed` voor `IDEA_GRILL`/`IDEA_MAKE_PLAN` wordt de idea-status automatisch op `GRILL_FAILED` resp. `PLAN_FAILED` gezet. Auth: Bearer-token moet matchen `claimed_by_token_id`.
**Idea-jobs (M12) — agent gedrag per kind:**
| Kind | Werkwijze | Eind-call |
|---|---|---|
| `IDEA_GRILL` | Lees `prompt_text` (embedded grill-prompt) + `idea.grill_md` als startpunt; itereer met `ask_user_question(idea_id=...)`/`get_question_answer`; log onderweg `log_idea_decision`; eindig met `update_idea_grill_md(markdown)` | `update_job_status('done')` |
| `IDEA_MAKE_PLAN` | Lees `prompt_text` (embedded make-plan-prompt) + `idea.grill_md` + repo-context. **Stel GEEN vragen** — single-pass output. Bouw plan in strict yaml-frontmatter format en eindig met `update_idea_plan_md(markdown)`. Server-side parser kan parse-fail → `PLAN_FAILED` | `update_job_status('done')` |
**MCP-tools — Idea-laag (M12):**
- `mcp__scrum4me__get_idea_context(idea_id)``{ idea, product, repo_url, grill_md_so_far, open_questions, prompt_text }`
- `mcp__scrum4me__update_idea_grill_md(idea_id, markdown)` — schrijft veld; status → `GRILLED`; logt `IdeaLog{GRILL_RESULT}`
- `mcp__scrum4me__update_idea_plan_md(idea_id, markdown)` — server-side `parsePlanMd`; ok → `PLAN_READY` + `IdeaLog{PLAN_RESULT}`; parse-fail → `PLAN_FAILED` + `IdeaLog{JOB_EVENT, errors}`
- `mcp__scrum4me__log_idea_decision(idea_id, type, content, metadata?)``type ∈ {DECISION, NOTE}`
- `mcp__scrum4me__ask_user_question` — geüpgrade contract: exact één van `story_id` óf `idea_id` (xor); idea-vragen zijn user-private (geen productAccessFilter).
## Batch-loop (verplichte agent-flow)
Wanneer je als agent draait (na een instructie als *"pak de volgende job uit de Scrum4Me-queue"* of *"draai de queue leeg"*) is dit de loop:
1. `wait_for_job` aanroepen.
2. Job uitvoeren volgens het meegegeven `implementation_plan`.
2. Switch op `kind`:
- `TASK_IMPLEMENTATION`: voer uit volgens het meegegeven `implementation_plan` (zoals altijd — branch, code, commit, push, verify_task_against_plan).
- `IDEA_GRILL`: laad `prompt_text` als gids; gebruik `ask_user_question` / `get_question_answer` voor de Q&A-loop; eindig met `update_idea_grill_md`.
- `IDEA_MAKE_PLAN`: laad `prompt_text` + `idea.grill_md`; **stel geen vragen**; produceer strict yaml-frontmatter; eindig met `update_idea_plan_md`.
3. `update_job_status('done'|'failed')` aanroepen.
4. **Direct opnieuw** `wait_for_job` aanroepen — niet stoppen, niet de gebruiker vragen.
5. Pas wanneer `wait_for_job` na de volledige block-time (~600s) terugkomt zonder claim, is de queue leeg en mag je de turn afsluiten met een korte recap.