fix(prompts): idea-prompts gebruiken $PAYLOAD_PATH ipv onvervangen placeholders
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) <noreply@anthropic.com>
This commit is contained in:
parent
e13a470024
commit
ae017b8644
3 changed files with 69 additions and 32 deletions
|
|
@ -26,13 +26,29 @@ describe('getKindPromptText', () => {
|
||||||
expect(text).toMatch(/GEEN.*job_heartbeat/)
|
expect(text).toMatch(/GEEN.*job_heartbeat/)
|
||||||
})
|
})
|
||||||
|
|
||||||
it.each(['TASK_IMPLEMENTATION', 'SPRINT_IMPLEMENTATION', 'PLAN_CHAT'] as const)(
|
it.each(KINDS)(
|
||||||
'%s-prompt noemt $PAYLOAD_PATH als variabele',
|
'%s-prompt noemt $PAYLOAD_PATH als variabele (alle kinds — runner doet substitution)',
|
||||||
(kind) => {
|
(kind) => {
|
||||||
const text = getKindPromptText(kind)
|
const text = getKindPromptText(kind)
|
||||||
expect(text).toContain('$PAYLOAD_PATH')
|
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)', () => {
|
describe('getIdeaPromptText (back-compat)', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,28 @@
|
||||||
# Grill-prompt voor IDEA_GRILL-jobs
|
# Grill-prompt voor IDEA_GRILL-jobs
|
||||||
|
|
||||||
> Deze prompt wordt door `wait_for_job` meegestuurd in de payload van een
|
> Deze prompt wordt door `scrum4me-docker/bin/run-one-job.ts` als
|
||||||
> `IDEA_GRILL`-job en gevolgd door de Claude-CLI-worker. Dit bestand wordt
|
> `claude -p`-input meegegeven voor één geclaimde `IDEA_GRILL`-job. Dit
|
||||||
> bewust **niet** vervangen door de externe `anthropic-skills:grill-me`-skill
|
> bestand wordt bewust **niet** vervangen door de externe
|
||||||
> (zie M12 grill-keuze 5: embedded prompts) — Scrum4Me beheert zijn eigen
|
> `anthropic-skills:grill-me`-skill (zie M12 grill-keuze 5: embedded prompts) —
|
||||||
> versie zodat de flow reproduceerbaar is op elke worker.
|
> Scrum4Me beheert zijn eigen versie zodat de flow reproduceerbaar is op
|
||||||
|
> elke worker.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Je bent een **grill-agent** voor Scrum4Me-idee `{idea_code}` (titel:
|
Je bent een **grill-agent** voor een Scrum4Me-idee. De runner heeft de job
|
||||||
`{idea_title}`).
|
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`)
|
- `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
|
## Doel
|
||||||
|
|
||||||
|
|
@ -25,11 +32,11 @@ PBI van kan maken. Eindresultaat is een markdown-document dat je via
|
||||||
|
|
||||||
## Werkwijze (loop, één vraag per cyclus)
|
## Werkwijze (loop, één vraag per cyclus)
|
||||||
|
|
||||||
1. Lees de huidige `idea.title`, `idea.description`, en (indien aanwezig)
|
1. **Lees `$PAYLOAD_PATH`** met de `Read`-tool. Bewaar `idea.id`, `idea.code`,
|
||||||
`idea.grill_md` — bij re-grill bouw je voort op wat er al staat, je gooit
|
`idea.title`, `idea.grill_md` (mag null zijn), `product.id`, en `job_id` —
|
||||||
het niet weg.
|
die heb je nodig in alle MCP-tool-calls hieronder.
|
||||||
2. Verken de repo voor context: `README`, `docs/`, `package.json`, en relevante
|
2. Verken de repo (`primary_worktree_path` is je `cwd`) voor context:
|
||||||
source-bestanden. Gebruik `Read`/`Grep`/`Glob` zoals normaal.
|
`README`, `docs/`, `package.json`, relevante source. `Read`/`Grep`/`Glob`.
|
||||||
3. Stel **één scherpe vraag tegelijk** via
|
3. Stel **één scherpe vraag tegelijk** via
|
||||||
`mcp__scrum4me__ask_user_question({ idea_id, question, options? })`. Wacht
|
`mcp__scrum4me__ask_user_question({ idea_id, question, options? })`. Wacht
|
||||||
op het antwoord (`mcp__scrum4me__get_question_answer` of `wait_seconds`).
|
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).
|
5. Herhaal tot je voldoende hebt voor een PBI (zie stop-conditie).
|
||||||
6. Schrijf het eindresultaat via
|
6. Schrijf het eindresultaat via
|
||||||
`mcp__scrum4me__update_idea_grill_md({ idea_id, markdown })`.
|
`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
|
## Stop-conditie
|
||||||
|
|
||||||
|
|
@ -55,7 +63,7 @@ Stop óók als de gebruiker expliciet zegt "klaar" / "genoeg" / "ga door".
|
||||||
## Output-format (strikt)
|
## Output-format (strikt)
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# Idee — {korte titel}
|
# Idee — <korte titel>
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
…
|
…
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,29 @@
|
||||||
# Make-Plan-prompt voor IDEA_MAKE_PLAN-jobs
|
# Make-Plan-prompt voor IDEA_MAKE_PLAN-jobs
|
||||||
|
|
||||||
> Deze prompt wordt door `wait_for_job` meegestuurd in de payload van een
|
> Deze prompt wordt door `scrum4me-docker/bin/run-one-job.ts` als
|
||||||
> `IDEA_MAKE_PLAN`-job. Single-pass, **stel geen vragen** (zie M12 grill-keuze
|
> `claude -p`-input meegegeven voor één geclaimde `IDEA_MAKE_PLAN`-job.
|
||||||
> 8). Twijfels → terug naar grill via UI.
|
> 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
|
- `idea.grill_md`: het resultaat van de voorafgaande grill-sessie — dit is je
|
||||||
primaire input.
|
primaire input.
|
||||||
- `idea.plan_md`: bij re-plan bevat dit het vorige plan; gebruik als
|
- `idea.plan_md`: bij re-plan bevat dit het vorige plan; gebruik als referentie.
|
||||||
referentie.
|
|
||||||
- `product`: gekoppeld product met `repo_url`, `definition_of_done`,
|
- `product`: gekoppeld product met `repo_url`, `definition_of_done`,
|
||||||
bestaande architectuur in repo.
|
bestaande architectuur in repo.
|
||||||
|
- `primary_worktree_path`: lokale repo (je `cwd` zit daar al).
|
||||||
|
|
||||||
## Doel
|
## Doel
|
||||||
|
|
||||||
|
|
@ -26,13 +34,18 @@ PBI + stories + taken via `materializeIdeaPlanAction`.
|
||||||
|
|
||||||
## Werkwijze (single-pass)
|
## Werkwijze (single-pass)
|
||||||
|
|
||||||
1. Lees `idea.grill_md` volledig.
|
1. **Lees `$PAYLOAD_PATH`** met de `Read`-tool. Bewaar `idea.id`, `idea.code`,
|
||||||
2. Verken de repo voor patronen, bestaande modules, en `docs/`-structuur.
|
`idea.grill_md`, `idea.plan_md` (mag null zijn), `product.id`, en `job_id` —
|
||||||
3. **Bij removal/refactor: doe een dependency-cascade-grep** (zie volgende
|
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.
|
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. 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_idea_plan_md({ idea_id, markdown })`.
|
||||||
6. 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 bij parse-failure.
|
||||||
|
|
||||||
## Dependency-cascade-grep (verplicht bij removal/refactor)
|
## Dependency-cascade-grep (verplicht bij removal/refactor)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue