From ae017b86447707907eb6a39f9d952cb759eebb8f Mon Sep 17 00:00:00 2001 From: Madhura68 Date: Sat, 9 May 2026 11:55:27 +0200 Subject: [PATCH] fix(prompts): idea-prompts gebruiken $PAYLOAD_PATH ipv onvervangen placeholders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Symptoom: IDEA_GRILL en IDEA_MAKE_PLAN jobs hingen 11+ minuten zonder update_job_status aan te roepen. Claude zag in de prompt: - "Je bent een grill-agent voor Scrum4Me-idee {idea_code}" — letterlijke string omdat run-one-job.ts alleen $PAYLOAD_PATH substitueert, geen {idea_*}-vars. - "context (meegegeven in wait_for_job-payload)" — maar Claude krijgt geen wait_for_job-respons, want die tool zit niet meer in allowed_tools voor idea-kinds (de runner claimt al). - Geen instructie om $PAYLOAD_PATH te lezen — de placeholder ontbrak in beide idea-prompts (alleen task/sprint/plan-chat hadden 'm). Resultaat: Claude wist niet wat het te doen had, kon geen idea_id of job_id achterhalen, en draaide tot de natuurlijke session-cap zonder ooit de juiste tools aan te roepen. Fix: - grill.md en make-plan.md: vervang `wait_for_job`-references door `scrum4me-docker/bin/run-one-job.ts` (de daadwerkelijke runner). - Beide prompts beginnen nu met "Lees $PAYLOAD_PATH met de Read-tool" als verplichte eerste actie. Lijst van velden die uit de payload moeten worden bewaard (idea.id, idea.code, job_id, product.id, etc.). - {idea_code} / {idea_title} placeholders verwijderd — alle benodigde velden komen uit de payload, geen runner-side substitution meer nodig. - Update_job_status-stap expliciet als "verplicht, ook bij failure". Tests: kind-prompts.test.ts uitgebreid: - Alle 5 kinds moeten $PAYLOAD_PATH bevatten (was alleen task/sprint/ plan-chat). - IDEA_GRILL en IDEA_MAKE_PLAN mogen geen wait_for_job meer noemen. - IDEA_GRILL en IDEA_MAKE_PLAN mogen geen {idea_*} placeholders meer bevatten. 19 tests in kind-prompts.test.ts passed (was 13). Co-Authored-By: Claude Opus 4.7 (1M context) --- __tests__/kind-prompts.test.ts | 20 ++++++++++++++-- src/prompts/idea/grill.md | 42 ++++++++++++++++++++-------------- src/prompts/idea/make-plan.md | 39 ++++++++++++++++++++----------- 3 files changed, 69 insertions(+), 32 deletions(-) diff --git a/__tests__/kind-prompts.test.ts b/__tests__/kind-prompts.test.ts index 6dbb9d2..fda08f4 100644 --- a/__tests__/kind-prompts.test.ts +++ b/__tests__/kind-prompts.test.ts @@ -26,13 +26,29 @@ describe('getKindPromptText', () => { expect(text).toMatch(/GEEN.*job_heartbeat/) }) - it.each(['TASK_IMPLEMENTATION', 'SPRINT_IMPLEMENTATION', 'PLAN_CHAT'] as const)( - '%s-prompt noemt $PAYLOAD_PATH als variabele', + it.each(KINDS)( + '%s-prompt noemt $PAYLOAD_PATH als variabele (alle kinds — runner doet substitution)', (kind) => { const text = getKindPromptText(kind) expect(text).toContain('$PAYLOAD_PATH') }, ) + + it.each(['IDEA_GRILL', 'IDEA_MAKE_PLAN'] as const)( + '%s-prompt verwijst niet meer naar wait_for_job (refactor: runner claimt)', + (kind) => { + const text = getKindPromptText(kind) + expect(text).not.toContain('wait_for_job') + }, + ) + + it.each(['IDEA_GRILL', 'IDEA_MAKE_PLAN'] as const)( + '%s-prompt bevat geen onvervangen {idea_*} placeholders', + (kind) => { + const text = getKindPromptText(kind) + expect(text).not.toMatch(/\{idea_code\}|\{idea_title\}/) + }, + ) }) describe('getIdeaPromptText (back-compat)', () => { diff --git a/src/prompts/idea/grill.md b/src/prompts/idea/grill.md index d5af711..13be8d1 100644 --- a/src/prompts/idea/grill.md +++ b/src/prompts/idea/grill.md @@ -1,21 +1,28 @@ # Grill-prompt voor IDEA_GRILL-jobs -> Deze prompt wordt door `wait_for_job` meegestuurd in de payload van een -> `IDEA_GRILL`-job en gevolgd door de Claude-CLI-worker. Dit bestand wordt -> bewust **niet** vervangen door de externe `anthropic-skills:grill-me`-skill -> (zie M12 grill-keuze 5: embedded prompts) — Scrum4Me beheert zijn eigen -> versie zodat de flow reproduceerbaar is op elke worker. +> Deze prompt wordt door `scrum4me-docker/bin/run-one-job.ts` als +> `claude -p`-input meegegeven voor één geclaimde `IDEA_GRILL`-job. Dit +> bestand wordt bewust **niet** vervangen door de externe +> `anthropic-skills:grill-me`-skill (zie M12 grill-keuze 5: embedded prompts) — +> Scrum4Me beheert zijn eigen versie zodat de flow reproduceerbaar is op +> elke worker. --- -Je bent een **grill-agent** voor Scrum4Me-idee `{idea_code}` (titel: -`{idea_title}`). +Je bent een **grill-agent** voor een Scrum4Me-idee. De runner heeft de job +al voor je geclaimd; jouw eerste actie is altijd: -Je context (meegegeven in `wait_for_job`-payload): +``` +Read $PAYLOAD_PATH +``` -- `idea`: het volledige idee-record incl. eventueel bestaande `grill_md` +Dat JSON-bestand bevat de volledige context die je nodig hebt: + +- `job_id`: nodig voor `update_job_status` aan het einde +- `idea`: het volledige idee-record incl. `id`, `code`, `title`, `description`, + `product_id`, en eventueel bestaande `grill_md` - `product`: het gekoppelde product (incl. `repo_url` en `definition_of_done`) -- `repo_url`: lokale repo om te lezen (worker bevindt zich daar al) +- `primary_worktree_path`: lokale repo om te lezen (je `cwd` zit daar al) ## Doel @@ -25,11 +32,11 @@ PBI van kan maken. Eindresultaat is een markdown-document dat je via ## Werkwijze (loop, één vraag per cyclus) -1. Lees de huidige `idea.title`, `idea.description`, en (indien aanwezig) - `idea.grill_md` — bij re-grill bouw je voort op wat er al staat, je gooit - het niet weg. -2. Verken de repo voor context: `README`, `docs/`, `package.json`, en relevante - source-bestanden. Gebruik `Read`/`Grep`/`Glob` zoals normaal. +1. **Lees `$PAYLOAD_PATH`** met de `Read`-tool. Bewaar `idea.id`, `idea.code`, + `idea.title`, `idea.grill_md` (mag null zijn), `product.id`, en `job_id` — + die heb je nodig in alle MCP-tool-calls hieronder. +2. Verken de repo (`primary_worktree_path` is je `cwd`) voor context: + `README`, `docs/`, `package.json`, relevante source. `Read`/`Grep`/`Glob`. 3. Stel **één scherpe vraag tegelijk** via `mcp__scrum4me__ask_user_question({ idea_id, question, options? })`. Wacht op het antwoord (`mcp__scrum4me__get_question_answer` of `wait_seconds`). @@ -39,7 +46,8 @@ PBI van kan maken. Eindresultaat is een markdown-document dat je via 5. Herhaal tot je voldoende hebt voor een PBI (zie stop-conditie). 6. Schrijf het eindresultaat via `mcp__scrum4me__update_idea_grill_md({ idea_id, markdown })`. -7. Roep `mcp__scrum4me__update_job_status({ job_id, status: 'done', summary })`. +7. Roep `mcp__scrum4me__update_job_status({ job_id, status: 'done', summary })` + — dit sluit de job af. **Verplicht**, ook als de gebruiker afbreekt. ## Stop-conditie @@ -55,7 +63,7 @@ Stop óók als de gebruiker expliciet zegt "klaar" / "genoeg" / "ga door". ## Output-format (strikt) ```markdown -# Idee — {korte titel} +# Idee — ## Scope … diff --git a/src/prompts/idea/make-plan.md b/src/prompts/idea/make-plan.md index 86891a0..300eaf6 100644 --- a/src/prompts/idea/make-plan.md +++ b/src/prompts/idea/make-plan.md @@ -1,21 +1,29 @@ # Make-Plan-prompt voor IDEA_MAKE_PLAN-jobs -> Deze prompt wordt door `wait_for_job` meegestuurd in de payload van een -> `IDEA_MAKE_PLAN`-job. Single-pass, **stel geen vragen** (zie M12 grill-keuze -> 8). Twijfels → terug naar grill via UI. +> Deze prompt wordt door `scrum4me-docker/bin/run-one-job.ts` als +> `claude -p`-input meegegeven voor één geclaimde `IDEA_MAKE_PLAN`-job. +> Single-pass, **stel geen vragen** (zie M12 grill-keuze 8). Twijfels → +> terug naar grill via UI. --- -Je bent een **planning-agent** voor Scrum4Me-idee `{idea_code}`. +Je bent een **planning-agent** voor een Scrum4Me-idee. De runner heeft de +job al voor je geclaimd; jouw eerste actie is altijd: -Je context (meegegeven in `wait_for_job`-payload): +``` +Read $PAYLOAD_PATH +``` +Dat JSON-bestand bevat de volledige context die je nodig hebt: + +- `job_id`: nodig voor `update_job_status` aan het einde +- `idea.id`, `idea.code`, `idea.title`, `idea.description` - `idea.grill_md`: het resultaat van de voorafgaande grill-sessie — dit is je primaire input. -- `idea.plan_md`: bij re-plan bevat dit het vorige plan; gebruik als - referentie. +- `idea.plan_md`: bij re-plan bevat dit het vorige plan; gebruik als referentie. - `product`: gekoppeld product met `repo_url`, `definition_of_done`, bestaande architectuur in repo. +- `primary_worktree_path`: lokale repo (je `cwd` zit daar al). ## Doel @@ -26,13 +34,18 @@ PBI + stories + taken via `materializeIdeaPlanAction`. ## Werkwijze (single-pass) -1. Lees `idea.grill_md` volledig. -2. Verken de repo voor patronen, bestaande modules, en `docs/`-structuur. -3. **Bij removal/refactor: doe een dependency-cascade-grep** (zie volgende +1. **Lees `$PAYLOAD_PATH`** met de `Read`-tool. Bewaar `idea.id`, `idea.code`, + `idea.grill_md`, `idea.plan_md` (mag null zijn), `product.id`, en `job_id` — + die heb je nodig in alle MCP-tool-calls hieronder. +2. Lees `idea.grill_md` volledig. +3. Verken de repo (`primary_worktree_path` is je `cwd`) voor patronen, + bestaande modules, en `docs/`-structuur. +4. **Bij removal/refactor: doe een dependency-cascade-grep** (zie volgende sectie). Voeg per geraakte file een taak toe vóór de schema/code-edit zelf. -4. Bouw het plan op in de **strikte format** hieronder. -5. Roep `mcp__scrum4me__update_idea_plan_md({ idea_id, markdown })`. -6. Roep `mcp__scrum4me__update_job_status({ job_id, status: 'done', summary })`. +5. Bouw het plan op in de **strikte format** hieronder. +6. Roep `mcp__scrum4me__update_idea_plan_md({ idea_id, markdown })`. +7. Roep `mcp__scrum4me__update_job_status({ job_id, status: 'done', summary })` + — dit sluit de job af. **Verplicht**, ook bij parse-failure. ## Dependency-cascade-grep (verplicht bij removal/refactor)