diff --git a/docs/backlog/index.md b/docs/backlog/index.md index 3891334..fb72de7 100644 --- a/docs/backlog/index.md +++ b/docs/backlog/index.md @@ -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 diff --git a/docs/runbooks/mcp-integration.md b/docs/runbooks/mcp-integration.md index bacc288..05bf489 100644 --- a/docs/runbooks/mcp-integration.md +++ b/docs/runbooks/mcp-integration.md @@ -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.