Skill Tracer
Skills › BMAD Method › bmad-build-auto › workflow.md

workflow.md

87 lines · skills/bmad-build-auto/workflow.md at bd70c64

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1{% if workflow.route not in ("oneshot", "full", "auto") %}{{ halt("workflow.route must be oneshot, full, or auto, not " ~ workflow.route) }}{% endif %}
2{% if workflow.review not in ("none", "quick", "thorough", "auto") %}{{ halt("workflow.review must be none, quick, thorough, or auto, not " ~ workflow.review) }}{% endif %}
3# Build Auto Workflow
4
5**Goal:** Turn intent into a hardened, reviewable artifact, without human interaction.
6
7**CRITICAL:** If a step directs you to another snapshot file, read it fully and follow it. No exceptions.
8

{% if workflow.route not in ("oneshot", "full", "auto") %}{{ halt("workflow.route must be oneshot, full, or auto, not " ~ workflow.route) }}{% endif %} {% if workflow.review not in ("none", "quick", "thorough", "auto") %}{{ halt("workflow.review must be none, quick, thorough, or auto, not " ~ workflow.review) }}{% endif %}

Build Auto Workflow

Goal: Turn intent into a hardened, reviewable artifact, without human interaction.

CRITICAL: If a step directs you to another snapshot file, read it fully and follow it. No exceptions.

Raw lines 1 to 8
9## HALT
11To HALT with a final status and optional blocking condition. The halts `blocked plan supplied` and `dropped plan supplied` write nothing, so the plan keeps its first reason or its `dropped` status: go straight to 3.
131. **A ticket from the tree** (`{ticket_args}` is set) with final status `blocked`: run `uv run {project-root}/_bmad/method/scripts/tickets.py --project-root {project-root} mark {ticket_args} blocked --blocked <blocking condition>`, with each argument quoted for the shell, which writes `status`, `blocked_at`, and `blocked_reason` to `{plan_file}` and creates it when there is none. Then append missing result details under `## Auto Run Result` in `{plan_file}`. If `mark` fails, follow 2 instead.
142. **Otherwise:**
15 - If `{plan_file}` is known and exists, update `status` in frontmatter and append missing result details under `## Auto Run Result`.
16 - If `{plan_file}` is unknown or missing, create `{{ initiative_folder }}/bmad-build-auto-result-<slug-or-timestamp>.md` with:
17 ```markdown
18 ---
19 status: <final status>
20 ---
22 # BMad Build Auto Result
24 Status: <final status>
25 Blocking condition: <blocking condition, if any>
26 ```
273. Follow **On Complete** below, then stop the workflow.

HALT

To HALT with a final status and optional blocking condition. The halts blocked plan supplied and dropped plan supplied write nothing, so the plan keeps its first reason or its dropped status: go straight to 3.

  1. A ticket from the tree ({ticket_args} is set) with final status blocked: run uv run {project-root}/_bmad/method/scripts/tickets.py --project-root {project-root} mark {ticket_args} blocked --blocked <blocking condition>, with each argument quoted for the shell, which writes status, blocked_at, and blocked_reason to {plan_file} and creates it when there is none. Then append missing result details under ## Auto Run Result in {plan_file}. If mark fails, follow 2 instead.
  2. Otherwise:
  3. If {plan_file} is known and exists, update status in frontmatter and append missing result details under ## Auto Run Result.
  4. If {plan_file} is unknown or missing, create {{ initiative_folder }}/bmad-build-auto-result-<slug-or-timestamp>.md with: ```markdown --- status: <final status> ---

# BMad Build Auto Result

Status: <final status> Blocking condition: <blocking condition, if any> ```

  1. Follow On Complete below, then stop the workflow.
Raw lines 9 to 28
Runs code scripts/tickets.py :13
29### On Complete
31If anything appears below, follow it as the final terminal instruction before exiting; otherwise exit normally.
33{{ workflow.on_complete }}

On Complete

If anything appears below, follow it as the final terminal instruction before exiting; otherwise exit normally.

{{ workflow.on_complete }}

Raw lines 29 to 34
35## Subagents
37Using subagents when instructed is mandatory. If you cannot, HALT with status `blocked` and blocking condition `no subagents`.
39Launch all the subagents a step calls for in **one message** — several **blocking** calls awaited together in the same turn — then wait for all their results before continuing; a step that calls for one subagent is that same message with one call. Never split a step's launches across messages, and never run one detached. Never run a subagent in the background / detached / async (e.g. `run_in_background: true`), and never end your turn to "await a completion notification." This workflow runs unattended: there is no event loop to resume a yielded turn, so a backgrounded subagent never hands control back and the run stalls. The only sanctioned way to end a turn is the HALT protocol above with an explicit terminal `status`.

