bmad-architecture: align finalize-reviewers wording + headless blocked output

- customize.toml: reword finalize_reviewers comment to match reviewer-gate.md —
  the gate is stakes-gated, but its reviewers always run once it does (coderabbit)
- headless.md: state explicitly that a blocked run omits spine/memlog/companions,
  matching the "omit keys for artifacts not produced" contract (coderabbit)
This commit is contained in:
Brian Madison 2026-06-14 00:07:30 -05:00
parent f675bdaf22
commit d8ebf46a3b
2 changed files with 5 additions and 3 deletions

View File

@ -84,7 +84,9 @@ external_handoffs = []
# --- Finalize reviewers --- # --- Finalize reviewers ---
# Extra review lenses spawned as parallel subagents at the validation gate (Finalize and the # Extra review lenses spawned as parallel subagents at the validation gate (Finalize and the
# Validate intent), on top of the skill's built-in good-spine checklist and the lint_spine.py # Validate intent), on top of the skill's built-in good-spine checklist and the lint_spine.py
# mechanical floor. Stakes-gated: high-stakes / cross-team spines run them, throwaway ones may skip. # mechanical floor. The GATE is stakes-gated — a throwaway spine may run it quietly or skip it —
# but whenever the gate runs, every entry here runs with it (the configured floor, never cherry-
# picked); only ad-hoc lenses are optional, and headless never skips the gate.
# #
# Entries follow the standard prefix convention: # Entries follow the standard prefix convention:
# "skill:NAME" invoke the named review skill as a subagent against ARCHITECTURE-SPINE.md # "skill:NAME" invoke the named review skill as a subagent against ARCHITECTURE-SPINE.md

View File

@ -4,7 +4,7 @@ No interactive user: infer everything, ask nothing, but never invent — record
Drive the run from the payload in the first message — `intent`, `altitude`, `purpose`, the driving input (spec package / PRD / raw intent / brownfield path), a parent spine path at lower altitude, and `doc_workspace` if a specific folder is required. Infer anything absent from the inputs or workspace; don't invent stack, constraints, or scope to fill a gap. You still verify named tech on the web (you can't ask, but you can check) and still drive every write through the shared `{project-root}/_bmad/scripts/memlog.py`. Run the full Reviewer Gate (`references/reviewer-gate.md`) non-interactively: `scripts/lint_spine.py` plus **every `{workflow.finalize_reviewers}` lens as a parallel subagent** (and any ad-hoc lens the spine's criticality warrants). Headless skips only the human picking from the menu — never the reviewers themselves; apply the clear fixes and record anything unresolved in `open_questions[]`. For a true authority collision, list it in `conflicts_with_prior_decisions[]`. For the Validate intent, always write the report to `{doc_workspace}` and add `"offer_to_update": true`. If intent stays ambiguous after inference, halt blocked. Drive the run from the payload in the first message — `intent`, `altitude`, `purpose`, the driving input (spec package / PRD / raw intent / brownfield path), a parent spine path at lower altitude, and `doc_workspace` if a specific folder is required. Infer anything absent from the inputs or workspace; don't invent stack, constraints, or scope to fill a gap. You still verify named tech on the web (you can't ask, but you can check) and still drive every write through the shared `{project-root}/_bmad/scripts/memlog.py`. Run the full Reviewer Gate (`references/reviewer-gate.md`) non-interactively: `scripts/lint_spine.py` plus **every `{workflow.finalize_reviewers}` lens as a parallel subagent** (and any ad-hoc lens the spine's criticality warrants). Headless skips only the human picking from the menu — never the reviewers themselves; apply the clear fixes and record anything unresolved in `open_questions[]`. For a true authority collision, list it in `conflicts_with_prior_decisions[]`. For the Validate intent, always write the report to `{doc_workspace}` and add `"offer_to_update": true`. If intent stays ambiguous after inference, halt blocked.
End with JSON only, omitting keys for artifacts not produced: End with JSON only, omitting keys for artifacts not produced — the shape below is the fully-produced (`complete`) case; a `blocked` run produces no spine, so it omits `spine`, `memlog`, and `companions` entirely (see the note under the block):
```json ```json
{ {
@ -23,4 +23,4 @@ End with JSON only, omitting keys for artifacts not produced:
} }
``` ```
`complete` stands alone · `partial` (spine produced, but `open_questions[]` non-empty or critical inputs inferred) means review before downstream use · `blocked` means no spine produced. `complete` stands alone · `partial` (spine produced, but `open_questions[]` non-empty or critical inputs inferred) means review before downstream use · `blocked` means no spine produced — return only `status`, `intent`, `reason`, and `doc_workspace` (if bound), omitting `spine`, `memlog`, `companions`, and the artifact arrays that don't exist.