fix(skills): strengthen activation guardrails to prevent LLM short-circuiting (#2398)

* fix(skills): strengthen activation guardrails for all workflow skills

Add explicit "Activation is complete" boundary markers that require
confirming activation_steps_prepend and activation_steps_append were
fully executed before beginning the main workflow.

Previously, the guardrail was either missing (bmad-product-brief,
bmad-prd, bmad-investigate) or too weak ("Begin the workflow below").
LLM agents would short-circuit complex activation sequences (INCLUDE →
READ → RUN → CHECK → FILTER → CD) by guessing variables instead of
executing steps in order, causing append steps and on_complete hooks
to be silently skipped.

The new guardrail explicitly names both prepend and append steps,
requiring confirmation before proceeding. This prevents agents from
starting the main workflow in parallel with activation.

23 skills updated: bmad-product-brief, bmad-prd, bmad-prfaq,
bmad-investigate, bmad-create-story, bmad-dev-story,
bmad-quick-dev, bmad-code-review, bmad-correct-course,
bmad-sprint-planning, bmad-sprint-status, bmad-retrospective,
bmad-qa-generate-e2e-tests, bmad-checkpoint-preview,
bmad-check-implementation-readiness, bmad-create-architecture,
bmad-create-epics-and-stories, bmad-generate-project-context,
bmad-create-ux-design, bmad-document-project, bmad-market-research,
bmad-technical-research, bmad-domain-research.

* fix(skills): extend activation gate to agent + new skills, refine placement

- bmad-product-brief / bmad-prd: pull activation_steps_append out of
  the numbered list so the sentinel reads as a paragraph break, not
  as the next list item.
- bmad-investigate: move the sentinel above Step 7 (routing) — Step 7
  is workflow routing, not activation; the gate must fire first.
- bmad-agent-{analyst,tech-writer,pm,ux-designer,architect,dev}: add
  the same gate between Step 7 (append) and Step 8 (menu dispatch).
  Persona skills had the same short-circuit risk but no sentinel.
- bmad-ux, bmad-spec: new skills introduced on main after this branch
  forked; apply the same gate so the pattern stays consistent.
- removals.txt: register bmad-create-ux-design as renamed to bmad-ux.

---------

Co-authored-by: Brian Madison <bmadcode@gmail.com>
This commit is contained in:
Jérôme Revillard 2026-05-25 16:59:38 +02:00 committed by GitHub
parent 1a5df418b3
commit 436845493f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
31 changed files with 52 additions and 23 deletions

View File

@ -57,3 +57,6 @@ bmad-bmm-validate-prd
# bmad-distillator: superseded by bmad-spec (universal intent distiller with
# preservation-validated contract for downstream skills).
bmad-distillator
# bmad-create-ux-design: renamed to bmad-ux (spine-based skill with separate
# DESIGN.md and EXPERIENCE.md outputs).
bmad-create-ux-design

View File

@ -63,6 +63,8 @@ Continue to prefix your messages with `{agent.icon}` throughout the session so t
Execute each entry in `{agent.activation_steps_append}` in order.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
### Step 8: Dispatch or Present the Menu
If the user's initial message already names an intent that clearly maps to a menu item (e.g. "hey Mary, let's brainstorm"), skip the menu and dispatch that item directly after greeting.

View File

@ -63,6 +63,8 @@ Continue to prefix your messages with `{agent.icon}` throughout the session so t
Execute each entry in `{agent.activation_steps_append}` in order.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
### Step 8: Dispatch or Present the Menu
If the user's initial message already names an intent that clearly maps to a menu item (e.g. "hey Paige, let's document this codebase"), skip the menu and dispatch that item directly after greeting.

View File

@ -55,7 +55,7 @@ Greet `{user_name}` (if you have not already), speaking in `{communication_langu
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Execution

View File

@ -65,7 +65,7 @@ Greet `{user_name}`, speaking in `{communication_language}`. Be warm but efficie
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Continue below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Pre-workflow Setup

View File

@ -21,7 +21,10 @@ At the opening greeting, let the user know they can invoke `bmad-party-mode` for
4. `{workflow.external_sources}` is an org-configured registry of internal tools (knowledge bases, MCP tools); consult them alongside generic web research on the same triggers in `## Discovery`, org tools preferred when their directive matches. If a named tool is unavailable at runtime, fall back to standard behavior and note the gap when relevant.
5. Load `{project-root}/_bmad/bmm/config.yaml` (and `config.user.yaml` if present). Resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{planning_artifacts}`, `{project_name}`, `{date}`.
6. Greet `{user_name}` in `{communication_language}` — and stay in `{communication_language}` for every turn for the entire run, not just the greeting. Detect intent (create / update / validate). If interactive and intent is unclear, ask; for headless behavior see `## Headless Mode`.
7. Execute each entry in `{workflow.activation_steps_append}` in order.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Intent Operating Modes

View File

@ -59,7 +59,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## QUICK TOPIC DISCOVERY

View File

@ -59,7 +59,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## QUICK TOPIC DISCOVERY

View File

@ -59,7 +59,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## QUICK TOPIC DISCOVERY

View File

@ -63,6 +63,8 @@ Continue to prefix your messages with `{agent.icon}` throughout the session so t
Execute each entry in `{agent.activation_steps_append}` in order.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
### Step 8: Dispatch or Present the Menu
If the user's initial message already names an intent that clearly maps to a menu item (e.g. "hey John, let's write the PRD"), skip the menu and dispatch that item directly after greeting.

View File

@ -63,6 +63,8 @@ Continue to prefix your messages with `{agent.icon}` throughout the session so t
Execute each entry in `{agent.activation_steps_append}` in order.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
### Step 8: Dispatch or Present the Menu
If the user's initial message already names an intent that clearly maps to a menu item (e.g. "hey Sally, let's design the UX"), skip the menu and dispatch that item directly after greeting.

View File

@ -20,7 +20,10 @@ You are a master facilitator and coach helping the user create, edit, or validat
3. Load `{project-root}/_bmad/bmm/config.yaml` (+ `config.user.yaml` if present). Resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{planning_artifacts}`, `{project_name}`, `{date}`. Missing keys → neutral defaults; never block.
4. If headless, follow `references/headless.md` for the whole run. Otherwise greet the user **by name** using `{user_name}` and **in their language** using `{communication_language}` — and stay in `{communication_language}` for every turn for the entire run, not just the greeting. In the greeting, let the user know that at any point they can invoke `bmad-party-mode` for multi-agent perspectives or `bmad-advanced-elicitation` for deeper exploration on a specific section. Then scan for misroute on the first message: if the signal points elsewhere (game → BMad GDS; express build → `bmad-quick-dev`; one-pager → `bmad-product-brief`; vet product idea → `bmad-prfaq`; agent skill or custom agent → `bmad-workflow-builder`), suggest they might want the other options before continuing.
5. Detect intent: **Create** (no PRD), **Update** (existing PRD), **Validate** (critique only). If ambiguous, ask. For Create intent, before binding a fresh workspace, scan `{workflow.prd_output_path}` for prior in-progress runs (folders matching `{workflow.run_folder_pattern}` whose `prd.md` frontmatter `status` is not `final`); if any exist, offer to resume rather than starting over.
6. Run `{workflow.activation_steps_append}`.
Run `{workflow.activation_steps_append}`.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Intent Modes

View File

@ -35,7 +35,10 @@ UX may lead, follow, or stand alone. Inherit `sources:` by reference; the spines
3. Load `{project-root}/_bmad/bmm/config.yaml` (+ `config.user.yaml` if present). Resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{planning_artifacts}`, `{project_name}`, `{date}`. Missing keys → neutral defaults; never block.
4. If headless, follow `references/headless.md` for the whole run. Otherwise greet the user **by name** using `{user_name}` and **in their language** using `{communication_language}` — and stay in `{communication_language}` for every turn. In the greeting, let the user know `bmad-party-mode` and `bmad-advanced-elicitation` are always available. Then scan for misroute on the first message: PRD → `bmad-prd`; architecture → `bmad-create-architecture`; game UX → BMad GDS; agent/skill → `bmad-workflow-builder`; brief → `bmad-product-brief`.
5. Detect intent: **Create**, **Update**, **Validate**. For Create, before binding a fresh workspace, scan `{workflow.ux_output_path}` for prior in-progress runs (folders matching `{workflow.run_folder_pattern}` whose `DESIGN.md` frontmatter `status` is not `final`) and offer to resume rather than starting over.
6. Run `{workflow.activation_steps_append}`.
Run `{workflow.activation_steps_append}`.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Modes

View File

@ -63,6 +63,8 @@ Continue to prefix your messages with `{agent.icon}` throughout the session so t
Execute each entry in `{agent.activation_steps_append}` in order.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
### Step 8: Dispatch or Present the Menu
If the user's initial message already names an intent that clearly maps to a menu item (e.g. "hey Winston, let's architect this"), skip the menu and dispatch that item directly after greeting.

View File

@ -84,7 +84,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Execution

View File

@ -65,7 +65,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Execution

View File

@ -86,7 +86,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Execution

View File

@ -65,7 +65,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Paths

View File

@ -63,6 +63,8 @@ Continue to prefix your messages with `{agent.icon}` throughout the session so t
Execute each entry in `{agent.activation_steps_append}` in order.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
### Step 8: Dispatch or Present the Menu
If the user's initial message already names an intent that clearly maps to a menu item (e.g. "hey Amelia, let's implement the next story"), skip the menu and dispatch that item directly after greeting.

View File

@ -55,7 +55,7 @@ Greet the user, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Global Step Rules (apply to every step)

View File

@ -58,7 +58,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## WORKFLOW ARCHITECTURE

View File

@ -62,7 +62,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Paths

View File

@ -63,7 +63,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Paths

View File

@ -64,7 +64,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Paths

View File

@ -79,6 +79,8 @@ Greet `{user_name}` in `{communication_language}`.
Run each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
### Step 7: Acknowledge and route
Acknowledge the input as a reference (record paths and IDs; don't read raw content). Path to an existing case file →

View File

@ -56,7 +56,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Paths

View File

@ -79,7 +79,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## WORKFLOW ARCHITECTURE

View File

@ -73,7 +73,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Paths

View File

@ -59,7 +59,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Paths

View File

@ -57,7 +57,7 @@ Greet `{user_name}`, speaking in `{communication_language}`.
Execute each entry in `{workflow.activation_steps_append}` in order.
Activation is complete. Begin the workflow below.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Paths

View File

@ -22,7 +22,10 @@ Multiple skills may call to update the same spec over time.
2. Run `{workflow.activation_steps_prepend}`. Treat `{workflow.persistent_facts}` as foundational context (`file:` entries are loaded).
3. Load `{project-root}/_bmad/core/config.yaml` (and `config.user.yaml` if present), root level and `bmm` section. Resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{planning_artifacts}`, `{project_name}`, `{date}`.
4. Detect mode. **Headless** when any of: no TTY, programmatic caller (another skill or non-interactive runner), or the first message pre-supplies all inputs and asks for an artifact path back. **Interactive** otherwise. In interactive mode, greet by `{user_name}` in `{communication_language}`, stay in that language, and mention that `bmad-party-mode` and `bmad-advanced-elicitation` are available for deeper exploration on any field.
5. Run `{workflow.activation_steps_append}`.
Run `{workflow.activation_steps_append}`.
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
## Workspace