diff --git a/src/bmm-skills/3-solutioning/bmad-architecture/customize.toml b/src/bmm-skills/3-solutioning/bmad-architecture/customize.toml index c0353174b..3c4e50d0e 100644 --- a/src/bmm-skills/3-solutioning/bmad-architecture/customize.toml +++ b/src/bmm-skills/3-solutioning/bmad-architecture/customize.toml @@ -84,7 +84,9 @@ external_handoffs = [] # --- Finalize reviewers --- # 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 -# 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: # "skill:NAME" invoke the named review skill as a subagent against ARCHITECTURE-SPINE.md diff --git a/src/bmm-skills/3-solutioning/bmad-architecture/references/headless.md b/src/bmm-skills/3-solutioning/bmad-architecture/references/headless.md index 5fa17552c..bd4d20be1 100644 --- a/src/bmm-skills/3-solutioning/bmad-architecture/references/headless.md +++ b/src/bmm-skills/3-solutioning/bmad-architecture/references/headless.md @@ -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. -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 { @@ -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.