bmad-code-org/bmad-method6 files

Bmad Spec

Condense any input — an idea, brief, PRD, transcript, or mixed notes — into a short spec: SPEC.md plus supporting files that downstream skills build from. Also updates and validates existing specs, and can break a spec into stories. Use when the user says "create a spec", "distill this into a spec", "validate this spec", "update the spec", or "break this into stories"

Specification
Skill ID
bmad-code-org/bmad-method/bmad-spec
Publisher
bmad-code-org
Repository
bmad-method
Installs
150
Files
6
Synced
Sep 16, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

bmad-code-org/bmad-method/bmad-specInstalls these files
  • SKILL.md
  • assets/headless-schemas.md
  • assets/spec-template.md
  • assets/stories-schema.md
  • customize.toml
  • module-manifest.toml

What this skill tells the agent

BMad Spec

Overview

Canonical transformer for the BMad spec-kernel ecosystem. Takes any intent input — vague idea, brain dump, PRD, GDD, RFC, brief, Slack thread, customer email, meeting transcript, mockups, mixed multi-source — and produces SPEC.md carrying the five-field kernel (Why, Capabilities, Constraints, Non-goals, Success signal) plus companion files for load-bearing content that does not fit or would bloat the kernel with expansive line-item detail. Together they are the machine contract every downstream BMad skill consumes.

Multiple skills may call to update the same spec over time.

Conventions

  • Bare paths (e.g. assets/spec-template.md) resolve from the skill root.
  • {skill-root} is this skill's install dir; {project-root} is the working dir.
  • {workflow.<name>} resolves to fields in customize.toml.

On Activation

  1. Resolve customization: uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow. On failure, read {skill-root}/customize.toml directly.
  2. Run {workflow.activation_steps_prepend}. Treat {workflow.persistent_facts} as foundational context (file: entries are loaded).
  3. Resolve config: uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root} (merges _bmad/config.toml and the _bmad/custom/ overrides). From the merged JSON resolve {project_name}, {output_folder} (under core), and {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 the user and mention that bmad-party-mode and bmad-advanced-elicitation are available for deeper exploration on any field.

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

The spec is always a folder named {workflow.spec_output_path}/{workflow.run_folder_pattern}, resolving by default to {output_folder}/specs/spec-{slug}/.

{slug} describes the thing being specced, not the input shape:

  • Source artifact already carries a slug (e.g., prd-foo-bar-2026-05-23/): inherit (foo-bar).
  • Sparse, in-chat, or multi-source input: interactive asks; headless caller provides it as part of the input. If absent and underivable, headless blocks with error_code: "missing_slug".
  • Same slug = same folder. A second invocation with the same {slug} lands at the existing spec folder and updates in place, preserving capability IDs.

No input. Interactive: ask the user to share a file path, paste content, explain the idea in detail, or point to a source. Headless: respond with JSON containing error_code: "insufficient_intent".

Inside the spec folder:

<spec-folder>/
  SPEC.md                  ← uppercase, the kernel — DERIVED from .memlog.md, never hand-edited
  <companion-1>.md         ← optional, content-typed (e.g. glossary.md); spec-authored ones are derived too
  <companion-2>.md
  stories.yaml             ← optional, written only by Story Breakdown — fixed name, never in companions:
  .memlog.md               ← canonical, append-only memory; what SPEC.md is distilled from

Memory and derivation

.memlog.md is canonical — an append-only, chronological record of every decision, constraint, capability (with its stable CAP-N), assumption, open question, and bit of user direction, one line each in the order it happened, never edited or reordered. SPEC.md and every spec-authored companion are derived on each run from the memlog (the decision-of-record) plus the sources it cites for raw content — never hand-patched.

Deriving the contract from a living log instead of editing the contract in place is what lets the steps around the spec (PRD, UX, architecture, epics) run in any order and feed the same spec without merge drift: the log only accumulates, the artifact is re-rendered. So the spec is updated only by re-deriving it here — bmad-spec is its single writer; a hand-edit to SPEC.md from outside is unsupported and is overwritten on the next derive.

Writes go through the shared script — {project-root}/_bmad/scripts/memlog.py, the same location as resolve_customization.py (atomic; never read it back except to resume):

  • uv run {project-root}/_bmad/scripts/memlog.py init --workspace {spec-folder} --field topic="<what is being specced>" — once, at create.
  • uv run {project-root}/_bmad/scripts/memlog.py append --workspace {spec-folder} --type <decision|constraint|capability|assumption|question|direction|note|event> --text "<one-line gist, reason included>" — as each lands.
  • Terminal moments (a validation verdict, "spec finalized") are --type event entries; the memlog carries no status field.

The Operation

Read the input and its ancillary linked materials. If there is no input, follow the no-input branch in Workspace (ask or block). If a prior .memlog.md exists at the target folder, read it — the operation becomes an update, and the memlog (not the rendered SPEC.md) is the authority on what was decided and on capability IDs. Preserve those IDs; new capabilities get the next unused CAP-N; never reuse retired IDs. Otherwise this is a create, and the first move is memlog.py init.

When the input is structured and pre-sorted (a PRD with an addendum, a GDD, a brief produced by an upstream BMad skill), trust the authored separation: lift kernel-fitting content into SPEC.md, lift overflow into appropriately-named companions. When the input is mixed (a brain dump, a transcript, an RFC, a customer email), do the sorting yourself: walk each claim, apply the three-lens load-bearing test (Spec Law rule 7), and route to the kernel field or a companion.

Distill the input into the five-field kernel using {workflow.spec_template} as the skeleton. When input is rich, extract directly — no elicitation. When input is sparse, choose: express (best-effort distill, every gap becomes an open_questions[] entry) or guided (walk the five fields with the user one at a time). Headless defaults to express and logs the choice. Interactive asks.

A recognized domain implication the input leaves unaddressed is such a gap — name it as an open_questions[] entry (healthcare input silent on PHI/HIPAA, payments silent on PCI, control systems silent on fail-safe) and move on. Flag it; never invent the answer or coach toward it. If these dominate, the input is too thin — suggest bmad-prd.

Write lean from the first pass: every sentence must earn its place. Decoration costs tokens and dilutes downstream readers.

Log each decision, capability, constraint, and accepted change to .memlog.md as it is made — that running record is what the render reads. Because the log is append-only, a later entry supersedes an earlier one on the same point while the history stays intact. When two currently-live sources or companions disagree on the same field, or an either/or never got resolved, surface it to the user rather than silently choosing — the resolution is itself a new memlog entry.

If the input is genuinely too thin to distill (e.g. "an app for hikers" with no surrounding context), stop and suggest bmad-prd (or sibling ceremony skill). This skill distills; it does not coach.

Load-bearing

A claim is load-bearing if any consumer (downstream skill, implementing agent, verification pass) would change a decision without it.

Companions