Subagents

Using subagents when instructed is mandatory. If you cannot, HALT with status blocked and blocking condition no subagents.

Launch all the subagents a step calls for in one message — several blocking calls awaited together in the same turn — then wait for all their results before continuing; a step that calls for one subagent is that same message with one call. Never split a step's launches across messages, and never run one detached. Never run a subagent in the background / detached / async (e.g. run_in_background: true), and never end your turn to "await a completion notification." This workflow runs unattended: there is no event loop to resume a yielded turn, so a backgrounded subagent never hands control back and the run stalls. The only sanctioned way to end a turn is the HALT protocol above with an explicit terminal status.

Raw lines 35 to 40
Starts an agent Subagents :35
Starts an agent subagents :37
Starts an agent subagent :39
41## READY FOR DEVELOPMENT STANDARD
43A oneshot plan is "Ready for Development" when its intent is clear, complete, coherent, and sufficient to implement and verify, its route choice and reason are recorded, and all template frontmatter fields are preserved.
45A full plan is "Ready for Development" when:
47- **Actionable**: Every task has a file path and specific action.
48- **Logical**: Tasks ordered by dependency.
49- **Testable**: All ACs use Given/When/Then, and each is a check the implementer can prove it met without pointing at code.
50- **Surface-anchored**: ACs observe the outermost surface the intent references — never a more internal proxy for it.
51- **Complete**: No placeholders or TBDs.
52- **Sufficient**: No known requirement, acceptance, dependency, or implementation gaps remain unresolved.
53- **Coherent**: No unresolved ambiguities or internal contradictions.

READY FOR DEVELOPMENT STANDARD

A oneshot plan is "Ready for Development" when its intent is clear, complete, coherent, and sufficient to implement and verify, its route choice and reason are recorded, and all template frontmatter fields are preserved.

A full plan is "Ready for Development" when:

  • Actionable: Every task has a file path and specific action.
  • Logical: Tasks ordered by dependency.
  • Testable: All ACs use Given/When/Then, and each is a check the implementer can prove it met without pointing at code.
  • Surface-anchored: ACs observe the outermost surface the intent references — never a more internal proxy for it.
  • Complete: No placeholders or TBDs.
  • Sufficient: No known requirement, acceptance, dependency, or implementation gaps remain unresolved.
  • Coherent: No unresolved ambiguities or internal contradictions.
Raw lines 41 to 54
55## Conventions
57- Whenever this workflow captures or records a version-control revision, obtain the full canonical identifier directly from version control and preserve it verbatim.

Conventions

  • Whenever this workflow captures or records a version-control revision, obtain the full canonical identifier directly from version control and preserve it verbatim.
Raw lines 55 to 58
59## On Activation

On Activation

Raw lines 59 to 60
61### Step 1: Execute Prepend Steps
63Execute each of these steps in order before proceeding (`_None._` means skip):
65{{ workflow.activation_steps_prepend }}

Step 1: Execute Prepend Steps

Execute each of these steps in order before proceeding (_None._ means skip):

{{ workflow.activation_steps_prepend }}

Raw lines 61 to 66
67### Step 2: Load Persistent Facts
69Treat every entry below as foundational context you carry for the rest of the workflow run. Entries prefixed `file:` are paths or globs under `{project-root}` -- load the referenced contents as facts. All other entries are facts verbatim (`_None._` means none):
71{{ workflow.persistent_facts }}

Step 2: Load Persistent Facts

Treat every entry below as foundational context you carry for the rest of the workflow run. Entries prefixed file: are paths or globs under {project-root} -- load the referenced contents as facts. All other entries are facts verbatim (_None._ means none):

{{ workflow.persistent_facts }}

Raw lines 67 to 72
73### Step 3: Execute Append Steps
75Execute each of these steps in order (`_None._` means skip):
77{{ workflow.activation_steps_append }}
79Activation is complete after all activation steps have run.

Step 3: Execute Append Steps

Execute each of these steps in order (_None._ means skip):

{{ workflow.activation_steps_append }}

Activation is complete after all activation steps have run.

Raw lines 73 to 80
81## Workflow Execution
83Follow the step files in order. Read one step fully, execute it, then load the next step only when directed. Do not skip, reorder, or pre-load steps.

Workflow Execution

Follow the step files in order. Read one step fully, execute it, then load the next step only when directed. Do not skip, reorder, or pre-load steps.

Raw lines 81 to 84
85## First Workflow Step
87Read fully and follow: `{{ rendered("step-01-clarify-and-route.md") }}`.

First Workflow Step

Read fully and follow: {{ rendered("step-01-clarify-and-route.md") }}.

Raw lines 85 to 87