feedback_judge_prompt_narrative_wrapper.md 2.31 KB

name: judge-prompt-narrative-wrapper description: Work Graph judge_prompts for brd/sdd/benchmark nodes must explicitly reject "workflow completed" narrative-wrapper output, not just check for topical content metadata:

type: feedback

planner_reviewer rejected a Work Graph's SDD and Benchmark nodes (2026-08-13, task: fix missing concurrency mutex in supervisor/deploy_stage.stage_deployment()) because both artifacts were narrative completion reports ("The graphlemon Work Node (planner) workflow completed. It produced an SDD for the goal '...'") wrapping only a few bullet points, with the SDD explicitly hedging "let me know if you want the full SDD text" instead of including it. PRD passed because it was an actual structured document with FR/AC tables; BRD partially failed for the same narrative-report tone despite having real content (G1/G2/G3 gaps) inside it.

Why: this is exactly the failure mode SOUL.md's judgment principles call out — narrative "what I just did" text standing in for the actual deliverable. It's easy for a Planner Work Node to slip into this because its own execution wrapper naturally produces "workflow completed, it produced X" framing; without an explicit judge instruction against it, generic "is this a good SDD" judge_prompts don't reliably catch it since the summary bullets are topically relevant, just not the full document.

How to apply: when writing judge_prompt for brd/sdd/benchmark Work Graph nodes (especially on a retry after a planner_reviewer rejection), explicitly instruct the judge to fail if: (a) the artifact opens with a completion-status sentence about the workflow/agent itself rather than the document's own subject matter, (b) it ends with hedging like "let me know if you want more detail" or "awaiting direction on whether to continue" instead of being self-contained, or (c) it summarizes in prose what should be enumerated (e.g. Benchmark scenarios need real IDs/ preconditions/expected-assertions tables, not "9 test scenarios defined: ..."). Ground the substantive completeness bar in real code facts read fresh (don't just trust the failed attempt's own framing) — see [[project_deploy_stage_concurrent_conflict_prd]] for the concrete facts used here (ux_deployment_active already exists; the real gap is the raw sqlite3.IntegrityError leaking untranslated).