Files
do-operator 87d3407873 feat(docs-site): align the docs with the bmadcode design system, and move diagrams to themed SVG (#2850)
* feat(website): restyle the docs in the bmadcode design system

The docs carried a Ghost-blog theme: Inter and Space Grotesk, a #3b82f6
accent, 12px radii, tinted panels and hover lifts. bmadcode.com is built
from the foundry ramp on paper, Archivo and IBM Plex Mono, one
accent held under ~2% of the page, 2px corners and hairlines. This aligns
the two so the method and its documentation read as one thing.

Four type registers, and almost nothing else: Instrument Serif for the
page masthead, Archivo 600 for headings, Archivo 400 at 17px for prose,
and IBM Plex Mono at 11px for labels — spent once per section, never on
prose or a table header. The measure comes down to 46rem so a page reads
as an article.

Also fixes the site title, which was the only place in the repo spelling
the brand "BMAD Method"; it now matches the prose, and every page title
and share card with it.

The four component overrides are the parts CSS could not reach: the mark
in its ink tile, the accent eyebrow naming each section, and the dark
footer band. The footer renders from TwoColumnContent rather than the
Footer slot because Starlight right-aligns the content column
(--sl-content-margin-inline: auto 0), so a band in that column never
reached the sidebar edge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* feat(website): inline hand-authored SVG diagrams

Diagrams shipped as rasters: build-diagram.png at 488 KB, plus a -fr and
a -ko export of the same picture. Every translation meant re-exporting an
image, three of the five locales fell back to the English one, and none
of them could follow the site's light and dark themes.

Diagrams are now hand-authored SVGs carrying geometry and classes only.
A rehype plugin inlines them where a page links to one, so a single
stylesheet themes every diagram — an <img> is opaque to page CSS, which
is the whole reason for inlining. A second diagram written against the
same class vocabulary matches the first without any styling work.

Labels are translated rather than redrawn: each <text> carries a data-i18n
key and the strings live in <name>.labels.json, so one drawing serves
every language and a translation cannot drift out of shape.

The integration exists because the inlined SVG lands inside Astro's
content layer cache, which is keyed on the markdown file. Editing a
diagram left the previous drawing on the page, through a build that
reported success. It watches the diagram directory in dev and drops the
content store when the drawing changes.

Diagram.astro is the same behaviour for anywhere that can take a
component. The docs are 193 .md files and no .mdx, where components
cannot be imported, so the plugin is the path pages actually use.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(build): draw the bmad-build run as a themed SVG

Replaces build-diagram.png and its -fr and -ko exports with one drawing
shared by all five locales: the actors in a left lane, the spine down the
middle, a return channel for BAD_SPEC and INTENT_GAP, and the review
lenses in a panel — the layout the original had.

Gzipped, the diagram goes from 440 KB to 1 KB, and it now follows the
theme. The French labels are in place; the other locales fall back to the
English text in the SVG, which is what their pages showed before.

The raster files stay for now: walk-through-a-change still uses
walkthrough-diagram, and that conversion is a separate change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(website): let the diagram cache stamp survive a fresh checkout

The stamp is written into Astro's cache directory, which does not exist
until Astro creates it partway through the build. On a clean clone — CI,
every time — the integration threw in astro:config:done and took the
build with it.

It now creates the directory, and treats any failure as a warning: a
cache that cannot be stamped is a slower build, not a broken one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(walkthrough): draw the walkthrough run as a themed SVG

Replaces walkthrough-diagram.png and its -fr and -ko exports with one
drawing shared by all five locales, keeping the original's layout: the
two inputs in a left lane, the five stages down the spine, the notes
beside them, the early exit skipping the middle, and the three outcomes
along the bottom.

The outcome chips introduce a `chip` class in the shared stylesheet,
taking the green and amber the asides already use, so a green in a
diagram is the same green as a tip. Nothing else about this diagram
needed styling: it inherits the vocabulary build-run established.

With both diagrams converted, website/public/diagrams is empty and the
six raster files are gone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(plan): fold the remaining diagrams into the themed pipeline

planning-skills, development-paths and bmad-delivery-loop were already
SVG, but outside the pipeline in three ways: they carried their own
palettes, they were served as <img> so page CSS could not reach them,
and two of them shipped a -ko twin that duplicated the geometry to
translate the labels.

Two were drawn dark — navy grounds, white text, cyan strokes — so on a
light docs page they sat as dark panels. Their palettes are mapped onto
the shared tokens, which flips them correctly in both themes, and their
backdrops are dropped: a diagram sits on the page's ground rather than
painting its own. The hardcoded typefaces go too, so they inherit
Archivo and IBM Plex Mono like everything else.

The Korean strings are lifted out of the -ko files into the label files,
matched by document order, so all five diagrams are now one drawing per
diagram. docs/images is empty.

Also fixes the cache guard, which was clearing the wrong store: build
writes to the cache directory, dev writes to .astro beside the config,
and the stamp was shared between them so whichever ran first consumed
the invalidation. It is now per command and build-only — deleting the
store under a running dev server leaves the content layer unable to
render, so dev needs a restart after a diagram edit instead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(diagrams): align the imported diagrams with the shared vocabulary

Mapping the old palettes onto the theme tokens made those three diagrams
theme-aware, but not part of the system. They still carried 8-16px
corners, painted their own canvas panel or background grid, drew every
connector in the accent, and left arrowheads baked to a colour of their
own — so next to build-run and walkthrough-run they read as imports.

They now use the same roles as the two authored diagrams: .node for
boxes, .edge for connectors, .head for arrowheads, 2px corners, and no
self-painted ground. Accent drops out of all five: it is for the one
thing a drawing points at, which here is a single .node.hot on the
destination box rather than a green that read as a status.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore(docs-site): record hast-util-from-html in the lockfile

The dependency was declared in package.json during the move to docs-site
but its entry never reached the lockfile's root block, so the two
disagreed about what the site depends on.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(diagrams): land the arrowheads on their targets in build-run

Three arrows pointed at glyphs rather than at boxes, and all three fell
short: DEFER stopped 10px from the document and aimed at its corner
instead of its body, REJECT stopped 27px from the discard glyph, and the
result returning to you stopped 21px from the person.

The boxes were fine throughout — every arrow into a node already landed
within 2px. What the three had in common is that a glyph sits inside a
translated group, so eyeballing them against the drawing's coordinates
put the endpoints in the wrong place.

Measured across all twenty arrowheads in screen space afterwards: the
largest remaining gap is 3px.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(diagrams): move the DEFER label off its own curve, and clear the
 cache on a dev start too

Re-aiming the DEFER arrow at the document glyph swung its curve left,
straight through the label that had been sitting clear of the old path.
The label moves into the pocket between Present and the curve.

Checking it exposed a worse problem: dev was still serving the previous
drawing after a restart, so the fix looked like it had not applied. The
cache guard had been narrowed to build-only after clearing the store
under a live dev server broke rendering — but that failure came from
clearing on a mid-session restart, and the watch that caused those is
gone. On a cold start, before the content layer loads, clearing is safe
in both commands. Confirmed by probe: edit a diagram, restart dev, the
edit is served, no errors.

So the limitation is now what it was documented to be. Previously an
edited diagram needed a full build before dev would show it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(diagrams): give every connector an arrowhead, and clear the boxes

Three defects in development-paths, all inherited from the import:

Connectors were written as two subpaths in one path element. A marker-end
lands on the last vertex of a path, so only the second segment ever drew
a head — which is why Change—Edit had none and Edit→Verify did. Four
connectors are now separate paths, and all twelve carry a head.

The two routed connectors ended exactly on the box they point at, so the
arrowhead sat on the border. They stop 4px clear.

The epic row was 140/130/130 wide with the labels centred on each box.
All three are 140 now, evenly spaced, with the connectors and labels
following.

Band backgrounds were imported as .node, which made every check treat a
connector crossing its own band as an error. They are .band now: same
appearance, but the drawing says what it means.

Also moves the DEFER label in build-run back alongside its curve. The
previous fix pushed it clear of the line and lost the association.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(diagrams): one stroke weight across all five drawings

build-run and walkthrough-run carry no inline stroke-width — the
stylesheet owns it, at 1.5 for a connector and 1 for a box. The three
imported drawings still carried their own: 2, 3, 4 and 2.5, so their
lines were twice as heavy as the authored ones.

That is also what made the arrowhead into "Build × stories" look wrong.
A marker scales with stroke-width by default, so a head defined at 7
units rendered at 21px on a 3px line instead of 10.5px. On a 9px final
drop it overshot the corner and sat on the horizontal run above the box.

Sixty inline stroke-widths are gone, and the two routed connectors get a
longer final drop so the head has room to sit on.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* test(docs-site): cover rehype-inline-diagrams, and fix what it caught

Twelve tests alongside the existing plugin suite, against a temporary
site root: what gets inlined and what is left alone, label substitution
per locale with fallback to the authored English, the accessible name,
and the mtime-keyed re-read the dev server depends on.

The first run failed on the accessible name, and it was right to. hast
camel-cases ARIA attributes, so the guard read `aria-labelledby` and
found nothing — meaning every diagram's own <title> was being replaced
by the markdown alt text. build-run and walkthrough-run both title
themselves with a sentence describing the whole run, and both were
announcing a four-word alt instead.

Now 119 assertions, and a diagram that names itself keeps its name.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(diagrams): recover the Korean walkthrough labels, and correct the guide

Review caught two things.

The style guide sent contributors to website/src/diagrams/, the path
this branch renamed. A diagram placed there would never be found by the
loader or localized.

The second is a regression this branch introduced and the PR described
wrongly. It claimed the non-English pages "fall back to the English text
in the SVG, which is what their pages showed before". That is untrue for
four pages: they had localized exports, and replacing those with one
drawing plus an English-only label file puts English labels in front of
readers who previously had their own language.

walkthrough-diagram-ko.svg was an SVG, so its Korean is recoverable and
is now the ko-KR label set for walkthrough-run — all 22 keys. The other
three were .webp exports, so their text cannot be lifted out:

  ko-kr build-a-change        build-run ko-KR       0/30 keys
  fr    explanation/build     build-run fr-FR      13/30 keys
  fr    build/walk-through    walkthrough fr-FR     0/22 keys

Those need a translator. The 13 French keys are mine and unreviewed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* i18n(diagrams): complete the French and Korean diagram labels

Fills the three gaps review found: build-run had no Korean and only 13
of 30 French keys, walkthrough-run had no French. All four sets are now
complete.

Terms come from the repository rather than fresh coinage. Korean reuses
what the -ko diagrams and the Korean pages already established — 의도,
구체화, 계획, 검토, 결과, 사양 — and French follows the vocabulary of
docs/fr/explanation/build.md: revue, intention, résultat, implémentation,
spécification, and visite guidée from the French walkthrough page.

The uppercase edge tokens stay as they are. PATCH, REJECT, BAD_SPEC,
INTENT_GAP and DEFER appear in no locale's prose, so they read as
protocol constants, the way bmad-build and path:line are already left
alone in the Korean set.

French runs longer than English and these are fixed-geometry drawings,
so both French pages and the Korean one were checked for labels
overflowing their box, sitting on a connector, or colliding: none.

These are my translations, not a native speaker's. Worth a pass from
whoever owns each locale before release.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(docs-site): satisfy the repo's lint and format rules in the new tests

The diagram tests used .forEach to walk the hast tree, which this repo's
eslint config rejects (unicorn/no-array-for-each), and the file was not
Prettier-formatted. CI had been failing on lint since the tests landed.

Rewritten as for…of and formatted. Verified against every gate the
workflow runs — lint, format:check, test, build — rather than the build
alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(website): describe the source of the theme without naming a private repo

The comments cited the private repository and file paths it was ported
from. They point at bmadcode.com instead, which is the public thing a
reader can actually check.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(website): keep footer links in the reader's language

The footer prefixed only BASE_URL to root-locale paths, so a French or
Korean reader following any internal link landed on the English page and
lost their language for the rest of the visit.

The links now carry the page's locale. Every target exists under every
locale — Starlight generates the untranslated ones as fallbacks — so this
is safe rather than a trade of one broken link for another: all 36
routes, 6 links across 6 locales, resolve in the built site.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 01:26:54 -04:00

12 KiB

title, description, sidebar
title description sidebar
Choose a Planning Path Choose the smallest BMad path that safely fits a software change, from a trivial edit to a multi-epic project.
order
1

Use this page to decide how much planning a change needs. The answer turns on one question: is the intent already well defined? If it is, feed it to bmad-spec, which shapes it to the size of the work, and build. If it is not, the other pages in this chapter are how you get a defined intent. If the work belongs to an organization, with a PRD other people must approve and several engineers building in parallel, read Plan Inside an Organization first; it says how this chapter fits the process you already have.

Start from the Intent

A well-defined intent says what should be true when the work is done, what must not change, and what is out of scope: complete enough that someone else could build it without guessing, and no longer than that. Where it came from does not matter: a sentence, an issue, a forged idea, a research report, a PRD.

Keep the input short. bmad-spec reads everything you give it in one pass, and the practical ceiling is a few tens of thousands of tokens, roughly a 40-page document. Hand it a pile of raw documents several times that size and it silently loses the parts that mattered; condense them first. If the spec says the input is too thin, you are not done on this chapter yet.

  • Well-defined intent: run bmad-spec with it. A spec that fits one Build session goes straight to bmad-build; an epic-sized one gets Story Breakdown and a Build per story. See Define Requirements and a Specification.
  • Anything else: the intent is not ready yet. Use the pages below until it is, then run bmad-spec. The spec skill writes the contract; it does not help you figure out what you want.

If the change fits one implementation session, you are on the Build page's territory, not this chapter's: Build a Change covers sizing a session and whether a small change needs BMad at all.

:::note[Prerequisites] Install BMad before using Build or another BMad workflow. You don't need BMad for an obvious, low-risk edit. :::

Get to a Well-Defined Intent

These are independent tools, not stages. Pick the ones the gap calls for, in any order. None of them build anything. Condense what they produce and hand bmad-spec the result, not the raw pile.

The intent is missing Do this
A clear idea at all, or confidence the idea is good Explore and Validate an Idea
Evidence a decision should rest on Research a Decision
A written account of what the product is, for a PRD or a pitch A brief or PRFAQ: Define Requirements and a Specification
Shared decisions several epics or agents must follow Design UX and Architecture
Agreement, ownership, and sign-off among several people or teams A PRD as the document the organization owns: Plan Inside an Organization

A short list of decisions is often enough on its own. You need a PRD when more than one person must agree on what the product is, or more than one epic must not diverge; otherwise skip it. A multi-epic product runs bmad-spec once per epic with those documents as sources.

Planning Skills and What They Produce

Every skill in this chapter writes a document you can hand on. The table runs from analysis through planning to solutioning; each chapter page is linked from the first skill it covers and explains when its skills fit. In an installed project, bmad-help recommends the next one.

Skill Purpose Produces
bmad-brainstorming Generate ideas with a facilitated session (Explore and Validate an Idea) brainstorm.html keepsake plus an optional brainstorm-intent.md
bmad-forge-idea Pressure-test an idea until it hardens, proves out, or dies cheaply forge-report.html every run; forged-idea.md when the idea hardens
bmad-deep-recon Research a subject to support a decision (Research a Decision) Cited research.md plus an optional HTML briefing
bmad-product-brief Capture the product vision when the concept is clear (Define Requirements and a Specification) brief.md + addendum.md
bmad-prfaq Stress-test a product concept customer-first, working backwards from the press release prfaq-<project>.md
bmad-prd Create, update, or validate a PRD Create/update: prd.md, addendum.md, .memlog.md; validate: HTML + .md report
bmad-ux Record how the product looks and behaves (Design UX and Architecture) DESIGN.md, EXPERIENCE.md, .memlog.md
bmad-spec Condense any intent into a short contract; break it into stories on request SPEC.md + companions under specs/spec-<slug>/; optional stories.yaml
bmad-architecture Make the technical decisions that keep separately built parts consistent ARCHITECTURE-SPINE.md by default
bmad-create-epics-and-stories Break requirements into epics and stories (Break Work into Stories and Track It) Epic files with stories
bmad-sprint-planning Check readiness before implementation, then track story status PASS/CONCERNS/FAIL + sprint-status.yaml

bmad-prd has three intents, create, update, and validate; say which one you want when you invoke it, or it will ask. bmad-product-brief feeds bmad-prd, which reads the brief during discovery, but neither requires the other.

Three columns of planning skills and the files each writes: analysis (brainstorming, forge idea, deep recon, product brief, PRFAQ), planning (PRD, UX, spec), and solutioning (architecture, epics and stories, sprint planning), all handing off to bmad-build, one session per unit

Size Follows the Intent

The size of the intent decides how many Build sessions follow. One coherent outcome that needs several sessions is an epic. Work that spans several epics, or likely needs roughly 20 or more sessions, is a project. Scope is only one signal: use more planning when the work has high risk, unclear requirements, broad architectural reach, cross-system effects, or coordination between people or teams.

Four nested paths reuse the same unit: edit directly, run one Build, repeat Build across an epic, or repeat epic paths across a project

Every path uses the same implementation unit. Larger work adds shared context around that unit and repeats it; it does not switch to a separate delivery system.

Run the Path

1. Start Epic-Sized Work

Use this path when the work needs several Build sessions but still has one coherent outcome.

Define and divide the epic

  1. Run bmad-spec with the epic intent. See Define Requirements and a Specification for what a spec contains and when it is enough on its own.
  2. Ask for Story Breakdown. This creates the ordered stories.yaml beside SPEC.md.
  3. Review the proposed order and decide which stories need a checkpoint.

The story list is an execution plan, not a promise that nothing will change. Update the spec and re-run Story Breakdown when earlier work reveals a missing constraint, a better division, or a conflict between stories.

Establish the implementation pattern

Implement important, risky, or foundational stories with bmad-build. Early stories often settle the architecture, initial project structure, and repeated patterns that later stories will follow. Give those decisions human attention before automating repetitions of them.

Run Build once per story. Build creates or resumes that story's implementation record under the spec folder and keeps it linked to the parent spec.

Finish the epic

Verify the stories together, not only one at a time. Then run bmad-retrospective with the spec folder. Retrospective reads stories.yaml as the epic inventory and judges the combined result against the parent spec. See Finish an Epic.

2. Start Project-Sized Work

Use the full BMad flow for a greenfield product, a multi-epic initiative, or work likely to need roughly 20 or more implementation sessions.

Prepare only the planning the project actually needs from the table above (Plan Inside an Organization covers who owns which document and where sign-off happens). Then run bmad-spec per epic, track the stories with Break Work into Stories and Track It, and close each epic with Finish an Epic.

These documents coordinate implementation. They do not replace Build. Each epic still becomes a sequence of one-session units. Independent epic streams can proceed in parallel when their boundaries are explicit. Each stream needs an owner, and all streams stay accountable to the same product intent and architecture. Run integration checks and a retrospective at each epic boundary.

Dividing work can lose information: a requirement weakens, a constraint disappears, or two correct stories fail when combined. The PRD, architecture, and specs exist so later sessions can still see the whole.

After Decisions Stabilize

bmad-build-auto runs one session without waiting for human input. It does not choose the next story or own the backlog. Use it after the important implementation decisions are stable. For the worker contract, see Autonomous Development Loops.

What You Get

A path sized to the work: a spec and stories for an epic, or shared product documents plus one spec per epic for a project — each still implemented one Build session at a time.