Commit Graph
383 Commits
Author SHA1 Message Date
Brian Madison fb28c032fb feat(skills): readers, agents, migration, help and docs name Sofia and the ticket file
bmad-build and bmad-build-auto load the active node's ticket file as the capability contract; bmad-architecture adopts the spine into the ticket's References through Sofia; the planning skills' closing offers name her SPEC capability; John's and Amelia's menus drop the items that invoked the retired skills and Sofia joins the roster.

bmad migrate renders a v6 spec into the epic file, folds a pre-release spec-<slug>/ into its ticket (memlog entries in order, companions beside the ticket, CAP ids mapped to R), turns a loose spec folder into a backlog story, and drops the retired customization keys with a note. Help and docs describe one path: the initiative, epic or story file is the spec at its level, Sofia fills its requirements from what the user has and slices from it.
2026-10-11 22:00:01 -05:00
Alex Verkhovsky a3eb85201d feat(skills): rewrite bmad-qa-generate-e2e-tests as a rendered workflow (#3065)
Convert the skill to the render_skill.py shape and replace the generic
test-writing bullets with a workflow that finds its target the way code
review finds its diff, learns the project's existing test setup, writes
one independent test per scenario, classifies failures instead of
bending tests to pass, and reports in chat. Drop the checklist and the
test-summary artifact, register the skill in the render tests, and
describe the chat report in the build page and the help files.
2026-10-06 17:10:00 -07:00
Alex Verkhovsky 0fe55ba2c6 docs: remove docs translations (#3047)
* docs: remove locales from the site and the repo

The docs site no longer carries five locales or the config that published them.

* docs: strip diagram translation

The site no longer swaps diagram labels, so the SVG text is the only copy.

* docs: remove dead locale branches
2026-10-06 09:02:52 -07:00
Brian 6a0a068eeb feat(toolsmith): Toolsmith module replaces BMad Builder (#3038)
* feat(toolsmith): add the Toolsmith module with Smithy and bmad-eval

Smithy (bmad-toolsmith) builds, converts, reviews, packages, validates and migrates skills, agents and modules from a conversation, with five quality lenses that run after each build. bmad-eval runs baseline, variant, quality and trigger evals. The bmod-toolsmith record and help topics replace the BMad Builder module.

Also: validators treat a nested SKILL.md as a template and skip example assets, and the docs site gains a Toolsmith section with stub pages.

* fix(toolsmith): memory as small files, name learned at First Breath, uv-only script calls

Memory agent shape:
- The sanctum drops the single curated MEMORY.md, INDEX.md and the 14-day pruning of session logs. Memory is small files by subject under memory/<kind>/, standing subjects by slug and events by date and slug, plus a write-once raw/ layer for material the owner hands over, with status and distilled_to frontmatter and distillations that link back with source:. memory/pending.md holds what to raise at the next waking.
- HOW-I-REMEMBER.md replaces memory-guidance.md: a short guide to the layout, printed at every waking. It took a new name so nobody reads it as the old store.
- wake.py prints the identity files and a generated map of memory/ and raw/ (folders with counts, newest dated files, undistilled raw, pending), never the memory bodies. An incomplete sanctum is reported by the files it lacks.
- init-sanctum.py reads no config and writes no placeholder owner name or language; setup stopped recording core.user_name and core.communication_language, so it had been writing "friend" and "English" into BOND.md. It now finishes a sanctum an earlier run left incomplete instead of skipping it, which had left the agent unable to wake or be born.
- First Breath opens by asking what to call the owner; the reply sets the name and the language, written to BOND.md. The bootloader's config step is gone.
- Pulse distills, merges and refreshes in place instead of pruning to a token count. New intake capability template for agents handed transcripts, recordings, notes or documents; the shape's memory gradient offers it.
- Tests for both scripts in scripts/tests/test_memory_agent_scripts.py: birth, resume after a cut-off birth, leave a finished sanctum alone, the waking map, pulse.

Scripts run under uv:
- scan_paths.py gains the python-call rule for python, python3 -m and pip invocations in prompt files, with a test, so the lens round replaces them with uv run. Standards and the memory guide say it in words.

Lenses, standards, the shape file, the help topic and the design doc are updated to match.

* fix(toolsmith): customization has one writer, memory agents tend without a schedule, bare run is a measurement

Standards, the plain-skill and agent shapes and the customization lens say that resolve_customization.py reads and the bmad-customize skill writes: a skill never writes _bmad/custom/, merges TOML itself, or carries a fallback reader for when _bmad/ is absent, and tells users to invoke bmad-customize in one line, offering its install when absent. scan_scripts flags custom-io (a literal naming _bmad/custom or a .user.toml) so the lens round removes such scripts.

The memory agent's distill, merge, refresh and raise pass moves from PULSE.md into HOW-I-REMEMBER.md; Pulse only runs it on a schedule. wake.py prints when memory was last tended (memory/.tended) and the session notes written since, and the bootloader tends when notes build up, before greeting or as the session winds down. Standing files replace their sections and append only to History, at turning points; session detail lives in the dated session note. First Breath writes unfinished items, the agent's name included, to memory/pending.md; open-questions.md is gone.

Discovery no longer runs every request through a bare subagent and drops the skill when the model copes. A skill that holds a format, preference or convention is warranted by that alone; the bare run happens only when the skill claims to teach the model, the target model is fixed and the user has not asked for speed or autonomy, and it runs the trigger phrase, not the specification. Discovery asks where the skill will run; a distributed skill's comparison belongs to bmad-eval's baseline mode at ship.

* feat(toolsmith): ask how a skill registers with bmad, rebuild help to teach, changelog

Registration: no build had asked whether a skill joins a module, gets its own record or stays outside the registry, so every skill shipped wired to BMad with no bmod.toml. registry.py reports the installed records, prefixes, bmad version, skills-repo state and unregistered skills; discovery guesses by rule and the read-back carries a Registration line; the pre-pass reports bmod_kind, ship writes the missing record files when it does not match, and the architecture lens flags wired-but-unregistered skills. The single-skill shape counts "the user wants bmad to know it", the multi-skill shape gains a joining section, and every approach scaffolds from the registration line.

Help: bmod-toolsmith/help grows from six files to twenty-three small named topics so the bmad help agent can teach as well as route: one file per shape, four craft topics, registration, five walkthroughs, and verified outside references. The router gains prerequisites and drops the docs-site fallback.

Changelog: Unreleased entry for Toolsmith replacing the BMad Builder module.

* fix(toolsmith): eval runner is harness-neutral, runs are contained, failures exit non-zero

bmad-eval shipped one Claude Code adapter and defaulted to Claude's skills folder,
config variable and stream format. No adapter ships now. The skill declares
[workflow.harness] in its customize.toml (command, skill_dir, home_env, auth_env,
env_passthrough, sandbox), empty by default; the model running the first eval works
the facts out for its own CLI and records them through bmad-customize, and the
runners read them back through the project's customization resolver (--harness
<json> for a project without BMad). Trigger detection is a canary token the staged
skill asks for at the start of the reply, so no transcript format is parsed.

From the PR review: fixture paths and case ids stay inside the case folder; the
skill under test is copied into each case, never symlinked; run folders never
collide; errored, timed-out or command-not-found runs exit 1 and a missing harness
exits 3; a trigger query with a failed attempt is unmeasured, never a pass; the
benchmark leaves incomplete runs out of its means; the run records the command and
whether a sandbox contained it. Shared pieces live in scripts/eval_common.py with
tests against a fake harness.

Windows CI: count_tokens sorts by posix string and scan_paths reports posix paths.
Help: evals.md says which harness runs an eval and how that is recorded.

* fix(toolsmith): eval runs in a clean room outside the project; harness is four keys

From a Codex run of the harness-neutral runner: a fresh config folder logged the CLI
out, a workspace staged under the project still saw the project's instruction files and
installed skills as ancestors, the runner kept YAML quotes in the description, and trigger
attempts kept too little. Each attempt now runs in a temporary folder outside the project,
made a git root, with the fresh HOME beside it, and the workspace is copied back as cwd/;
stdin is closed; parse_skill_md removes YAML quoting; every attempt keeps prompt,
transcript, stderr, timing and workspace; token counts come from any turn-level usage block.

The harness collapses to four keys: command, skill_dir, env (a table; a value is set as
given with "~" meaning the fresh HOME, an empty value forwards the host's) and home_files
(files or folders under the host home that keep the CLI logged in). home_env, auth_env,
env_passthrough and sandbox are gone; a sandbox is the front of the command. The reference
is six lines of guidance and two shapes that ran: Codex (auth.json) and Claude Code on a
Mac (keychain linked, USER forwarded). Both passed a real trigger eval. Unattended with
nothing recorded, the skill stops and shows the table rather than writing customization.
2026-10-05 21:10:22 -05:00
Brian Madison 2fe54695d2 fix(ticket): refuse a duplicate tracker_id and cut the risk, criteria, and done-when rules to one line each 2026-10-03 00:29:51 -05:00
Brian Madison 88a514738f feat(ticket): settle risk in the build plan, cut customize.toml to settings, and drop estimation
Follows an outside review of bmad-ticket and a review of its customize.toml.

Script (tickets.py)
- next lists an entry with an open `unknown` under `blocked`, with the question on the row; once the entry is pulled, the `Unknown:` lines of the file's Notes count instead. A ticket waiting to be refined is still `ready_to_refine`.
- Rows of next, status, and find carry `drift`, `risk`, `plan_checkpoint`, and `done_checkpoint`. `risk` is the file's once pulled.
- find returns empty `description`, `verify`, `references`, and `notes` once a leaf file exists, and `epic_file` is the initiative's file for a leaf directly under one.
- `next_id = <n>` at the top of a tickets.toml is a floor for the next id; the move procedure writes it so a moved entry's id is not reused.
- Estimate totals removed; a user-given `estimate` is still carried.

Customization
- customize.toml holds settings only: the universal keys, `publication`, an empty `slice_to_epics` (the team's own boundary rule), empty `checks.<scope>` arrays (the team's own checks), and the template paths.
- The epic boundary rule, typical story count, opening and closing stories moved into references/slice.md; the one-epic guard applies under a team's rule too. The criteria rule and the risk definition moved into references/ticket.md. The shipped checks moved to references/validate-checks.md, which the validation subagents read by path.
- Activation resolves the whole `workflow` table once; no reference triggers a resolver call.
- `scoring`, `acceptance_criteria`, `ordering`, `slice_to_tickets`, and `estimation` are no longer keys. A team override still setting them is not read.

Risk
- One score, the higher of what a mistake costs and how easily one gets past review, with the fixed values low, medium, high. A high-risk ticket names one outside check in Notes.
- bmad-build and bmad-build-auto score `risk` at step 2 and write it into the plan's frontmatter, starting from the ticket's value and raising it when the investigation shows more; bmad-build lowers it only on the user's say, bmad-build-auto never. A CI process can read it from the plan.
- slice.md proposes `plan_checkpoint` on a high-risk entry. Severity definitions moved into the bug template.

Estimation removed
- references/estimate.md, the `[workflow.estimation]` table, `estimate` and `estimate_basis` in the templates, the "size this epic" trigger, and the mentions in slice.md and board.md.

Prose
- The store-switching paragraph in store-setup.md is removed.
- board.md: `unknown` and `drift` rows in the table of keys to act on; who enforces checkpoints (the orchestrator, not bmad-build-auto); a tracker status two states share keeps the ticket's current state, else the earlier one; published containers are queried on sync; the move procedure writes `next_id` first.
- Wording conflicts fixed: test stories vs the closing suite, the before/after criteria rule vs a bug's "no change needed", the spec offer (now only in slice.md), when a file is created, the story template's "Gates work: a spike".
- Intake: the small-epic and full-inception paths are one Epic path; the initiative path is for work needing more than one epic.
- Tracker starters connect only when the tool is not already connected, and name `claude mcp add` and `brew` as Claude Code and macOS commands.

Build skills
- The Ready for Development standard in both carries the same criteria rule as ticket.md.
- Plan template, step-02, build docs, and the unattended-builds help describe `risk`.

Other
- bmad-retrospective's evidence step notes that find's text fields are empty once an entry is pulled.
- Tests: 129 pass; new tests for unknown, drift on next and find, checkpoints, next_id floor, pulled find, initiative leaf, and risk.
2026-10-02 22:22:00 -05:00
Brian Madison f6ffa3533b feat(ticket): layer the store config, add tracker mirror, and cut bmad-ticket's prompt
Applies the nine recommendations of a quality analysis of bmad-ticket. The skill's always-loaded prompt is smaller, each rule has one home, the store config follows skill updates, and tickets.py does the mechanical work the prompt used to describe.

Prompt

- SKILL.md goes from 3,319 to 2,628 tokens. The autonomous-mode section is folded into the role paragraph, Intake is four bullets, the customization key table is a list, and the tree layout moves in from board.md. Terms gains Envelope and loses Opening epic.
- On the repo store, "what is ready" and "what is the status" are answered from tickets.py next or status without loading a reference. A tracker store goes to board.md first.
- "Refine" now means only expanding a ticket to full acceptance criteria. Going over a pulled story without writing full criteria is a "review", done only when the user asks. references/ticket.md is the one home for both, with a table of where each kind of change is written. slice.md no longer carries its own copy.
- references/board.md is reorganised: reading the tree, with one table of output keys and what to do about each; Publish; Start; Status, with who writes each status and the repo store and tracker split apart; Close, drop, move; Tracker sync. It now states once the rules the six store starters each repeated.
- references/slice.md holds the slicing method that was in customize.toml: what makes a good story, the tracer bullet, lanes, touch points, the platform baseline as the opening epic. Decisions are recorded as Decision: lines when they are made.
- references/tree-rules.md leaves the skill and becomes tools/ticket-tree-rules.md, a maintainer page for the skills that share the tree, named in AGENTS.md. No skill loads it.
- The description gains triggers for validating tickets, sizing an epic, and setting up the store.

Behaviour changes

- A prerequisite is met when it is done or in review. The starters said done only, against tickets.py.
- drift covers hitl as well as after, wherever the file and entry rule is stated.
- An entry is never deleted from an approved tickets.toml. It is marked dropped, so its id is not reused.
- Among several ready tickets, the first in build order is offered. The starters said the one that unblocks the most.
- On a tracker, a mirrored assignee lives in the leaf file; a plan with no assignee key no longer blanks it.
- First use no longer stops for store setup, and setup no longer ends in a session restart.

Store config

- The project's _bmad/custom/ticketing-store-config.toml is now a layer over the skill's starter for the store, not a copy of it. It names the store and holds only what the project sets; a key it sets replaces the starter's, tables merging key by key. With no file the store is the repo store.
- scripts/read_store.py replaces read_toml.py and reads the two layers as one. --starters lists the shipped stores.
- The starters keep only store-specific commands and facts. gh-ticketing.toml is renamed github-ticketing.toml so every file is named for its store.
- references/store-setup.md is rewritten for this: choose, write the project file, connect, prove, plus switching trackers, a status the tracker lacks, and where a house rule on a verb goes.

Customization

- Removed: refinement, container_definition, prose, estimation.leaf_scale, and the auto value of publication, whose default is now at_inception. The first three were method, not team choices; leaf_scale could not be replaced because arrays append.
- slice_to_epics, slice_to_tickets, and ordering hold only the team's own rules.
- Checks that rested on another key now name it instead of restating its default, so replacing the key changes what is checked.

tickets.py

- mirror writes what a tracker returned (tracker_id, remote, tracker_status, assignee, after) into leaf files, pulling a file when the entry has none. It writes nothing when a value is invalid or would leave the tree unreadable, and a tracker_id given alone matches only a ticket that already carries it.
- status reports next_id, the id a new ticket in a folder takes, and estimate totals when tickets carry points.
- next gives a blocked row waiting_on, its unmet prerequisites.
- drift on a status row gives the file's and the entry's value of each field that differs, instead of true.
- With no folder, next and status also report the backlog folder, and find, mark, and mirror look there for a ticket the initiative does not hold.
- A folder may be given by name alone: it is looked up under the store, then the active initiative.
- --help prints the full interface, with a description per command.

Other skills and docs

- bmad-build and bmad-build-auto recognise a dropped plan. Build says the ticket was dropped and halts; build-auto halts with "dropped plan supplied" and leaves the plan as it is. Both plan templates list dropped.
- bmad-retrospective and the bmod-method help pages say a story file exists once it is pulled, reviewed, refined, or published, not "when refined".
- The method help, docs/plan/set-up-the-ticket-tree.md, and the v6 migration describe the new store config; the migration no longer creates one.

For existing installs

- A project file that is a whole copy of an old starter still overrides the new verbs until it is cut down to store, the address fields, and what the team changed.
- An override that sets refinement, container_definition, prose, or publication = "auto" no longer has an effect.
- Anything that read drift as true, or called read_toml.py, needs updating.
2026-10-02 09:08:35 -05:00
Brian Madison f5412e3077 feat(ticket): let a ticket or epic id be letters and digits
An id was an integer only, so a v6 split story such as 2.6a could not keep its id and tickets.py refused the whole tree. An id is now a number or letters and digits, unique in its tickets.toml and never rewritten. A quoted number in after is still a tracker id.
2026-10-02 03:41:28 -05:00
Brian Madison 4a0dbc336a chore: remove web bundles
Gemini Gems and ChatGPT Custom GPTs are deprecated and are being replaced by skills on both platforms. Removes the web-bundles folder, its packager, its docs pages and the links to them.
2026-10-01 20:04:59 -05:00
Brian 5b05098b9f fix(ticket): resolve the reported ticketing issues (#2986)
* fix(ticket): resolve the reported ticketing issues

Closes #2963, #2964, #2972, #2976, #2980, #2939, #2933, #2973, #2969. Answers #2971 and the BOM/CRLF part of #2725.

* fix(ticket): address review findings on the cross-epic checks and refined wording

Report an undeclared epic once when a story's after and its epic gate both name it, and check an epic file's own gate for build order before the epic has stories. The file-name error in after now fits unpulled siblings and epic gates. estimate.md no longer reads refined in the old sense, and code review treats an empty baseline_revision as unset.

* fix(ticket): give tickets whose titles slug alike their own file and plan

Transliterating accents made titles such as "Café menu" and "Cafe menu" share a name. pull and the plan path now add the entry's id when a file or an earlier entry in the folder has the name. bmad-spec keeps the configured run_folder_pattern inside a caller-named folder.
2026-09-29 15:09:44 +08:00
Alex Verkhovsky 50d93e04a7 docs(review): explain no-plan mode and tell PR review bots to pass the intent (#2984) 2026-09-28 10:48:41 -06:00
Alex Verkhovsky 10d3802700 docs(review): explain the quick default and when thorough review must still run (#2982) 2026-09-28 10:28:44 -06:00
Brian 0d499b9b82 feat(bmad): setup cleans up renamed and removed skills; help loads only for help requests (#2981)
* feat(bmad): setup cleans up renamed and removed skills, updates and migrates in one flow

Modules list renamed and removed skills in a retired.toml beside bmod.toml,
replacing removals.txt. Setup moves _bmad/custom files of renamed skills,
offers to delete retired skills in project and global folders and drop them
from the skills CLI lock, and offers the new name's install. It reads every
active skills root, reports duplicates and skills a module ships that are
not installed.

Setup, status, update, repair and doctor are one flow in setup.md: check and
report, then update the skills, answer new config questions, refresh _bmad,
clean up, and run a detected migration on request. bmad-preview-ticketing's
forwarder is removed.

* refactor: make active_initiative a core setting

Initiatives are not specific to the method: core skills such as
brainstorming, research and party mode write into the initiative folder
too. The key moves from [modules.bmm] to [core], and core help now explains
initiatives for any module; method help keeps only what the method puts in
the folder.

* refactor(bmad): split help out of SKILL.md and load module help only for help requests

SKILL.md keeps the persona and routes setup, migrate and initiative actions
to their references without loading module help. Help and conversation load
every installed module's help with knowledge.py first, then follow the new
references/help.md: see where the project stands, answer only from module
help, and run skills or a sequence of them on request.

* fix(bmad): skip tool skills folders linked outside the project; setup-run migrations verify

* test(bmad): point USERPROFILE at the test home so the global cleanup test runs on Windows
2026-09-28 23:33:29 +08:00
Brian b5420009c4 refactor: rename bmad-preview-ticketing to bmad-ticket (#2979)
* refactor: rename bmad-preview-ticketing to bmad-ticket

The ticketing skill is no longer a preview; it is how BMad plans and tracks work. Rename the skill, update every reference, and drop the preview wording from the docs. The setup page moves to set-up-the-ticket-tree with a redirect from the old URL.

* feat: forward bmad-preview-ticketing to bmad-ticket until v7

npx skills update does not install a renamed skill. Keep the old name as a forwarder that tells preview users about the rename, gives the install command, offers to rename their custom override file, and hands the request to bmad-ticket. Add a Breaking changelog entry.
2026-09-28 13:29:49 +08:00
Brian 561eeedf38 feat(skills): retire planning and implementation artifact folders for the initiative store (#2968)
* feat(skills): retire planning and implementation artifact folders for the initiative store

Every document skill now writes into the active initiative under `output_folder`, as `<type>-<slug>/<type>-<slug>.md`, where the slug is what the document is about. `planning_artifacts` and `implementation_artifacts` are no longer read or seeded; a v6 project moves its files with `bmad migrate method`. The `bmad` skill gains `references/initiative.md` to show, switch, create, or clear the active initiative, and its help view reads the initiative folder instead of the retired paths. The repo's `CLAUDE.md` shim is removed, since Claude Code reads `AGENTS.md` natively.

* fix(ticketing): tickets live in output_folder, help runs the resolver, linter names the spine

Drops the ticketing store's separate root: the ticket tree is always {output_folder}/{active_initiative}, beside the documents, so an initiative created by the bmad skill is the one ticketing finds. The bmad help view now runs resolve_config.py when _bmad/config.toml exists instead of reading the user file alone. lint_spine.py reports the spine file, not the dependency name, for an unpinned Stack row.

* fix(docs): name the loose-work location where only the initiative folder was given

The brainstorming headless return reports the configured intent document name. The party-mode help row and four build docs say where files land when no initiative is active.

* docs: bring the English docs onto the initiative layout

The planning-skills diagram names the <type>-<slug>.md files. Planning pages state the output-folder fallback. The bmad skill replaces bmad-help everywhere, and the reference page says it also runs setup, status, migrate, and the active initiative. The v6 preview page leads with bmad migrate method. Tutorials install with the skills CLI and bmad setup. Config pages say where active_initiative lives and that output_folder carries the ticket tree. Loose path slips fixed, and an Unreleased changelog entry added.
2026-09-26 22:19:52 +08:00
Alex VerkhovskyandBrian Madison 5e33d3c03b feat(ticketing): build from the ticket tree without ticket files (#2944)
* docs(ticketing): shared rules for skills that use the ticket tree

Plan file name and place, status carried by the plan and who writes each value, how skills find the tree and run tickets.py, the baseline revision, and where code review and the retrospective write.

* docs(ticketing): backlog plans join by file stem, and a leaf file's status is read when there is no plan

* feat(ticketing): entries start without a file and take their state from the plan

* chore(tools): treat _bmad/method/scripts/ as install-only in the file reference check

* feat(ticketing): tickets.py is installed for every skill and finds the active initiative

* feat(ticketing): find and mark work on an entry that has only a plan

* docs(ticketing): board rules say who moves a ticket

* docs(ticketing): drop pull-to-start and the plan section

An entry is ready to start with no file, and the build's plan is its own file beside the leaf, so the ticketing skill stops describing a ## Plan section, a to_pull group, and publishing on pull. pull is only for refining, or for writing the file a tracker receives. On the repo store the committed tickets.toml is the publish; on a tracker publication is on_start or at_inception and the whole file is sent. spec_checkpoint becomes plan_checkpoint.

* docs(ticketing): method help and docs describe the ticket tree without ticket files

* refactor(ticketing): share tickets.py checks and test setup, and fix stale tree wording

* test(ticketing): decode tickets.py output as UTF-8, and skip the undecodable-argument test on Windows

* refactor(build): the build skills call their output a plan

Rename the build's output from spec to plan in bmad-build and bmad-build-auto with no change in behavior: plan-template.md, {plan_file}, [workflow] open_plan (no alias), bad_plan, Plan Change Log, plan-{slug}.md, source_plan, and the halt strings that name it. bmad-build records baseline_revision in place of baseline_commit. bmad-spec's spec_folder and SPEC.md keep their names. The renderer's open_plan label and the render tests follow, and a test renders both build skills with each pinned route.

* feat(build): bmad-build builds the next ready entry from the ticket tree

With no argument, bmad-build takes the first ready entry from tickets.py next,
reads it through find, and plans beside tickets.toml with the entry's ticket id.
Builds now stop at a new status, built, and never write done. tickets.py rows
carry a ref that find resolves, and a prerequisite in review counts as met.

* feat(build): bmad-build takes a named ticket and offers started plans from the tree

* refactor(build): bmad-build stops reading the old files

Drop the stories.yaml route, story_key and the sprint-status sync, and the
epic context compiled from the epics file. A tree ticket reads its epic file
and References, and takes continuity from its prerequisites' plans.

* feat(build): bmad-build-auto builds one ticket from the tree

With no work named, bmad-build-auto takes the active initiative's next
ready entry through tickets.py next and find; a named ref, ticket file,
or title resolves through find. Its plan lands at find's path with
ticket and baseline_revision, continuity comes from the plans of the
entry's prerequisites, and the run ends at built, never done. The
epic-story path no longer halts on an earlier plan in review.

* refactor(build): bmad-build-auto halts into the plan and stops reading the old files

A halt on a tree ticket runs tickets.py mark, which records the blocked
status and reason in the plan and creates it when there is none. Drop the
stories.yaml folder+id dispatch and the epic context compiled from the
epics file. bmad-build shows a blocked plan's reason and halts.

* docs(build): the loop contract describes bmad-build-auto on the ticket tree

* docs(build): the build docs and diagrams name the plan and take a ticket from the tree

* refactor(build): sweep stale story wording from the build skills and drop the dead open_plan clause

* fix(build): bmad-build-auto builds only what it is dispatched

An unattended worker must not choose its own work. Given no work it now
halts unclear intent instead of taking the first ready ticket from
tickets.py next; the orchestrator names each ticket.

* fix(build): bmad-build-auto takes a ticket only when the prompt names one

A bare ref, path, or title matched by shape could be something other
than a ticket, and was sent to find. A ticket is now a reference the
prompt calls a ticket, or a file whose frontmatter type is a ticket
type; find then resolves its plan, entry, and prerequisites.

* refactor(build): bmad-build names a ticket, then resolves it with find

Separate what counts as a ticket from the find call that resolves its
plan, entry, and prerequisites, as bmad-build-auto now does. No change
in which prompts count as a ticket.

* feat: review and retrospective from the ticket tree (#2954)

* feat(code-review): find the ticket in review through the tree and write to its plan

With no argument and nothing in the conversation, bmad-code-review runs
tickets.py status, offers the tickets in review, resolves the chosen one
through find to its plan, diffs from the plan's baseline_revision with
untracked files, and takes the claims from the commits since it. Findings
go into a dated block under the plan's Code Review section, deferred
findings included. The sprint-status tier, story_key, and the status and
sprint-status update are gone: the skill never changes a ticket's status.

* refactor(code-review): call the review's input a plan and drop the story-file route

Rename {spec_file} to {plan_file} with no alias across the steps, the
customize.toml lens and comment, and the render test. Findings go to the
plan's Code Review section whenever a plan is set and to the chat
otherwise; the baseline_revision detection, the Tasks/Subtasks condition,
and the Review Findings route are gone. The no-spec review mode becomes
no-plan, and the rule in step-04 names built as the status the build
leaves.

* feat(retrospective): read an epic folder from the ticket tree and write its retrospective there

* refactor(code-review): shorten the plan-file and ticket-tree tiers

* refactor(retrospective): drop the sprint status route, its script, and its tests

* refactor(correct-course): stop reading the epics file and writing sprint status

* docs(review,retrospective): describe code review, retrospective, and correct-course on the ticket tree

* refactor(review,retrospective): sweep duplicate rules and stale references from the epic

Say the retrospective's file name, only-write rule, and unfinished-ticket
verdict once each; describe git_evidence.py's output as the range's commits;
fix cross-references that named a missing workflow.md, a Close phase, a
Document Project input, and a step where a section or item was meant; and
align the finish-an-epic doc and help row with the plan as the status record.

* fix(retrospective): end the last plan's range at the epic's own work

A retrospective run after later work has landed counted those commits as
the epic's, since the last range ran to HEAD. When later work has landed,
the range now ends at the last commit belonging to this epic's tickets,
and the cut is recorded.

* feat: retire the legacy planning route and migrate ticket state (#2955)

* feat: retire the legacy planning route and migrate ticket state

* docs: drop the ticket-tree upgrade guide and changelog entry

Remove docs/start/upgrade-to-ticket-tree.md, its inbound links, and its
locale-coverage baseline entries. Revert the Unreleased CHANGELOG section.

* docs: keep the translated workflow map diagram unchanged

Only the vi-vn, cs, and zh-cn workflow-map pages embed this diagram, and
their text still describes the previous route.

* fix(ticketing): move a leaf's plan with it, say epic tickets need no file, write test files as UTF-8

---------

Co-authored-by: Brian Madison <bmadcode@gmail.com>
2026-09-25 22:17:11 +08:00
Brian a76af7f44e feat(ticketing): stable ids, build-owned status, plan section in the ticket (#2934)
* feat(ticketing): stable entry ids, after replaces blocked_by, table order is build order

- tickets.toml: id replaces n and is never an order; table order is the build order; after lists real prerequisites only, as a sibling id, <epic id>.<entry id>, or epic-<slug>
- leaf files are <type>-<slug>.md, joined to their entry by frontmatter id; no numbers in names
- tracker keys move to tracker_id; the repo store drops KEY-n ids and the key prefix
- pull writes only the fields the entry sets; mark adds or removes lines as needed
- templates, references, store configs, help files, and the preview doc follow

* feat(ticketing): status belongs to the build, tracker_status beside it

A leaf's `status` is the build's (draft, ready-for-dev, in-progress, in-review, done, blocked) or dropped; a pulled file has none, so a tracker's status can never make the build skip planning. On a tracker store `query` mirrors the tracker's status into `tracker_status`, which `write` never sends back. tickets.py derives a `state` per ticket for `next`, `status`, and the store maps; containers carry status only once work starts.

The `checks.set` lens on builder self-sufficiency now says a gap is fixed in the epic or the references, not by lengthening the entry.

* feat(ticketing): plan section in the ticket, refine pulls the file, find by reference

Every leaf file ends with `## Plan`, the coding agent's section; `pull` writes it empty and the store configs send the body only up to it. Refining an epic's story now pulls its file when none exists and reviews the file with the user; once a file exists it is truth and the entry keeps only id, type, title, after, and hitl current. `tickets.py find <dir> <ref>` resolves `2.1`, an entry id, a tracker id, a file name, or title words to one ticket with its path, so the board and the builders name tickets the same way.

* fix(ticketing): validate epic ids and slugs, bare numbers are sibling ids, find prefers its folder

Review follow-ups on #2934. Every epic needs an integer id and a slug, duplicates of either are errors, and an epic's after must name an id or a slug. In `after`, a bare integer is always a sibling's id and a quoted string never is, so a numeric tracker id cannot be mistaken for a sibling. `find` prefers the folder asked about when a file name exists in more than one epic. Docs: a changed `after` is written to both the file and the entry; the store configs resolve a local ticket through `find` instead of grep.
2026-09-22 15:37:50 +08:00
Brian ba252f1b33 feat(ticketing): tickets.toml, cross-epic blockers, optional refinement, dependency check before approval (#2932)
* feat(ticketing): plan epics in tickets.toml and check dependencies before approval

- An epic's planned stories live in tickets.toml beside the epic file; an initiative's
  holds its epics in build order. Containers have no Breakdown section.
- blocked_by accepts an entry or a whole epic in another epic; next and status work on
  an initiative and report gated_by, drift, and unpinned_after.
- tickets.py pull writes the ticket file from its entry, with references and notes.
- Refinement is optional: only an entry with refine = true or a ticket with no epic is
  refined before it starts. Spikes are added on request.
- checks is one array per scope and appends across layers. checks.dependencies finds
  missing blockers, and the check runs on the draft before the user approves it, for
  epics and for stories.
- Work that fits one epic is proposed as one epic.
- Shared decisions go to the architecture spine or the opening epic; touch points,
  Source conflict notes, and a closing refactor sweep are recorded.
- bmad-spec hands story breakdown to bmad-preview-ticketing and no longer writes
  stories.yaml.

* docs(ticketing): keep an entry and its pulled ticket in step for every field

* feat(ticketing): let a container name its own tracker project or team

* fix(build): treat a ticket file as intent, never as a spec to resume

* feat(ticketing): refining reviews the entries; full criteria only for bugs, tickets with no epic, or on request

* fix(ticketing): review findings on pull output, store queries, builder intake, and preview docs

* fix(ticketing): stop when an old string checks override empties the dependency checks
2026-09-22 02:37:47 +08:00
Brian f033e70a2c feat(method): add bmad-preview-ticketing skill and tickets.py runtime (#2884)
* feat(method): add bmad-preview-ticketing skill and tickets.py runtime

Ticketing at every altitude: an initiative sliced into epics, an epic
incepted into a Breakdown of stories, spikes, and bugs, and tickets
written, refined, published, and moved on a git-backed store or a tracker
(GitHub, Jira, Linear, Notion, Trello).

- Container tickets are the spec at their altitude: Requirements with
  stable ids, Outcome, Done when, Boundaries, Breakdown.
- Thin tickets carry contribution and verification; full criteria are
  written when pulled (`refined: false` until approved).
- scripts/tickets.py derives ready, blocked, and to-create views from the
  files; scripts/read_toml.py reads the store config; tests beside them.
- Store configs per tracker under config/, templates per type under
  assets/, customization surface in customize.toml.
- Listed in the bmad help catalog as a preview alternative to
  bmad-create-epics-and-stories plus bmad-sprint-planning.

* fix(method): address review findings in bmad-preview-ticketing

- tickets.py: a dropped blocker still blocks its dependents; mark clears
  blocked_at and blocked_reason on a status change and takes the assignee
  literally; --project-root finds the store config when tickets live
  outside the project; a numeric blocker falls back to the ticket id;
  duplicate Breakdown numbers and blockers naming no entry are errors.
- read_toml.py: read local files only.
- board.md: mark is the leaf-level write, a container's status is a file
  edit, and a dropped ticket is removed or repointed in its dependents.
- SKILL.md: tickets are drafted under tickets.root; persistent facts load
  file: entries.
- gh config: read children with `gh issue view --json subIssues`.
- help catalog: the breakdown includes bugs.

* docs: add a guide to testing v7 previews

A new page under Plan Larger Work for trying proposed v7 planning
changes: setting up an initiative store, configuring where tickets are
tracked, and using bmad-preview-ticketing. It states early that preview
stories are not wired into sprint planning, sprint-status.yaml, or
status updates from bmad-build, and that a story must be refined before
it is built.

- Sidebar entry and a pointer from the stories-and-tracking page.
- Locale coverage baseline records the new English-only page.
2026-09-18 14:51:57 +08:00
Alex Verkhovsky b5834a5977 feat(walkthrough): replace five-step walkthrough with guided block review (#2866)
The skill is still /bmad-walkthrough. It writes a review narrative and log
under implementation artifacts, then walks the narrative one block at a time.
Hooks are optional; empty ones are omitted. A writer subagent is used only
when the host has subagents.

BREAKING CHANGE: customize.toml no longer uses prepend and append. The
hooks are on_activation, on_block_activation, on_block_complete,
on_complete, and persistent_facts.
2026-09-15 22:51:04 -06:00
Alex Verkhovsky 23f134e2e5 feat(review): add the review lever and lens sets to build-auto and code-review (#2861)
Both skills gain a `workflow.review` selector. bmad-build-auto accepts
`none`, `quick`, `thorough`, and `auto`, where `auto` follows the
resolved route (oneshot selects quick, full selects thorough) and is the
default. bmad-code-review accepts `quick` and `thorough`, defaulting to
`thorough`; a review skill with review turned off has nothing to do, so
it offers no `none`. An invocation naming a selection passes it as
`--set workflow.review=<value>`, and any other value halts the render.

`review_layers` retires in both skills in favour of two configured, ordered
lens sets. `quick_lenses` holds the new Quick lens, an informed review of
acceptance criteria, applicable rules, and bugs that reads the spec, its
context files, and the repository's agent instructions. `thorough_lenses`
holds Blind Hunter, Edge Case Hunter, Verification Gap Reviewer, and Intent
Alignment Auditor, identical in both skills; bmad-code-review's Acceptance
Auditor is removed.

Templates render only the selected set. Under `auto` route with `auto`
review, bmad-build-auto renders both sets and the session launches the one
the fixed mapping selects. Under `none`, bmad-build-auto's step-04 drops
its staging, review, and classify sections. The bmad-build-auto story
frontmatter gains `review`, `review_source`, and `lenses_ran`.

The review docs describe the two review depths and point to
bmad-customize for the rest; the customize doc's example sets the default
depth.
2026-09-12 11:23:39 -06:00
do-operatorandClaude Opus 5 696cef5172 docs(diagrams): let the delivery loop's two slogans carry the accent (#2859)
* docs(diagrams): let the delivery loop's two slogans carry the accent

Alexey, on the merged version: "I would make both slogans stick out more -
splash of color, bigger font". He is right, and the original backs him up: it
set START ANYWHERE in gold and RIGHT-SIZED in pale blue, both larger than
what replaced them.

Dropping every colour from the diagrams - so one drawing could serve light
and dark - took that with it, and the two lines went grey and small enough to
skip. They are the only sentences in the drawing, and a reader who skips them
gets four boxes and no argument.

Both now take the accent at 22, up from 17.5 and 18, as a matched pair rather
than the mismatched ink-700 / muted-600 they had drifted into. Two colours
are not available to a theme with one accent, so the pairing the original
drew - gold for the entry promise, blue for the summary - collapses into one
hue used twice. The canvas grows 460 to 466 to hold the larger type at the
same 40 units of clearance.

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

* docs(diagrams): make the slogans banners, and give the pair two hues

The theme already had an answer for what a banner is here. custom.css says
the masthead is "display type, a lead, then a hairline closing the band, the
way every section on the marketing site closes" - so each slogan now closes on
a rule, run across the drawing's own measure, 60 to 1060, so the banners sit
on the boxes' grid rather than floating over it.

Both ends in the same accent read as one statement made twice. They are not:
the top is the invitation, the bottom the summary, and the original said so by
setting them in different colours. `--dg-accent-2` is the site's copper, the
nearest thing this palette holds to that gold, so the pairing survives without
inventing a hue. It needs a dark value of its own - `--bmad-copper` is #8a5a00
and disappears on a dark ground - and #e0b25f is that copper lifted, the value
`--dg-warn` already uses on dark.

The two rules cost height: 466 to 477.

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

* docs(diagrams): set the banners in the site's label register, and drop copper

Copper is not a palette colour on bmadcode.com. Every use of #8a5a00 there is
a status: `.tag-warn`, the gate's CONCERNS heading, `.road .st`, a flagged row
in the module pane. Putting it on the closing line said "this is a problem"
about the diagram's own conclusion. `--dg-accent-2` is gone.

Reading the live site rather than counting hexes in its stylesheet also
settles what these should be. Its uppercase labels are one register - IBM Plex
Mono, 11px, weight 400, tracking ~0.08em - in exactly two colours: #7c8797
when a label orients, #0f35e0 when it carries weight. No section head on the
site is coloured at all.

So the banners are that register, not the Archivo 700 headings they had
become, and the pair is told apart the way the site tells labels apart: accent
for the opening, which is also what the entry drops below it are drawn in, and
muted for the closing summary. They are set at 16 units rather than the site's
11px because they span the width of a drawing rather than sitting over a
paragraph - 13.3px apparent in a README, against the 9.2px Alexey objected to.

Canvas back to 465 now that the type is smaller.

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

* docs(diagrams): light the bulbs, and rule the field the original had

Two colour families ran through the original: gold for the inputs - both
bulbs, the three entry drops, the opening line - and cyan for the loop. When
the drops took the accent back, the bulbs were left outside a family they
belong to, so the drawing had a blue arrow leaving an ink bulb.

Both bulbs are lit in the accent now. The cloud stays muted, as it was there
too: it was drawn in the cool colour, not the gold, and a vague notion should
not glow like an idea.

The ruled field returns at the original's pitch, 70 one way and 140 the other,
but held between the two hairlines so it reads as what the banners enclose
rather than running out under them. Drawn in the line token, not the fixed
blue it was, so it survives both ramps - at two opacities, because the dark
line sits further from its ground than the light one and the same value that
is texture on paper becomes structure on black.

No gradient. The docs page gives this drawing no ground of its own, so a
gradient can only live in the README export, and the two would drift apart for
it.

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

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 18:59:38 -06:00
Alex Verkhovsky 94b6727b00 refactor(renderer): render skill sources as Jinja2 templates (#2857)
Replace the regex token substitution and the line-parsed bmad-if
directives in render_skill.py with Jinja2. Templates see config,
workflow, and snapshot(); undefined names, empty entry files, and
links to omitted sources halt; every value a render reaches and the
Jinja2 version key the generation. Migrate the five rendered skills'
sources to the new forms, keep their shipped output byte-identical,
and update the validator rule and the authoring docs.
2026-09-11 16:45:10 -06:00
do-operatorandClaude Opus 5 116e703d67 docs: refresh the README banner, restore its diagram, and fix the favicon (#2854)
* docs: refresh the README banner, restore its diagram, and fix the favicon

Three things the READMEs and the site were carrying wrong.

The banner is the current one from bmadcode.com: the BMad tile and wordmark
over the line art, at 2x for retina. It replaces a 1408x224 crop, and is
smaller on disk than what it replaces.

The delivery-loop diagram in the README has been broken since the diagrams
moved to `docs-site/src/diagrams`. It cannot simply be pointed at the new
path: an authored diagram carries geometry and classes only, so it needs the
site's stylesheet to have any colour at all, and a README loads an SVG as an
`<img>` where no stylesheet can reach it. So `docs/images/` now holds exports
of the source, generated by `npm run export-readme-diagrams` with the dark
ramp substituted in as literal colours. Literals rather than custom
properties because an export has to survive renderers thinner than a browser
- resvg drops `var()` and paints the fallback black. The Korean README's
copy is exported from the same geometry through the existing labels file, so
the two can no longer drift apart.

The favicon was a teal `B` that matched neither the header tile nor
blog.bmadcode.com. It is now the BMad mark, drawn from the same path data
the header already carries, on the same navy the blog uses. The .ico is
generated from the SVG and stays listed for browsers that ignore
`image/svg+xml`.

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

* docs(diagrams): draw the bulbs as bulbs, not as coloured circles

The earlier version leaned on gold to say "idea". Once the diagrams lost
their own colours, a circle over a rounded tab in the body ink read as
neither a bulb nor anything else.

So the glyph now carries its meaning in the drawing: a filament arch inside
the globe, a tapered neck, and a ribbed screw base, plus a third ray
overhead. The small bulb takes the same construction one size down, with a
single rib rather than two, which is all that reads at that scale. Both hold
up on the light and dark ramps.

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

* docs: give the delivery loop an English page, at the house type scale

The diagram the README leads with appeared on exactly one page of the site:
the Korean `how-to/choose-a-development-path`, a leftover from before the
English tree was restructured into start/plan/build. An English reader never
saw it.

It now opens "Find Your Starting Point" on the docs index, where it says in a
picture what the list underneath says in prose.

Putting it in a docs column for the first time showed its type was tuned for
a README: drawn at a 1120 viewBox, its labels came out at 11.0px and 8.3px
against the 12.8px and 10.9px the other diagrams hold at the same 736px
content width. The sizes are scaled to match; the geometry is untouched.

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

* docs-site: guard locale coverage, and give the footer band an edge

Two unrelated things a reader can see, and one they cannot.

The invisible one first. When a locale has no page at a route, Starlight
serves the English one and says nothing, so a missing translation and a
working one look identical from the outside — which is how all five locales
ended up stranded on the pre-restructure tree unnoticed (#2855). Starlight
does mark the substitution: a fallback page carries `lang="en"` on `<main>`
inside a document that declares the locale. The build now checks the built
site for that mismatch, which measures the symptom rather than inferring it
from the sidebar.

The existing backlog is far too large to fix here, so it is recorded in
`locale-coverage-baseline.json` and tolerated. The build fails only when the
picture changes: a route starts falling back, or a baseline entry stops. Both
are one `--update` away. The second failing is deliberate — it is what keeps
the baseline from outliving the problem it records.

The visible one: the footer band sets its own dark ground, which on the dark
ramp is the page's ground, so there was no band — only 297px of unexplained
space where one should have started. It now lifts a step and takes a hairline
in dark mode, and sits flush against the article instead of adding a margin
on top of its own padding. The last-updated line gives up some of its air too;
between them the gap is 234px, and every part of it is now doing something.

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

* docs-site: stack the footer columns on mobile, and add the touch icon

The footer's three link groups were laid out in two columns below 32rem, so
one group always dropped onto a row of its own with the space beside it left
empty, and "Plan inside an organization" wrapped inside a 155px column. Three
groups do not fit two columns; on a phone they get one each.

The favicon already matches bmadcode.com exactly - same viewBox, same navy
tile, same three paths, since the mark is the one the header carries. What was
missing is the apple-touch-icon the site also ships, so an icon saved to an iOS
home screen fell back to a screenshot. It is generated from the same SVG,
flattened onto the tile navy because iOS applies its own mask and does not want
the transparency our rounded corners would leave.

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

* docs(diagrams): raise the delivery loop's type, and give it back a colour

Alex is right about what he saw, and wrong about it being new. His screenshot
is the version before the type was scaled for a docs column, where the title
rendered at 9.2px against GitHub's 16px body. That is already fixed. But the
original diagram this replaced ran 14/16/21 and the fix brought it to
14.5/16.5/19.5 - a hair under where it always was, and his objection would
have applied to the original too. So rather than argue the point, take it
past the original: 17.5/18/21, which puts the node labels at body size and
the title at 14.5px in a README.

The colour is the other half of his complaint's cause. The original said
"here is where each kind of work joins" in gold; when the diagrams lost their
own colours that meaning went with it and nothing replaced it. The three
entry drops now carry the accent, which is the vocabulary's existing job for
an edge the drawing has to single out, so it works on both ramps. The marker
was still called `arrow-gold`; it is `arrow-entry` now.

The README export also gets a ground rather than a flat fill: a near-black
lifting across the diagonal with one soft accent wash behind the row the work
enters from, which is the register bmadcode.com uses - almost all ground and
one blue. The wash sits high on purpose, because centred it pooled behind the
boxes and their flat fill then read as darker than the ground around them.
The docs site keeps a ground that follows the reader's theme, so this belongs
to the export alone.

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

* docs(diagrams): drop the gradient ground from the README export

It read as an effect rather than a surface. The drawing's colour is the
accent on the three entry drops, and it says more with a flat ground behind
it and nothing competing.

The larger type and the accent stay.

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

* docs(diagrams): space the delivery loop's two band labels evenly

They were not spaced at all, only placed. The title's baseline fell three
units BELOW the big bulb's top ray - the two only looked separate because
they are far apart horizontally - while the lower band had 35 units of air.
That mismatch is what read as wrong.

Both now sit 40 units clear of the nearest mark. The drawing keeps its size
and shifts down inside a taller canvas, 420 to 460, with the labels lifted
out of its group so the shift leaves them where they are; the remaining
padding above and below the pair is 15 and 16.

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

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 11:52:35 -06:00
do-operatorandClaude Opus 5 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
Alex Verkhovsky d7d4cfffbb feat(renderer): add invocation overrides and conditional sections (#2844)
Add repeatable --set key=value arguments and an --overrides <file.toml>
file to render_skill.py. Shipped defaults, project TOML, user TOML, the
invocation file, and command-line assignments resolve into one effective
customization using the existing structural merge; persistent files are
never written.

Two --set paths that are equal or nested halt as a caller error. The
renderer keeps no separate schema of customization keys: a --set path
must exist in customize.toml, and any invocation override that reaches
no token or condition halts. Values are validated where consumed.

Standalone [[bmad-if:path == literal]] / [[bmad-else]] / [[bmad-endif]]
lines select sections before token and link resolution. A secondary
file that filters to nothing is omitted from the snapshot; workflow.md
filtering to nothing is an error. Condition inputs join the generation
identity so identical output from different inputs still yields
distinct snapshots.

Document both interfaces, ignore the per-machine skills-lock.json, and
cover precedence, equivalent forms, isolation, conflicts, unused
overrides, malformed input, nested conditions, and snapshot reuse.
2026-09-07 19:33:19 -06:00
Alex Verkhovsky 78ffe4031f docs(customize): match the TEA catalog entry to Test Completed Work (#2839)
The modules page said TEA adds risk-based prioritization and
traceability over the built-in QA skill. The page it links to compares
the two generate skills instead. Say what that page says.
2026-09-06 02:33:39 -06:00
Alex Verkhovsky a7382aef76 docs(plan): correct course syncs sprint-status after approval (#2833)
The Correct Course paragraph read as if the skill only wrote a proposal
and left all bookkeeping to the user. Checklist item 6.4 still updates
sprint-status.yaml once the proposal is approved, so say so, and keep the
story-breakdown re-run as the path for large restructures only.
2026-09-05 19:01:24 -06:00
Alex Verkhovsky fa1637ee40 build: move the Node toolchain into docs-site (#2834)
The root package.json, lockfile, .nvmrc, prettier ignore file and
.npmignore are gone. docs-site has its own package.json and lockfile
with the Astro, ESLint and Prettier dependencies, and its scripts run
relative to that directory. tools/quality.py, both workflows and the
docs all call npm inside docs-site.

stamp_release.py stamps only the 29 skill manifests now; the version
lives nowhere else on this branch. The tests for package stamping go
with it.
2026-09-05 18:11:37 -06:00
Alex Verkhovsky 33bdfb5132 feat(build): shorten completion handoff (#2822)
Build now ends with a one or two sentence summary and a one-line offer
of next steps: create a PR, use bmad-walkthrough, or make another
change. The open_spec default is empty, so no editor opens unless
customized, and Build no longer appends a Suggested Review Order to the
spec; bmad-walkthrough generates a trail in conversation when the spec
has none.

Rename the in-session route to oneshot to match the step name, and
rewrite step-oneshot in plain English. Guard sprint-status updates at
the call sites so untracked work skips the sub-step, and shorten the
sync instruction while keeping its edge cases. Resume in-progress
oneshot specs on the oneshot route instead of dispatch, which expects a
Code Map and Tasks the oneshot spec does not have.

Drop the negative code -r renderer assertions, which only pinned the
config default; the sentinel override test still covers open_spec
substitution.

Rework the walkthrough doc to open with the comprehension order a
reader should follow and why a raw diff fails at it, frame "when to
use" around understanding a change and deciding whether to ship, move
the human-versus-agentic review note into an admonition, and drop the
Review Trail section.
2026-09-03 09:48:03 -06:00
Alex Verkhovsky b0d27c3c4a fix(skills): defer all-maybe-false entries only at medium-or-worse (#2809)
Today every all-maybe-false entry routes to defer, so the deferred-work
ledger accumulates low-stakes hypotheticals that later sweeps read back
as work. Dropping the bucket wholesale would go too far the other way:
maybe-false means triage could not decide, and the claims that would be
serious if true are exactly the ones worth a durable record.

So gate the route on what the claim would be if true: medium or high
defers, with that severity marked unverified and what would settle it
as the evidence; low rejects, keeping the same note in the triage log.

Applied at the four triage sites (bmad-build step-04 and oneshot,
bmad-build-auto step-04, bmad-code-review step-03), the build-auto
deferred-list severity comment, and autonomous-development-loops.md.
2026-09-01 07:20:51 -06:00
BrianandClaude Opus 5 3aa110dfd3 fix(customization): resolve the project root from the working directory (#2802)
* fix(customization): resolve the project root from the working directory

resolve_customization.py inferred the project root by walking up from the
skill's installed directory. For a skill installed under the user's home,
that walk reaches ~ — and when a user-level install has put a ~/_bmad
there, the resolver treats home as the project, finds no override, and
returns shipped defaults. The real project's _bmad/custom/ file is never
opened, with no error and no warning.

Whether an override takes effect therefore depended on where its skill
happened to be installed, which the override's author cannot see from the
override. Every harness installs global skills under ~/<tool>/skills, so
this hits all of them identically.

Resolve from an ordered candidate list instead: the working directory
first (the project is where the user works, not where the skill lives),
then the script's own install path (skills invoke it as
{project-root}/_bmad/scripts/..., so its grandparent is a root the caller
already resolved), then the skill directory as a last resort.

Rank _bmad/ above .git at every depth while walking. A submodule or
nested repo carries .git without being the BMad project, so treating the
two as equal stopped the walk short of the root owning _bmad/custom/ —
the same silent failure, reachable by project-installed skills too.

Break the silence: when the chosen root has no override for the skill but
a rejected candidate does, write a note to stderr naming both roots.
stdout stays pure JSON.

Pass --project-root from all 44 skill and doc invocation sites, matching
resolve_config.py, which already requires it. That asymmetry was the root
cause; with the flag passed there is nothing left to infer.

Fixes #2796

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L8Hyqmp2giAVgEAnB49zEQ

* fix(customization): pass --project-root from the party and forge wrappers

resolve_party.py and resolve_personas.py shell out to the customization
resolver with --skill only, though both already hold the project root and
both pass it to resolve_config.py two functions earlier. The resolver
therefore had to infer a root, and since these wrappers capture stderr
and discard it, the note about a masked override went nowhere.

Under the old skill-directory-first inference this happened to land on
the right root for a project-installed skill; under working-directory
-first it takes the ambient root instead, which is wrong whenever the
party runs from a nested project or an unrelated worktree. Passing the
flag removes the inference for both paths rather than trading one wrong
guess for another.

Cover each wrapper with a test that captures the resolver command and
asserts the flag carries the project root it was given.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L8Hyqmp2giAVgEAnB49zEQ

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 23:01:32 -05:00
Alex Verkhovsky a2d84a39ac docs: give bmad-correct-course a home on Break Work into Stories (#2799)
Add a Correct Course section describing when to run the skill and how
its change proposal feeds back into story tracking, and point the
implementation-skill tables on Build a Change and Skills and Agents at
it instead of pages that only mention the skill in passing.
2026-08-30 15:45:09 -06:00
Alex Verkhovsky a0d04f7e34 docs: consolidate Reference and retire the Diátaxis groups (#2798)
Move Get Answers About BMad under Start and Autonomous Development Loops
under Build. Split the Workflow Map into a planning-skills section on
Choose a Planning Path (with a new planning-skills.svg) and an
implementation-skills section on Build a Change. Consolidate Agents,
Skills, Core Tools, and Advanced Elicitation into one Skills and Agents
page whose agent codes and skill list match the shipped sources. Retire
the v4 upgrade guide and the external-modules prompt, remove the How-To
Guides and Explanation sidebar groups, and redirect every retired route.
2026-08-30 14:57:25 -06:00
Alex Verkhovsky 3bc2271260 docs: add Customize and Extend chapter (#2797)
Create the Customize and Extend chapter after Existing Codebases with five
pages under docs/customize/: Customize BMad, Adopt BMad Across a Team,
Add Modules, Use Web Bundles, Run Multi-Agent Discussions.

Retire eight English pages with redirects: how-to/customize-bmad,
explanation/named-agents, how-to/expand-bmad-for-your-org,
how-to/install-custom-modules, reference/modules, how-to/use-web-bundles,
explanation/web-bundles, explanation/party-mode.

Corrections against shipped sources: the installer has no community
catalog browser (one custom/community prompt with an unverified-module
warning); bmad-prd's checklist key is validation_checklist_template; the
brief template ships under assets/; doc_standards passes run in declared
order; the web-bundle shelf personas now match web-bundles/bundles.json.
2026-08-30 04:22:29 -06:00
Alex Verkhovsky c16dc729a9 docs: add Existing Codebases chapter (#2793)
Add a four-page chapter after Plan Larger Work: Start in an Existing
Codebase (the repo is the knowledge; size the work from the source),
Set and Maintain Project Context, Getting Deeper as the worked example,
and The Theory of Project Context as optional last reading.

Retire six English pages with redirects, drop the empty English
Tutorials sidebar group, collapse Plan Larger Work and Existing
Codebases in the sidebar, reflow how-to and explanation orders, and
retarget Welcome, README, Plan, Reference, and style-guide links.
Localized copies stay as deferred translation work.
2026-08-29 11:48:29 -06:00
Alex Verkhovsky 0223cbd9d7 docs: move Finish an Epic to the Build chapter (#2791)
The retrospective reads what the coding sessions produced: the diff,
the commits, the story records. That is Build-side work on built code,
so the page belongs beside Build, Review, and Test Completed Work
rather than at the end of the Plan chapter. Move the page, its sidebar
entry, and the /explanation/retrospective redirect; retarget the
inbound links.
2026-08-29 03:18:18 -06:00
yeomin4242andBrian f194a04939 docs(ko-kr): add Korean localization (#2386)
* docs(ko-kr): add Korean translation for BMAD docs

* docs(ko-kr): add Korean translations for sidebar and banner components

* docs(ko-kr): add Korean translations for AI banner and announcement components

* docs(ko-kr): add Korean translation for workflow map diagram and update iframe references

* docs(ko-kr): update sidebar order for multiple explanation and reference documents

* docs(ko-kr): sync localization with latest docs

* docs(ko-kr): polish web bundle wording

* docs(ko-kr): polish localization wording

* docs: refine Korean localization

* docs(ko-kr): sync v6.9 documentation updates

* docs(ko-kr): polish v6.9 wording

* docs(ko-kr): sync localization with v6.10 docs

* docs(ko-kr): sync core tools with unified review skill

* docs(ko-kr): add Deep Recon documentation

* docs(ko-kr): document project context redesign

* docs(ko-kr): add delivery lifecycle guides

* docs(ko-kr): migrate implementation guides to Build

* docs(ko-kr): sync tool and customization references

* docs(ko-kr): update project context workflow

* docs(ko): sync localization with v6.11 documentation

* docs(ko-kr): polish v6.11 localization

* fix(website): polish localized docs behavior

* docs(ko): sync localization with v6.11 documentation

---------

Co-authored-by: Brian <bmadcode@gmail.com>
2026-08-29 01:04:49 -05:00
Alex Verkhovsky 191219eadb docs: add Plan Larger Work chapter (#2790)
Introduce a Plan chapter of eight pages under docs/plan/: Choose a
Planning Path, Plan Inside an Organization, Explore and Validate an
Idea, Research a Decision, Define Requirements and a Specification,
Design UX and Architecture, Break Work into Stories and Track It, and
Finish an Epic. Content is written from the current skill sources and
describes what each skill takes in, what it produces, and how to steer
it.

Retire ten English pages from how-to and explanation with redirects to
their new homes, renumber the remaining sidebar orders, migrate English
links, shrink the Welcome router bullet, and add a Plan Larger Work
sidebar group after Build. Localized copies of the retired pages are
recorded in deferred work.
2026-08-28 21:44:40 -06:00
Alex Verkhovsky 984b990367 docs: compare generate skills on Test Completed Work (#2788) 2026-08-28 16:20:45 -06:00
Alex Verkhovsky 0eb32bfe78 docs: rewrite Build a Change wait-cost section (#2787)
* docs: rewrite Build a Change wait-cost section

Replace "Why It Works This Way" with a comparison to plan-mode-plus-agent,
and send the extra-pass cost to Review a Change.

* docs: reframe Build wait-cost around review and attention

Plan-and-implement is comparable to plan mode; the extra time is
review, triage, and auto-fix, which saves human attention.
2026-08-28 13:23:03 -06:00
Alex Verkhovsky b023b5c9fc docs: add Review a Change page (#2786)
* docs: add Review a Change page

Add the Build-chapter how-to for bmad-code-review, list it after Build a
Change, redirect the deleted adversarial-review explanation, and point
the existing disclaimers, catalog rows, and a review_layers customize
example at the new page.

* docs: rewrite Review a Change around extra passes, cost, and /code-review
2026-08-28 12:10:30 -06:00
Alex Verkhovsky 6b83751711 chore(docs): drop llms.txt generation and site banners (#2785)
Stop generating llms.txt and llms-full.txt, remove the header banners,
and point help/docs at the live site.
2026-08-28 01:40:10 -06:00
Alex Verkhovsky cf0d98f030 docs: integrate the Build chapter (#2784)
Retarget remaining English first-party links to the canonical Build pages,
list the chapter in llms.txt, order Start and Build first in llms-full, and
reject superseded English routes in the published-model check.
2026-08-27 23:22:10 -06:00
Alex Verkhovsky 7e571784ed feat(build): route after design, not before investigation (#2762)
* feat(build): route after design instead of before investigation

Move the one-shot vs full-spec decision from step-01 (a prediction made
before investigation) to a route gate in step-02 that reports three facts
about the finished design: forks, irreversibles, footprint. All clean
routes to a light spec (frontmatter + Intent + Implementation Notes)
implemented in-session; any flag produces the full spec with each fork
recorded as an Open Questions entry.

Open Questions drain at a loop before Checkpoint 1 — the spec cannot be
approved while entries remain; answers are folded into the frozen block.
The checkpoint becomes three-way: approve & continue (in-session,
no-subagent path), approve & stop (ready-for-dev for a later dispatch),
or edit. step-oneshot is repurposed as the light path with an escalation
ramp back to step-02's drain loop when implementation surfaces a fact
the gate did not see.

* feat(build): resolve intent from evidence before asking questions

Step-01 takes the invocation prompt as starting intent and no longer
interviews the user; it only resolves workflow state, loads evidence,
applies the VCS and scope gates, and selects the spec path. Step-02
investigates before any clarification, distinguishes missing evidence
from genuine decisions, and carries decisions into the route gate as
forks. Self-review turns unresolved material gaps into further
investigation or Open Questions entries; the pre-draft clarification
HALT is gone, so the Open Questions drain is the only human decision
boundary. The Build explanation now describes evidence-first intent
resolution and the post-design route gate.

* feat(build): emit conversation paths in a host-clickable form

* fix(build): restore main Checkpoint 1 choices

Drop the letter-coded continue/stop/edit menu and keep the wording already on main.

* fix(build): say the step-02 plan path in plain language

Replace route-gate metaphor with what the agent should actually do.

* refactor(build): merge the step-02 gates and keep forks out of the frozen block

The token check and Open Questions were two prescribed halts in sequence.
Fold them into one gate that must be settled before Checkpoint 1, in any
order, combinable in one message. Also forbid the frozen intent block from
assuming an answer to a question that is still open: a simulated run wrote
the tool-block format into Boundaries while asking whether results belong
in it.

* refactor(build): route on intent gaps instead of forks

A fork covered two different things: a question about what the user wants,
and a design choice the user would never notice. Only the first needs the
human. Name it an intent gap, define it as something the request does not
say and the user would notice in the result, and tell the model to decide
and record everything else itself. Forbid writing an intent gap into the
frozen block as an assumption.
2026-08-27 22:27:35 -06:00
Brian d2b87b849b Rename bmad-checkpoint-preview to bmad-walkthrough (#2783)
* Rename bmad-checkpoint-preview to bmad-walkthrough

"Checkpoint" said nothing about what the skill does and "preview" was wrong: it is a guided human walkthrough of a change, not a preview. Its siblings bmad-code-review and bmad-review already own "review", so the new name leans on what sets this one apart. "Walk me through this change" was already its trigger phrase.

- Skill folder, SKILL.md name/description, module-help.csv (menu code CK -> WT), marketplace.json
- Trigger words are now "walkthrough", "walk me through this change", "human review"; "checkpoint" is dropped
- English how-to page moves to docs/build/walk-through-a-change.md; build-a-change link updated
- fr, vi-vn, zh-cn pages move to docs/<lang>/build/walk-through-a-change.md to mirror the English path; explanation sidebar orders renumbered to close the gap
- Redirects for the old English and localized routes; sidebar label and translations updated
- Diagram assets renamed (image contents unchanged)

* Regenerate walkthrough diagrams with the new title

Title reads Walkthrough and the input box reads bmad-build spec file (was quick-dev, stale since the Build rename). English and French, same layout and style as before.

* Add bmad-checkpoint-preview forwarding shim

Forwards to bmad-walkthrough and offers to migrate legacy _bmad/custom/bmad-checkpoint-preview{,.user}.toml files, same as the other v6 shims.

* Point test-completed-work links at the renamed walkthrough page
2026-08-27 22:03:36 -05:00
Alex Verkhovsky fcaac4631e docs: add Test Completed Work page (#2782)
Replace the Testing Options catalog with a decision-oriented completed-work
guide at /build/test-completed-work/. Redirect /reference/testing/, list the
page in the Build sidebar after Checkpoint a Change, and close the Reference
sidebar-order gap. Claims are grounded in bmad-qa-generate-e2e-tests; TEA
workflow catalogs stay on the TEA site.
2026-08-27 19:28:49 -06:00
Alex Verkhovsky f1d8bd8bca docs: add Checkpoint a Change page (#2781)
* docs: create Review a Completed Change page

Turn Checkpoint Preview into the Build-chapter how-to for
bmad-checkpoint-preview and redirect the old English route.

* docs: retitle checkpoint how-to as Checkpoint a Change

The Review a Completed Change title collided with bmad-code-review and
the review step in bmad-build. Name the page after the skill and say it
does not replace those reviews.

* docs: update review link format in checkpoint-a-change.md
2026-08-27 07:12:01 -07:00
Alex Verkhovsky 922c86d2c5 docs: add Build a Change page in plain English (#2780)
* docs: create Build a Change page and retire Quick Fixes and Build

Consolidate how-to/quick-fixes and explanation/build into the canonical
build/build-a-change page, opening with the sizing model and Where Build
Fits table and preserving the Build diagram and intent examples. Add the
Build sidebar group after Start, redirect both old routes, retarget
first-party English links and the llms.txt entry, and close the resulting
sidebar-order gaps.

* fix(docs): track Build a Change page by scoping Astro build ignore

The bare build/ gitignore rule also matched docs/build/, so the new
canonical page never entered the prior commit.

* docs: rewrite Build a Change page in plain English

Name the skill as bmad-build instead of Build, drop the duplicated
routing tables, and explain why it spends human attention on a few
checkpoints instead of a Continue slog.
2026-08-27 01:57:21 -07:00
Alex Verkhovsky 4d8dec79b9 docs: clarify BMad development paths (#2669)
* docs: clarify BMad development paths

* docs: add development path diagrams
2026-08-27 01:15:13 -06:00