Back to Bmad Method

Headless Mode

src/bmm-skills/2-plan-workflows/bmad-prd/references/headless.md

6.7.13.1 KB
Original Source

Headless Mode

Load this file when bmad-prd is invoked headless (no interactive user). Follow it for the whole run.

Detection

Headless mode is in effect when any of the following is true:

  • the invoking caller sets a headless: true flag (or equivalent argument the harness exposes),
  • the invocation is from another skill or a non-interactive runner (no TTY, no user message stream),
  • {workflow.activation_steps_prepend} includes an entry that explicitly declares headless,
  • the first message comes from an automation context that pre-supplies all inputs and asks for an artifact path back.

When ambiguous, default to interactive.

Inputs the caller is expected to provide

The caller passes inputs in their first message (free-form structured payload; no fixed schema, but every field below should be present when applicable):

  • intent"create", "update", or "validate". If absent, infer from the artifact set.
  • For Create: a brief or product spec the LLM works from (plain text, file path, or URL), plus any persona/scope notes; doc_workspace if a specific run folder is required (otherwise the workflow binds the default).
  • For Update: the existing prd.md path (or a workspace path that contains one), and a change signal (the request: what to change and why).
  • For Validate: the existing prd.md path (or workspace path), and optionally a checklist override path. Workspace defaults to the PRD's containing directory.

Anything the caller does not provide is either inferred from inputs/workspace or recorded as assumptions[] / open_questions[] in the JSON status. Do not invent persona detail, success metrics, or scope decisions to fill gaps — record them.

General

Do not ask. Complete the intent using what is provided, what exists in {doc_workspace}, or what you can discover yourself. If intent remains ambiguous after inference, halt with status: "blocked" and a reason field — do not prompt. Do not greet.

Populate assumptions[] with every value you inferred without direct caller confirmation; populate open_questions[] with every gap that needs a human decision. Use status: "partial" when the artifact was produced but open_questions[] is non-empty or critical inputs were inferred (Create with no brief; Update with a vague signal acted on best-effort; Validate that could not load the checklist). complete = stands on its own; partial = caller should review before downstream use; blocked = no artifact produced.

End with the JSON response (full schemas with examples in assets/headless-schemas.md). The intent field must match the detected intent. Omit keys for artifacts not produced.

Mode-specific overrides

Update. Apply the change, log to .decision-log.md with rationale, and surface any conflict-with-prior-decision in conflicts_with_prior_decisions[] in the JSON status. Halt blocked if intent is ambiguous.

Validate. Always write both validation-report.html and validation-report.md to {doc_workspace} regardless of finding count. Always include "offer_to_update": true in the JSON status. Skip the browser-open step in references/validate.md — write the artifacts and return.