mirror of
https://github.com/bmad-code-org/BMAD-METHOD.git
synced 2026-09-19 01:36:27 +08:00
c561c653d3d169a8cc711ca56f9c7ad0116b02e2
1987
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
c561c653d3 |
feat(core): deep-recon quality pass — carve SKILL.md, recon_kit scripts, single-source verification
- SKILL.md 3989→2091 tokens: Draft/Process/Refresh+Deepen/Finalize carved to
references/{draft,process,lifecycle,finalize}.md; Run effort knobs + plan
gate moved into run.md; Overview and pack prose trimmed
- verification.md: red-team pass is the single adversarial mechanism (max
runs it at full breadth — no double-spawn); level semantics single-sourced
- scripts/recon_kit.py + tests: citations cross-check, memlog claim tally
(ref=/status= convention, last wins), staleness date math from per-class
windows, deterministic run-folder slugs, escaped source-appendix HTML
- Draft wired with preferred/banned source policies and an open-floor opening
- external_sources examples (Tavily/Sonar/xAI X-Search MCPs); source-quality
card: answer engines are aggregators — chase their citations
|
||
|
|
5b75b8a8dc |
feat(core): deep-recon v2 — draft/process/run, faster defaults, research firewall
Rework after first real-run feedback (slow, token-heavy, locally biased
report, end-pass verification degraded quality, digests stranded in
subagent contexts):
- Three modes replace the acquisition-mode machinery: Draft (build a
deep-research prompt the user runs in their own subscribed tool),
Process (file a finished report into imports/, extract to digests/,
distill research.md summary + metadata so downstream never reprocesses),
Run (native fan-out, first-class). Bare research asks get the choice up
front with the trade stated honestly.
- Engine/Delegate registry cut: the Draft->Process round-trip is the
integration with dedicated deep-research tools; engine.md -> run.md.
- Files-first: digests hit {doc_workspace}/digests/ on landing, sections
commit per dimension, synthesis reads files never conversation memory,
dead runs resume from disk.
- Research firewall: persistent_facts default now empty, assistants get
only their brief, project context frames questions but is inadmissible
as evidence.
- Verification at landing, not end-of-run: normal = spot-check
load-bearing claims only; red_team default off; heavy passes behind
high/max. Presets rescaled faster (standard 3 subagents/8 sources/
depth 2).
- Multi-agent research lessons folded into run.md and the plan gate:
decomposition topology (breadth/depth/straightforward), per-assistant
tool-call budgets, query craft with OODA pause, shared source-quality
card, stop-and-write valve, mechanical citation check at finalize.
- Ripple: v6 shims, catalogs, marketplace, docs one-liners (all five
languages), template gains source: provenance field.
|
||
|
|
fdc6f50788 |
feat(core): move bmad-deep-recon to core-skills; address review findings
Move: research is not code-project-specific — home it in core-skills
(brainstorming precedent) so CIS and core-only installs get it. Skill ID
unchanged; standalone marketplace plugin added; catalogs moved to Core;
{planning_artifacts} falls back to {output_folder} on core-only installs.
v6 shims stay in bmm-skills (the legacy trio were bmm skills).
Review fixes (CodeRabbit):
- Engine briefs are now file-based: invoke templates substitute
{brief_file} (a skill-generated path), never inline brief text — quotes
and shell metacharacters in researched content can't shape a command.
- Refresh/Deepen preserve verification statuses for out-of-scope claims.
- HTML briefing: http(s)-only source links, escape source-derived text.
- user-voice pack: redact usernames/handles/emails from verbatim quotes;
communities complement surveys (triangulate) rather than beat them.
- engine.md: explicit single-writer rule — digests return to the lead,
which alone writes research.md in plan order.
|
||
|
|
bebe08c869 |
feat(bmm): runtime output_format for bmad-deep-recon (v7 artifact protocol)
Replace the output_formats array with output_format = auto|html|md|both (default auto): interactive runs render the HTML briefing, headless or skill-invoked runs present the canonical markdown only. research.md always exists in the workspace as the machine-readable report; the briefing is its regenerable face. First instance of the v7 artifact protocol (memlog = truth, md = distillation under contract, html = face). |
||
|
|
31a7feb513 |
feat(bmm): consolidate research trio into bmad-deep-recon
Replace bmad-market-research, bmad-domain-research, and bmad-technical-research (5,136 lines of near-duplicate legacy step files) with one modern skill, bmad-deep-recon (~650 lines): - Research-master-orchestrator persona; conclusions never rest on training data alone; lead-following rounds with coverage/novelty-exhaustion stops - Six type packs as ~25-line policy+craft cards (market, domain, technical, competitive, user-voice, academic-lit) + select decision shape layering a weighted-matrix method over any type - Three acquisition modes: Generate (subagent fan-out), Delegate (engine registry: CLI/MCP, engine-first strategy), Import (provenance-tracked) - Claims-ledger verification (normal/high/max) with independence rules and optional red-team pass; cited synthesis with staleness map - Effort presets (quick/standard/deep) over four knobs (subagents, sources/round, depth, validation); precedence request > knob > preset - Plan gate with surface discovery (MCPs/CLIs/engines), routing table, and time estimate; use_workflows and subagent_models config - Create/Refresh/Deepen intents, memlog run-folder workspace, headless JSON - v6 shims forward the three old IDs with type pre-set; analyst menu, catalog, marketplace, docs and translation mirrors updated |
||
|
|
8b4da79161 |
refactor(core): group v6 shims and merge editorial review into bmad-review as lenses (#2608)
* refactor: group v6 deprecation shims into v6-shims folders Move the nine backward-compatibility forwarders into dedicated v6-shims/ folders so the deprecation set is visible in one place and can later be made an install-time include/exclude option before removal at the v7 cut. core-skills/v6-shims/: the five review and editorial husks bmm-skills/v6-shims/: the four PRD and architecture husks Grouping only — no content changes. The installer discovers skills by a recursive walk and installs each under its own name, so installed paths and skill IDs are unchanged. Verified by diffing a full headless install against main: identical .claude/skills listing and file content, and an identical _bmad tree. The only delta is the path column in skill-manifest.csv, which now records the new source location. External module repos (gds, loop, tea, bmb, os-utils) and enterprise users still invoke these IDs, so they continue to ship by default. * refactor(core): merge editorial review into bmad-review as lenses All reviews are reviews. bmad-editorial-review's two passes become two more bmad-review lenses, leaving one lens runtime instead of two skills with overlapping trigger descriptions — "review this document" matched both before, so which one ran was close to arbitrary. Lenses now declare what they apply to. applies_to is "code", "docs", or "any", and is the first filter on a default review; `when` still refines it in prose. adversarial stays "any" — it is a stance, not a subject- matter method, and is the lens a code/doc skill split could not have placed. edge-case-hunter's `when` was "always", which is why it would have fired on prose; it now gates on having a behavioral surface. A lens may also declare `after`, naming a lens it builds on: prose runs on top of the structure findings, as it always has. The runner announces the plan, runs the independent lenses (in parallel via subagents when available), then the dependent ones on their results. Lens wording is unchanged. The three code lens files are byte-identical; the editorial passes moved verbatim into references/lens-structure.md, references/lens-prose.md, and references/editorial-common.md, which carries what both share — the content-sacrosanct rule, style guide handling, reader calibration, and the findings table. That material used to load unconditionally; as lenses it loads just-in-time, so a code review no longer pays for it. bmad-editorial-review becomes the sixth v6 shim, forwarding with the structure and prose lenses named. It keeps its customize.toml so existing team and user overrides still resolve, and forwards them as pre-resolved values. The four other husks now name bmad-review and their lens explicitly. Each still pins its own legacy output contract. bmm's four document skills point doc_standards at the merged skill with named lenses. Docs updated across all five locales. Core is 7 skills. A headless install produces the same 47-skill set as main, with all six shims resolving. * fix(core): honor forwarded customization and de-hardcode the lens set Follow-up to the editorial/review merge, from review of #2608. Contract fixes: - bmad-review gains a Forwarded activation clause matching bmad-prd and bmad-architecture, so the bmad-editorial-review shim's pre-resolved fields are honored instead of being silently overwritten by the skill's own customize.toml. Existing bmad-editorial-review overrides resolve again. - The announce step is skipped when a caller pinned an exact output contract, and a forwarder's contract now governs everything emitted rather than the findings block alone. The edge-case (raw JSON) and verification-gap (one exact line) forwarders no longer get a prose line prepended. Lens set is no longer hardcoded: - The description and body intro present the shipped lenses as examples and point at whatever {workflow.lenses} resolves to. Docs carry a matching note in all five locales. Also: - Document the `lenses=` directive form in Inputs and in the four bmm doc_standards comments that use it. - module-help.csv review row rewritten to the house "Use to..." convention, naming the reviewable content types and the situations that should trigger a suggestion. - Shim customize.toml trimmed to a lean legacy-key surface with empty defaults, so unset keys fall through to bmad-review and project-context.md is no longer loaded twice. - Redundant `when` clauses dropped where applies_to already encodes the rule. - Core skill count corrected to seven/four and the edge-case applies_to cell fixed to match its actual value, across all five locales. |
||
|
|
c23f23400d |
feat: streamline core to an 8-skill set with merged review and editorial skills (#2603)
* feat: streamline core to a 5-skill kernel with standalone skill modules
Core installs 14 -> 5 catalog-visible skills; atoms exit to standalone
modules; installer gains real dependency resolution; zero npm deps.
- Merge bmad-editorial-review-prose/-structure into bmad-editorial-review
(structure models JIT-loaded, new customize.toml)
- Merge bmad-review-adversarial-general/-edge-case-hunter/-verification-gap
into bmad-review as selectable lenses; hidden husk-forwarders remain at
the old IDs (no catalog rows) so gds/loop/os-utils keep working
- Move bmad-brainstorming, bmad-party-mode, bmad-forge-idea out of core to
src/standalone-skills/ as single-skill modules; add bmad-analysis bundle
module (curated dependency list over the atoms)
- Move bmad-spec into bmm (2-plan-workflows)
- Modernize bmad-advanced-elicitation: uv run, customize.toml, methods
pick offloaded to scripts/pick_methods.py (with tests)
- Delete bmad-index-docs, bmad-shard-doc (removes the tree's only external
npm dependency), and the four deprecation shims (bmad-create-prd,
bmad-edit-prd, bmad-validate-prd, bmad-create-architecture); all added
to removals.txt
- Installer: activate the dependencies field (recursive union into
selectedModules, cycle-guarded, warn on unknown), config-driven picker
visibility; core stays force-installed
- bmm module.yaml declares deps on the three atoms
- Docs updated across all locales; new reference/standalone-skills.md;
shard-doc how-tos removed
* Restore original critical wording lost in the review/editorial merges
The merges into bmad-review and bmad-editorial-review were meant to keep
the source skills' critical wording behind progressive disclosure, not
paraphrase it away. Restore what was lost:
- lens-adversarial: clueless-weasel framing, extreme-skepticism wording,
the at-least-ten-issues quota, and zero-findings-is-suspicious (the
merge had inverted this to zero-is-valid)
- bmad-review SKILL: zero-findings stance is now per-lens
- lens-edge-case: mandatory exact-order step enforcement
- lens-verification-gap: exact 'No verification gaps found.' clean line
- editorial-review: full Human/LLM reader principles restored to new
references/reader-principles.md; structure-pass HIGH-VALUE DENSITY
role, front-load-value, anti-patterns, pacing check, and length_target
assessment; prose-pass role sentence, analyze-style-first step, and
merge-overlapping-fixes rule; output summary block and min-3-words HALT
* feat(installer): promote bmad-analysis bundle to src/bmad-analysis-skills
Move the bmad-analysis bundle module out of src/standalone-skills/ into its
own src/bmad-analysis-skills root, teach the installer to resolve it there
(getModulePath, official-modules listing, isBuiltInModule helper), and
update the marketplace manifest and standalone-skills docs to match.
* refactor(bmad-review): rename edge-case lens to edge-case-hunter
Rename the lens code and reference file (lens-edge-case.md ->
lens-edge-case-hunter.md), add explicit when = "always" to the shipped
lenses, and tighten the lens-selection wording in SKILL.md.
* feat(bmad-editorial-review): configurable style guide + analysis-driven rework
Apply the workflow-builder analysis recommendations:
- Make the baseline style guide configurable: style_guide in customize.toml
now IS the baseline (default "Microsoft Writing Style Guide") instead of
an empty override slot; SKILL.md no longer hardcodes the guide.
- Inline reader-principles.md into SKILL.md and delete the reference (it
loaded on every run and was half-duplicated inline).
- Complete the customization surface: activation_steps_prepend/append,
persistent_facts (project-context glob), on_complete, and a
review_output_path scalar split out of output_preferences; add a
file:-load fallback convention.
- Ground word metrics: new scripts/word_metrics.py (stdlib, PEP 723, tests)
emits total/per-section word counts so impact estimates and the reduction
summary use exact numbers.
- Cross-pass dedup: prose pass skips CUT-tagged passages and re-attaches
fixes in MERGE'd ones; output ranks by impact with a long-tail rollup.
- Polish: HALT threshold replaced with plain outcome, duplicate LLM-reader
bullets merged, all-caps lowered, literal Overview heading added.
* fix(installer): stop cache-refresh git commands from escaping to the parent repo
Two compounding bugs let a pre-commit test run shallow-fetch and hard-reset
the developer's own repository:
1. Git spawns in custom-module-manager and external-manager inherited the
hook environment. Git exports GIT_DIR (absolute, in worktree checkouts)
into pre-commit hooks; a child git then targets the hook's repo regardless
of cwd, and treats its cwd — the module cache dir — as the work tree. The
cache refresh's 'git fetch --depth 1' + 'git reset --hard origin/main'
therefore shallowed the shared .bare and moved the checked-out branch.
New git-env.js strips repo-targeting GIT_* vars from every git spawn in
both managers, including calls that previously inherited process.env
implicitly.
2. Test suite 51 (quickUpdate dependency expansion) ran the real
CustomModuleManager lookup, which scans ~/.bmad/cache/custom-modules and
network-refreshes every cached clone — real user state. The suite now
stubs findModuleSourceByCode.
Verified by rerunning the suite with GIT_DIR pointed at the repo and a PATH
shim blocking fetch/reset/clone: 432 passing, zero blocked calls.
* De-scope standalone-skills mechanism: atoms return to core, shims reinstated
Shrink the PR to its heart — the skill merges — and defer the module
mechanics to a follow-up where all skills become module-driven:
- bmad-brainstorming, bmad-party-mode, bmad-forge-idea move back to
src/core-skills/ as ordinary core skills with their catalog rows
restored; src/standalone-skills/ and the bmad-analysis bundle module
are removed
- Installer reverted to main: standalone discovery, hidden-module
filtering, dependency resolution, manifest changes (test suites 49-51
removed with the code); the cache-refresh git fix is retained
- The four bmm deprecation shims (create/edit/validate-prd,
create-architecture) are reinstated so enterprise installs that
invoke the old IDs or carry _bmad/custom overrides keep working;
descriptions trimmed to the short husk style; their removals.txt
entries dropped (removal rides the v7 cut as their frontmatter
promises)
- marketplace.json keeps the five plugin entries with atom paths
pointing at src/core-skills/
- Docs (en/cs/fr/vi/zh) reframe the three skills as core thinking
skills; standalone-skills.md reference page removed
* Fix all findings from the max-effort adversarial review
Correctness:
- Finish the edge-case -> edge-case-hunter lens rename at every caller:
the forwarder husk, the code-review/dev-auto/quick-dev review layers,
the renderer test assertion, and the stale example path in
bmad-review/SKILL.md
- marketplace.json: ship the five core kernel skills with
bmad-method-lifecycle so its skills' bmad-review/bmad-editorial-review/
bmad-help/bmad-advanced-elicitation invocations resolve in a
marketplace install
- pick_methods.py / word_metrics.py: force UTF-8 stdout (Windows locale
code pages crashed on the catalog's arrows and CJK headings)
- word_metrics.py: pair fences CommonMark-style so 4-backtick fences can
embed 3-backtick examples without corrupting sections; count CJK
characters as words
- pick_methods.py: validate --extra entries are JSON objects (was an
uncaught AttributeError); read catalogs with utf-8-sig (BOM'd CSVs
silently blanked every num)
- bmad-spec: activation now resolves {output_folder} (which the
Workspace uses) instead of the unused {planning_artifacts}; drop the
stale core-only-installs comment
- Editorial husks: pin the legacy output contracts (three-column table /
Document Summary report and exact empty-state lines) like the review
husks do
- PRD shims: advertise the real bmad-prd customize keys
(validation_checklist_template, prd_output_path, run_folder_pattern,
finalize_reviewers) instead of three that don't exist
- bmad-prd: add the forwarded-activation clause its shims rely on
(ported from bmad-architecture)
- Locale workflow-maps (fr/cs/vi/zh): add the bmad-spec Phase-2 row the
English map gained, which every locale's core-tools note points at
- git-env.js: also strip GIT_CONFIG_PARAMETERS and the
GIT_CONFIG_COUNT/KEY_n/VALUE_n family; pass gitEnv() to the three npm
install spawns whose transitive git calls inherited hook vars
Consistency:
- brain.py --extra overlay now replaces-by-name like pick_methods.py
(same customize.toml additional_* semantics across sibling skills),
with a regression test
* Fix prettier formatting in marketplace.json
* Apply valid CodeRabbit findings
- brain.py: catch malformed --extra overlays (bad JSON, non-array root,
non-object entries) into the clean error path instead of a raw
traceback, with a regression test; read catalogs and overlays with
utf-8-sig; normalize ALL CSV fields (required ones were unstripped and
could arrive as None from short rows)
- brain-selector: clamp the random-technique count to what the pool can
supply so the Total badge matches the actual draw (template +
regenerated assets/brain-selector.html)
- bmad-editorial-review: word_metrics command now uses the explicit
{skill-root}/ prefix
- resolve_party.py / resolve_personas.py: custom member overrides now
start from the installed entry, so omitted fields (icon, title,
description, module, team) survive; non-string member tokens land in
unresolved instead of raising TypeError; party's member loop gains the
isinstance guards its personas twin already had
- bmad-brainstorming: fix the SKILL.md claim that headless is the only
context for self-generated ideas (autonomous mode is interactive);
autonomous mode honors user-supplied techniques before self-selecting
- Docs: drop duplicate 'only' in the spec template; align zh-cn
forge-idea's bmad-review description with the English wording
* Create only the output folder at install time
bmm no longer pre-creates planning_artifacts, implementation_artifacts,
and project_knowledge — the last of which put an empty docs/ at every
project root. Skills create those lazily on first write. core now
declares {output_folder} in its directories block, which was previously
created only as a side effect of the artifact folders nesting under it.
|
||
|
|
5c9a1c2a22 |
fix(bmm): suppress epic/story comments and AI slop in generated code (#2544)
Add code comment quality constraints to bmad-agent-dev principles and bmad-dev-story persistent_facts to prevent injection of epic/story references and verbose AI-generated noise in produced code. Fixes #2538 Co-authored-by: Brian <bmadcode@gmail.com> |
||
|
|
717479bc3f |
fix(dev-auto): temporarily revert skill-entry renderer (#2598)
Back out the dev-auto render.py workflow entry change from #2587, including the follow-up renderer-only fix on top of it, so the skill returns to the pre-renderer SKILL.md flow while the longer fixes are worked separately. |
||
|
|
1cd4a7f5c0 |
fix(skills): HALT renderers on missing config keys and bad overrides (#2588)
Two silent-corruption paths in the bmad-quick-dev/bmad-dev-auto
template renderers now HALT instead:
- A {{.var}} referenced by the skill's .md sources but absent from the
merged central config previously rendered as an empty string with
exit 0 (missingkey=zero), baking a corrupted workflow (e.g. missing
planning_artifacts yields "List files in ``") with no failure signal.
render.py now collects the referenced names before rendering and
HALTs naming the missing key(s) and the referencing file(s). The
dedicated implementation_artifacts guard stays: it runs before the
derive step and also catches present-but-empty values.
- An optional customization layer (_bmad/custom/<skill>.toml, its
.user.toml, or the optional central-config layers) that exists but
fails to parse or read previously warned on stderr and continued
with {} — silently discarding the user's overrides; unattended
dev-auto runs never see stderr. Missing stays fine (layers are
optional); unparseable or unreadable now HALTs.
Both render.py copies change in lockstep (parity test); regression
tests added to both renderer suites.
|
||
|
|
64157d394c |
feat(dev-auto): render templates via stdlib Python at skill entry (#2587)
Propagate bmad-quick-dev's render.py pattern (#2281) to bmad-dev-auto. SKILL.md becomes the two-line stdout-dispatch shim that runs render.py via uv and follows the instruction it prints; the old SKILL.md body moves to workflow.md, rendered to _bmad/render/bmad-dev-auto/ with all compile-time values baked in. - render.py is a copy of quick-dev's, differing only in skill-name references; a test guards against the two copies drifting apart. - Compile-time config refs ({communication_language}, {planning_artifacts}, {implementation_artifacts}, {deferred_work_file}, {document_output_language}) become {{.var}} substitutions resolved from the central four-layer TOML config. Runtime refs ({spec_file}, {diff_output}, ...) pass through. - [workflow] customization resolves at render time: on_complete inlines into the HALT On Complete section, implementation_handoff into step-03, and review_layers materialize as invocation blocks in step-04 — the runtime resolve_customization.py calls and the activation-time workflow-block resolution step are gone, along with the Load Config activation step (values are baked at point of use; the language rule moves into each step's RULES). - Step files now reference workflow.md instead of SKILL.md; step-02 resolves the spec template's date field; step-04 defines {date} for the triage-log header. - tools/validate-file-refs.js whitelists render/bmad-dev-auto/; test:renderer now also runs the new test/test-dev-auto-renderer.js. - docs: the dev-auto reference's Context Inputs now names the central _bmad/config.toml surface instead of _bmad/bmm/config.yaml. |
||
|
|
8ea1b7673b |
fix(dev-auto): score follow-up review recommendation; route patches to implementer (#2580)
* fix(dev-auto): score follow-up review from patched-finding severity The old rule asked for a significance judgment of the pass's own review-driven changes, which recommended another pass nearly every time and never converged. Replace it with arithmetic over the triage log, counting only findings triaged patch: recommend a follow-up for a patched high finding, or when 3 x medium + 1 x low reaches 5. Deferred and rejected findings never count. The flag stays a plain boolean suggestion; the orchestrator owns the re-review decision. Fixes #2576 * feat(dev-auto,quick-dev): route review patches to implementer, re-verify When the step-03 implementation subagent can be re-engaged with its context intact, step-04 sends it the patch findings instead of fixing them in the main session; falls back to fixing directly where the platform cannot keep a subagent around. Either way, the spec's verification re-runs after patches land — previously patches applied after step-03's verification shipped unchecked. * fix(dev-auto,quick-dev): restate synchronous invocation at spawn sites The SKILL-level ban on backgrounding subagents loses to harness bias in long sessions once the preamble ages out of attention. Restate it where reviewer subagents are launched in step-04, and mark the other spawn sites (epic-context compile, planning exploration) synchronous. Fixes #2570 |
||
|
|
b3d79436f8 |
docs(zh-cn): add missing translations for forge-idea, web-bundles, and dev-auto (#2579)
* docs(zh-cn): add missing translations for forge-idea, web-bundles, and dev-auto Complete the remaining five zh-cn documentation pages on origin/main. Also fix Starlight sidebar autogenerate config so docs:build passes. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(docs): revert sidebar autogenerate to Starlight 0.40 items format Starlight 0.40 (Astro 6) requires autogenerate inside items[], not at group level. The previous fix passed locally with stale deps but failed CI. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: leon <leon.liang@hairobotics.com> Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
49069b8b52 |
feat(quick-dev): render templates via stdlib Python at skill entry (#2281)
* feat(quick-dev): render templates via stdlib Python at skill entry Move compile-time variable substitution out of the LLM and into a deterministic Python step. SKILL.md becomes a two-line stdout-dispatch shim that runs render.py and follows the instruction it prints. The renderer reads BMad configuration from the central four-layer TOML surface introduced in #2285 (_bmad/config.toml plus config.user.toml and the two _bmad/custom/ overrides), with a fallback to the legacy per-module _bmad/bmm/config.yaml for pre-#2285 installs. Compile-time refs ({{.var}}) get substituted at render time. LLM-runtime refs ({var}) pass through untouched. Renderer (render.py) - Python 3 stdlib only (tomllib, already bundled since 3.11). UTF-8 I/O. Every invocation rebuilds from scratch — no hash, no cache. - find_project_root walks up from cwd; HALT to stdout if no _bmad/ is found anywhere on the path. - load_central_config deep-merges the four TOML layers in priority order (base-team → base-user → custom-team → custom-user) so user overrides in _bmad/custom/config.user.toml win over installer- regenerated base values. flatten_central_config lifts scalar keys from [core] and [modules.bmm] into the renderer's flat namespace; module keys beat core on collision (matches the installer's own core-key-stripping behavior). - When _bmad/config.toml is absent, falls through to the legacy flat-YAML parser for _bmad/bmm/config.yaml — the renderer keeps working across the #2285 transition. - {{.var}} substitution; unresolved refs emit empty string (Go missingkey=zero semantics). - Smart defaults for planning_artifacts / implementation_artifacts / communication_language applied after config load. Derives sprint_status / deferred_work_file from implementation_artifacts. {{.main_config}} points at whichever surface was actually read. - Renders every .md in the skill dir except SKILL.md to {project-root}/_bmad/render/bmad-quick-dev/. - On success, stderr summary plus a single stdout line: "read and follow {workflow_md}". On failure, stdout HALT directive — per the Anthropic skills spec, script stdout is the defined agent- communication channel. Skill entry (SKILL.md) - Two-line shim: run python render.py, follow stdout. No template tokens in SKILL.md itself. Template conversions - workflow.md, step-01..05, step-oneshot, sync-sprint-status: convert every compile-time {var} reference to {{.var}}. Runtime refs preserved. - spec-template.md untouched (single-curly comment hint stays as documentation). Skill-prose cleanups bundled in - Remove dead step-file frontmatter: empty-string variable declarations (spec_file, story_key, diff_output, review_mode) in quick-dev step-01 and code-review step-01; empty --- --- blocks in step-03 and step-05; the specLoopIteration counter init moved from step-04 frontmatter into the step body where first-entry vs loopback semantics are explicit. - Unify the language rule across all six quick-dev step files plus workflow.md. Tooling - tools/validate-skills.js: add TPL-01 rule. Files whose name contains "template" must not contain compile-time {{.var}} substitutions. Template files seed durable, version-controlled artifacts that execute on other machines; baking a value at render time would freeze a machine-local path into every downstream artifact. - tools/validate-file-refs.js: add render/ to INSTALL_ONLY_PATHS so the validator recognizes the runtime-generated buffer. - tools/skill-validator.md: document TPL-01; deterministic rule count bumped from 14 to 15. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor(quick-dev): drop render.py YAML fallback and smart defaults Single happy path: central _bmad/config.toml with four-layer merge, Python 3.11+ required (no ImportError guard), HALT if config missing. Deletes load_flat_yaml, the YAML fallback branch, the setdefault block for planning_artifacts/implementation_artifacts/communication_language, and the tomllib ImportError fallback. Part of plan-quick-dev-python-config-hardening.md (F0). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(quick-dev): normalize render.py paths to forward slashes On Windows, os.path.join returns backslash-separated paths that can misrender as escape sequences when later concatenated into POSIX shell strings or regexes. Normalize the project root to forward slashes after find_project_root, and use posixpath.join for every path that gets baked into rendered .md files or joined into config values. os.makedirs and os.listdir accept forward-slash paths on Windows, so their call sites stay as-is. Part of plan-quick-dev-python-config-hardening.md (F3). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(quick-dev): preserve source line endings in render.py Python text-mode open() with the platform default performs universal- newline translation: on Windows, LF source files get written as CRLF, producing spurious diffs when rendered output is compared against source. Pass newline="" on both the source read and the rendered write so line endings pass through verbatim. Part of plan-quick-dev-python-config-hardening.md (F4). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(quick-dev): delete stale .md renders before rebuilding render.py rebuilds from scratch per the docstring, but makedirs(exist_ok=True) only overwrites files that still exist in the source — stale outputs from renamed/deleted source files linger in _bmad/render/bmad-quick-dev/ forever. Remove every .md in the render dir before the render loop; keep the dir itself and any non-.md files. Part of plan-quick-dev-python-config-hardening.md (F5). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(quick-dev): scope render/ whitelist to bmad-quick-dev The previous INSTALL_ONLY_PATHS entry 'render/' was a blanket prefix that let every {project-root}/_bmad/render/... reference in any skill slip past validation. Narrow to 'render/bmad-quick-dev/' so only this skill's render buffer is whitelisted. Future skills adopting the stdout-dispatch renderer pattern add their own entries explicitly. Part of plan-quick-dev-python-config-hardening.md (F6). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * test(quick-dev): add renderer smoke test with TOML override New test/test-quick-dev-renderer.js spins up a temp project with base _bmad/config.toml and a _bmad/custom/config.user.toml override, runs render.py, and asserts the override wins in rendered workflow.md and that sprint_status is rooted at an absolute path in the temp project. Registered as test:renderer in package.json and chained into the npm test script. Part of plan-quick-dev-python-config-hardening.md (F7). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(quick-dev): HALT cleanly when base config.toml is unparseable Load the four config layers through a load_toml helper that marks the base _bmad/config.toml as required. A missing, unparseable, or unreadable base now prints a HALT directive to stdout and exits, instead of being silently skipped and then crashing downstream with a KeyError when a derived value (e.g. implementation_artifacts) is absent. Optional layers still warn on stderr and fall back to empty. Merge semantics are unchanged (dict-aware deep merge, override wins for lists and scalars). * fix(quick-dev): resolve render.py via {skill-root} in skill entry shim The bare `python render.py` shim assumes the agent's working directory is the skill directory, but agents run from the project root, so the script is not found. Reference it as `{skill-root}/render.py` — BMAD's standard token for a skill's installed directory, already used by every other skill's resolve_customization.py invocation — and add the one-line `{skill-root}` explainer so the model resolves it from an instruction rather than guessing. Interpreter stays `python`; the python vs python3 choice is a separate cross-platform concern. * refactor(quick-dev): resolve [workflow] customization in render.py render.py now merges the three customize layers (customize.toml -> custom/bmad-quick-dev.toml -> .user.toml) with the same structural rules as resolve_customization.py and inlines the resolved [workflow] values, so no {workflow.*} placeholder survives. workflow.md drops its Step 1 runtime resolver + manual-merge fallback; step-05 and step-oneshot drop their runtime workflow.on_complete calls. The shared resolve_customization.py and every other skill are untouched. Smoke test extended with a [workflow] override fixture covering inlining, array append, and no-leak assertions. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(quick-dev): harden render.py invocation in the SKILL.md shim The shim called bare `python`, which can resolve to Python 2 or be absent; render.py needs 3.11+ for tomllib. Spell out python3 and the version requirement. Also make the exit code authoritative: on a non-zero exit (including an uncaught crash that writes only to stderr), do not proceed -- report what was printed and stop. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(quick-dev): drop the render.py success stderr line The "rendered N files" progress line was pure diagnostic noise. The shim already tells the LLM to ignore stderr and follow the stdout instruction, so on success render.py now prints only the "read and follow ..." line. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(quick-dev): drop the activation gate sentence from the rendered workflow The gate ported from #2398 defended against runtime customization indirection: agents guessed resolver outputs instead of executing them, silently skipping append steps. render.py inlines the prepend/append entries into the rendered workflow.md, so there is nothing left to short-circuit, and each inlined list already carries its own execute- in-order imperative. In the default install both lists render as _None._ and the gate is pure noise. * feat(quick-dev): materialize review layers into invocation blocks Reconcile #2550 with render-time [workflow] resolution. Main made review layers configurable as [[workflow.review_layers]] arrays of tables and had the LLM resolve them during activation; this branch resolves the [workflow] block in render.py instead, so activation-time resolution no longer exists and the layer refs must be materialized at render time. Rather than inlining the layer tables as data plus interpretation rules, render.py now knows this skill's customization schema outright and renders review_layers/oneshot_review_layers as direct invocation blocks: disabled layers (empty instruction) drop out, each active layer becomes a #### section holding its instruction verbatim, zero active layers renders the HALT instruction, and runtime placeholders like {diff_output} pass through. The only judgment left to the LLM is the optional `when` condition, which renders as a run-time guard line. The step-04/step-oneshot review intros collapse to a single execute-in- parallel imperative. Smoke test covers default rendering, replace-by-id, disable-by-empty-instruction, when-guards, and the all-disabled HALT. * fix(quick-dev): invoke render.py via uv run per house standard The SKILL.md shim launched render.py with bare `python3`, which the rest of BMAD is migrating away from: the customize-bmad docs and the installer's uv-check standardize on `uv run` (uv provisions a suitable 3.11+ interpreter on demand). Bare `python3` is also fragile on Windows, where python.org installs expose `python`/`py` rather than `python3`. Make `uv run` the primary invocation and demote `python3` to the documented fallback, spelling out `python`/`py -3` for Windows and the 3.11+ tomllib requirement. render.py itself is unchanged; the renderer test drives it directly and is unaffected. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(quick-dev): HALT cleanly on missing or malformed config render.py derived sprint_status/deferred_work_file from an unconditional vars_["implementation_artifacts"] subscript, so a config lacking that key raised a raw KeyError instead of the stdout HALT the rest of the script uses on bad input. flatten_central_config likewise called .get("bmm") on merged["modules"] without checking it was a table, so a non-table [modules] crashed with an AttributeError. Guard both: HALT with a clear stdout directive when implementation_artifacts is missing or blank, and coerce a non-dict modules to {} before indexing. Add renderer regression tests asserting each path exits without a Python traceback. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * refactor(quick-dev): resolve config at compile time, drop the runtime re-read The activation "Load Config" step told the LLM to open {{.main_config}} and re-resolve project_name, communication_language, sprint_status, etc. at run time -- but render.py already bakes those from the full four-layer config merge. main_config pointed at only the base _bmad/config.toml, so on installs with override layers (config.user.toml / custom/*) the runtime re-read saw stale values that could contradict the baked {{.var}} in the same rendered file. It also handed resolution back to the LLM: the drift this skill's renderer exists to remove. Delete the ceremony and wire each value where it is actually used: - Every value the step resolved is already inlined at its point of use (planning/implementation_artifacts, sprint_status, communication_language) or loaded via persistent_facts (project-context.md), so the central block was pure redundancy. - Fold document_output_language into the per-step language rule, adopting the house-canonical form ("Speak in X. Write any file output in Y.") already used by bmad-checkpoint-preview. - Move the {date} = current-datetime definition to step-02, where the spec template's {date} field is filled. - Drop the user greeting (user_name) and user_skill_level tailoring: quick-dev is not a conversational skill and neither was load-bearing. - Remove main_config from render.py; it had no remaining consumer. Renderer tests repointed at the files that now carry these values, plus coverage for document_output_language baking and main_config removal. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(quick-dev): reference variables by bare name, not placeholder curlies Curlies mean "expand this to the value"; a bare backticked name means "this is the variable/field I'm talking about". Several step files wrapped a variable in curlies where they were only naming, assigning, passing, or testing it -- so the notation implied an expansion that never happens: - step-01: identify `epic_num`/`story_num`, set/leave `story_key` unset - step-02: test `preserved_intent`; and resolve the template's `date` field (was `{date}`, which read as "expand date here" rather than naming it) - step-03/step-05/step-oneshot: pass `target_status` to sync-sprint-status, set `title` - sync-sprint-status: the `target_status` parameter, `story_key` precondition, and both `target_status` conditionals Value tokens that are genuinely materialized in place -- `{spec_file}` paths, `development_status[{story_key}]`, "set ... to `{target_status}`" -- stay curly. Also reword step-02's frozen-block instruction from the ambiguous "substitute it for the `<frozen-after-approval>` block" to "replace the `<frozen-after-approval>` block in the spec you just filled out with `preserved_intent`" so it's clear the replacement happens in the artifact. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * refactor(quick-dev): require uv, drop the python3 interpreter fallback The SKILL.md shim tried `uv run render.py` and, if uv was missing, retried with a bare `python3`/`py -3` interpreter. Nothing else in the codebase does that interpreter fallback: the uv-based skills (bmad-prd, bmad-ux, bmad-architecture, bmad-product-brief) fall back to reading customize.toml and using defaults -- graceful feature degradation, never a different runner -- and the legacy skills just call python3 outright. uv is the established house runner (memlog.py, resolve_customization.py, lint_spine.py all invoke it). That graceful-degrade path does not exist here: render.py is the entry dispatch that produces the workflow.md the LLM then follows, so there is nothing to fall back to. The only honest outcomes are "uv runs it" or "HALT". Make uv the floor and drop the fallback. Pin the interpreter the house way -- a PEP 723 `requires-python = ">=3.11"` block, matching memlog.py/lint_spine.py -- so `uv run` provisions a 3.11+ interpreter and the tomllib requirement is guaranteed rather than hoped for. This replaces the prose "needs 3.11+" hedge the shim used to carry. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
5f3ebc91ed |
feat: add Antigravity CLI (AGY) as supported installer platform (#2551)
* feat: add Antigravity CLI (AGY) as supported installer platform Distinct from the Antigravity IDE entry: the CLI reads workspace skills from the shared .agents/skills standard and its own global dir. Closes #2440. * test: assert Antigravity CLI global_target_dir differs from the IDE |
||
|
|
14bb68f401 |
perf(dev-auto): make review-layer fan-out atomic (#2565)
The review step said only to "execute all remaining layers in parallel wherever their execution methods allow", which permits an orchestrator to spawn one reviewer, react to its output, then spawn the next. Observed in a run where four reviewers launched ~2m14s apart end to end — pure wall-clock waste with no quality benefit. Require every reviewer spawn to be issued contiguously before reading, waiting on, or reacting to any reviewer output; collection and triage only begin once all reviewers are launched. No change to reasoning structure or review discipline. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
52e4c634ce |
feat: add stories.yaml contract between bmad-spec and bmad-dev-auto (#2549)
bmad-spec gains an optional, interactive-only Story Breakdown step that derives stories.yaml from the memlog: a fixed-name sibling of SPEC.md listing stories as a simple sequence (list order = execution order), each with id, title, description, and orchestration fields spec_checkpoint, done_checkpoint, and invoke_dev_with. Field definitions and validity rules live in assets/stories-schema.md. Ids are pinned only once a story's spec file exists; un-started stories may be renumbered on re-derive. stories.yaml never carries status. bmad-dev-auto becomes dispatchable per stories.yaml entry: invoked with a spec folder and story id, it reads only that entry's title and description, derives the slug, and creates or resumes the story spec at stories/<id>-<slug>.md just in time. All HALT write-back lands at that id-keyed path (skeletal spec for pre-planning halts). An invocation-prompt directive halts ready-for-dev after planning; re-dispatching the same folder+id resumes via existing status routing. Planning accumulates context from all prior story records in the folder. Reference docs updated to cover both halves. |
||
|
|
ac25b2cb5d |
feat(dev-auto): preserve the attempted change on intent-gap halts (#2564)
The intent_gap branch reverted code changes before halting, destroying
information: the attempted diff shows the human exactly which reading
the agent implemented, which is concrete evidence for repairing the
intent — and occasionally the guessed reading is simply right.
Save the attempt as a patch file in {implementation_artifacts} before
reverting, reference it from the triage log, and include its path in
the halt output. Restart stays default-clean (blocked keeps discard
semantics; the tree is reverted as before); if the human decides the
attempted reading was correct, git apply + status in-review resumes
review on it instead of paying for a full re-run.
Also unify the blocking-condition vocabulary: 'intent gaps' (step-02)
and 'intent gap in intent contract' (step-04) both become 'intent gap'
— one condition, one meaning; the artifact shows which phase raised it.
Document the artifact, the recovery affordance, and the unified
condition in the integration reference (docs/reference/dev-auto.md).
|
||
|
|
cf5415551b |
fix(dev-auto): commit must match the reviewed diff; declare scope expansion (#2563)
- step-04 finalize: commit every file in the reviewed diff, tracked and untracked; verify and amend if any reviewed file is missing. Leftover porcelain entries are by definition not part of the change: left in place, never committed/deleted/gitignored, declared as residual artifacts (the next run's step-01 clean-tree check is the enforcement point) - handoff report: the implementation subagent declares any files changed beyond the spec's tasks and why each was needed; triage and the human judge the reasons under the intent-authority rule Observed in a live run: a new test file was left untracked, so the commit omitted a file the review had approved; the same run expanded scope beyond the spec (correctly, per the repo's architecture) with no declaration anywhere. |
||
|
|
56a081fcaa |
feat(dev-auto): make the implementation handoff deterministic (#2561)
- customize.toml: add workflow.implementation_handoff — a literal
subagent prompt with {spec_file} substituted at run time; the spec
is the sole source of truth, its change-log entries are binding, and
the report shape (files, verification, blockers, residual risks) is
fixed
- step-03: resolve and follow the handoff verbatim; no parent-authored
goal restatements, file lists, ownership boundaries, or acceptance
criteria; HALT on handoff/spec conflict; the subagent loads the
spec's context: files itself instead of the parent pasting them
|
||
|
|
243a4b2ff6 |
feat(dev-auto): detect intent-alignment gaps in planning and review (#2560)
- Ready standard: ACs must observe the outermost surface the intent
references, never an internal proxy
- step-02: divergent defensible readings of the intent are an intent
gap; never resolved by picking a reading
- step-03: retire the post-implementation AC/checkbox ritual; run the
spec's Verification commands instead, and leave acceptance judgment
to the independent review panel
- customize.toml: add Intent Alignment Auditor as a fourth default
review layer, fed the verbatim invocation intent plus the diff,
descriptive only; step-04 defines the {verbatim_intent} placeholder
- step-04: out-of-scope dispositions require the intent as authority;
spec scope language, plan, and diff shape are inadmissible
|
||
|
|
f6c2c0a15b |
feat(review): make review layers configurable via customize.toml (#2550)
Quick-dev, dev-auto, and code-review hardcoded the same review layers (Blind Hunter, Edge Case Hunter, Verification Gap Reviewer, plus the Acceptance Auditor in code-review) in their review steps. Move them into each skill's customize.toml as [[workflow.review_layers]] defaults — quick-dev's one-shot route gets its own [[workflow.oneshot_review_layers]]. Each layer is a keyed table (id, name, instruction, optional when) whose instruction is the complete execution recipe, so the standard keyed merge lets team/user overrides add layers (e.g. a security auditor), replace a default's instruction wholesale — including running an external review tool in a separate process via bash instead of a subagent — or disable one by overriding its id with an empty instruction. The review steps resolve the layers through resolve_customization.py (with the usual manual-merge fallback), skip empty and when-failing layers, and execute the rest; triage tags findings by layer id instead of the fixed blind/edge/vgap/auditor labels. Also cut the code-review SKILL.md description and preamble to their load-bearing text. Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
75c29b8c4f |
feat(dev-auto,quick-dev): audit matrix test coverage in step-03 (#2554)
Step-03's Tasks & Acceptance Verification in bmad-dev-auto and bmad-quick-dev gains a Matrix Test Audit: when the spec's frozen contract contains an I/O & Edge-Case Matrix, verify every matrix row is covered by at least one test that verifies its expected behavior, and that each covering test ran and passed in the verification output. A covering test that exists but did not run (unregistered, filtered out, skipped, disabled) counts as missing. Test-vs-matrix disagreements are fixed in code, never by editing the expectation toward observed behavior. dev-auto (unattended) HALTs blocked on matrix ambiguity or an unsatisfiable audit; quick-dev (interactive) halts and asks the human. |
||
|
|
48ea669014 |
chore(dev-auto): restore 'isolate' framing for plan-step exploration (#2557)
The fork from quick-dev rewrote 'Isolate deep exploration in
sub-agents' to 'Use subagents for deep exploration' (
|
||
|
|
1f29bd3d0a | fix(review): harden finding triage independence (#2555) | ||
|
|
50b3238abb |
feat(review): add verification-gap reviewer as a third review layer (#2535)
* feat(review): add verification-gap reviewer as a third review layer Add bmad-review-verification-gap, a code-review layer orthogonal to the adversarial bug-hunter and edge-case hunter. It asks whether a regression in the changed behavior would be caught by a test where that behavior is actually exercised — never whether the code is wrong — and reports verification gaps with no severity (the triage step owns that). Wire it into the review steps of code-review, quick-dev, and dev-auto, and register it in the plugin marketplace. The code-review triage folds its findings into the unified normalization (source vgap); the triage step's per-layer format enumeration is dropped, since the triage agent sees the actual layer outputs and a description of them adds nothing. Per external review feedback: absence claims are gated on a repo-wide symbol and import-reference search, and the report's evidence field must show the searches run when it claims no test exists. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(review): tighten verification-gap reviewer prompt * docs(review): apply decisions-log refinements to verification-gap reviewer Fold two decisions from docs/test-gap-hunter/decisions-log.md and follow-up review into the reviewer prompt: - Missing-adoption now qualifies on a supersession signal plus a shared observable contract, not the adoption failure alone; missing coverage of the non-adoption is the gap itself, not a disqualifier. Step 4 routes it as its own outcome so it is not collapsed into the regression-style gaps. - Findings report what was actually checked ("none of the tests I read cover this") and how far, and claim a test exists nowhere only when the symbol/import search establishes it. The gap definitions and Consequence stay conceptual; the how-far-verified qualification lives in the report fields. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
081e64ee5a | chore(release): v6.10.0 [skip ci] v6.10.0 | ||
|
|
c0fa3231a2 |
v6.10.0: bmad-loop replaces bmad-automator, changelog draft (#2545)
* docs: draft v6.10.0 changelog; rebrand bmad-auto to bmad-loop; simplify uv check message Drafts the v6.10.0 changelog entry, headlined by bmad-loop landing as an installable module and bmad-automator's deprecation in its favor. Renames the installer's bmad-auto module registry entry (code, name, url, module-definition path, post-install message) to bmad-loop ahead of the upstream repo rename. Also simplifies the uv-detected install message to a plain pass/fail line with a checkmark, since the prior "ready to run BMAD's Python-powered scripts via uv run" phrasing read as more actionable than it was. * feat(installer): support module-code aliases, migrate bauto to bmad-loop Adds a bauto -> bmad-loop registry alias so existing installs migrate forward on quick-update (and the interactive Modify flow) instead of being orphaned as "no source available" the way the prior baut -> automator rename was (CHANGELOG v6.7.1). ExternalModuleManager resolves aliases in getModuleByCode/resolveCanonicalCode; quickUpdate translates installed ids up front and removes the stale _bmad/<alias>/ directory after a successful migration. removals.txt gains bmad-auto-setup, the renamed skill id, so stale IDE-side skill dirs get pruned too. Also corrects bmad-modules.yaml's bmad-loop entry to match the real upstream repo content (src/bmad_loop/..., bmad-loop-setup skill) now that the bmad-auto -> bmad-loop rename has actually landed there, and moves bmad-loop to the top of the installer picker with a shorter, less wrap-prone description. |
||
|
|
ce65425f21 |
fix(bmad-help): resolve central config (#2541)
Co-authored-by: Brian <bmadcode@gmail.com> |
||
|
|
b119a35ad0 |
fix(party-mode): correct agent-team sync to point-to-point, not a shared room (#2539)
The prior commit described agent-team mode as "one shared room" where relaying user turns keeps everyone in sync. Claude Code's Agent Teams documentation contradicts this: communication is a point-to-point Mailbox (`SendMessage` to a named recipient, "send one message per recipient" to reach everyone) with no broadcast. An idle member does not observe exchanges it isn't addressed in. So keeping the room in sync is the lead's job, not the channel's. Replace the "shared room" line in mode-agent-team.md with the point-to-point reality: relay each user turn to the members who need it, and catch an idle member up on what it missed before it speaks again. mode-subagent.md's "One shared room" stays — there the orchestrator is the sole channel and already routes the whole exchange, matching plain Subagents' report-back-to-main model. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
e772c42d00 |
fix(dev-auto): require synchronous subagent invocation (#2543)
The dev-auto workflow runs unattended with no event loop to resume a yielded turn. If a subagent is launched detached/backgrounded (e.g. run_in_background: true) or the turn ends to await a completion notification, control is never handed back and the run stalls. Make the contract explicit: invoke every subagent synchronously and await it within the same turn. Clarify that 'in parallel' means several blocking calls awaited together, not detached execution. The only sanctioned way to end a turn remains the HALT protocol with a terminal status. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
67f4499e31 |
fix(dev-auto): write frontmatter status explicitly at Finalize (#2536)
The Finalize block explicitly writes `followup_review_recommended` and (since #2522) `final_revision` to the spec frontmatter, but the terminal `status` advance lives only in the conflated `SKILL.md` HALT macro ("update status in frontmatter AND append result details"). An agent that completes the detailed `## Auto Run Result` prose can treat that sentence as satisfied and skip the terse `status` write, leaving frontmatter at the template default `draft` on an otherwise-successful run — which breaks downstream automation that reads frontmatter `status` as the machine-consumable completion signal. Add the explicit `status: done` write at Finalize, consistent with how #2522 handles `final_revision`. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
3dd88943ec |
fix(party-mode): keep the party interactive and the room in sync (#2531)
A runtime read the opening prompt as a task and, once it was satisfied, concluded the party was over and closed the spawned agents. Party mode is principally interactive: the opening intent is a topic, not a stopping point. - SKILL.md: state the party is interactive and open-ended; it ends only when the user signals done. Add an explicit `--non-interactive` flag as the one opt-in path that serves a single intent and then wraps up. - mode-subagent.md / mode-agent-team.md: add a lifecycle contract — one standing agent per persona, kept alive for the whole session, visible roster, resume/respawn if dropped, close only at wrap-up. A member that finished its task is idle, not done. - mode-subagent.md: add "One shared room" — every standing member hears the whole exchange each round, speaking or not, so personas stay in sync and a history can form. mode-agent-team relays every user turn to all members. - docs: document the interactivity default and `--non-interactive`. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
74e8f61229 | feat(party-mode): add anti-consensus club (#2530) | ||
|
|
d9210244f3 |
feat(elicitation): add subtraction and map-is-not-the-territory methods (#2515)
Co-authored-by: Brian <bmadcode@gmail.com> |
||
|
|
4b6288d836 |
feat(installer): deprecate automator, add bmad-auto marketplace module (#2532)
* feat(installer): deprecate automator, add bmad-auto marketplace module Add a `deprecated` registry property (with `deprecation-message`): deprecated modules are hidden from the installer picker unless already installed, and the message is surfaced in the picker hint so existing users see the replacement. Mark bmad-automator deprecated, pointing to bmad-auto. Add bmad-auto as a new official module. Since its installable skills live outside a single module.yaml directory (it ships .claude-plugin/marketplace.json with module.yaml inside the -setup skill's assets/), add a `marketplace-plugin` flag that routes such registry modules through the PluginResolver — the same machinery custom-URL installs use — to copy the resolved skill dirs and module-help.csv. Manifest/version handling is unchanged (source: external). The flag is opt-in, so existing modules (e.g. WDS) are unaffected. * fix(installer): harden marketplace-plugin install (review #1/#5/#8) - Fail loud when a marketplace-plugin module's skills cannot be resolved from marketplace.json, instead of silently copying the -setup skill's assets/ dir (module.yaml + module-help.csv) with no skills — a broken partial install. - Extract _copyResolvedSkills() shared by install() and installFromResolution() so the official registry and custom-URL plugin paths cannot drift; this also picks up the synthesizedHelpCsv (strategy 5) handling in both paths. - Detect duplicate skill leaf names in _copyResolvedSkills and throw instead of letting two skills silently overwrite each other. * feat(installer): registry-driven post-install messages Add a `post-install-message` property to the module registry. After the install summary, any installed module that defines one shows an "action needed" notice; interactive installs require the user to acknowledge it (press Enter), while non-interactive (--yes) installs print it and continue so CI never blocks. Use it on bmad-auto to tell the user to run the bmad-auto-setup skill from their agent to finish setup (install the orchestrator + wire hooks/policy). * fix(installer): acknowledge post-install messages before the summary Show the "action needed" post-install messages (and gate on acknowledgment) before rendering the install summary, so "BMAD is ready to use!" remains the last thing the user sees. |
||
|
|
58c1e38be9 | fix(review): normalize review layer invocation (#2526) | ||
|
|
33fb5a9d04 |
refactor(quick-dev): fold deletion audit into edge case hunter (#2525)
Replace the standalone bmad-review-deletion-contract-auditor layer with a self-gated deletion check inside the Edge Case Hunter. - After its edge-case pass, the hunter runs a secondary deletion check on the same diff it already holds (Step 4) and folds any deletion findings into a single JSON array, tagged kind: deletion with a confidence. - Add kind and confidence fields to the hunter output; the existing four fields are unchanged. Edge cases stay primary; deletion findings are rare and usually empty. - step-04-review invokes the hunter once — no deterministic deletion scan, no agent resume, no fallback divergence. Classify routes deletion findings through the same triage categories. - Remove the standalone skill, its module-help.csv row, and its core-tools entry; tool count back to 12. Rationale: the hunter already sees the full diff, so a separate detection pass plus a context-rebilling continuation turn bought nothing; self-gating in the existing turn is cheaper and simpler. Deletions are rare and rarely load-bearing, so the check stays secondary to the edge-case pass. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
b0d508c7e1 |
feat(edge-case-hunter): add named-set generalization pass (#2524)
Add one bullet to Step 2 (Exhaustive Path Analysis) of
bmad-review-edge-case-hunter for implicit branches: when a diff
special-cases or changes the handling of one or more members of a
fixed set of values (enum, status code, sentinel, type tag,
flag, value range), the rest of the set are implicit branches —
silent branches absent from the diff.
The bullet sits as a peer to the existing "Walk all branching paths"
(explicit branches) and feeds the same shared loop ("For each path:
determine whether the content handles it" -> "Collect only the
unhandled paths"), so it needs no restated action and the output
contract is unchanged. "scan", not "enumerate", lets the model scale
effort to set size instead of flooding on large sets. Count
boundaries (0/1/many, off-by-one) are left to the existing first
bullet.
Catches implicit branches the syntactic walk misses. Measured on a
real regression (!ALL fixed, sibling !BLANK left case-sensitive):
catch rate 50% -> 100% over 10 runs at +19% tokens/run.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
57251adb71 |
chore(code-review): harden triage severity calibration (#2523)
Severity now lives in triage, but in the standalone code-review skill the adjudicator sees only the diff plus subagents' text, so it rates reachability blind to call sites and guards outside the hunk, and over-rates. - Add a "read the code before rating" step: open the source at each finding's location and judge reachability from real call sites, not the diff hunk alone. - Drop the "prefer the more conservative classification" tie-breaker so genuine toss-ups force a pick instead of biasing severity upward. - Remove the now-vacuous "Be precise." rule. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
ca6dc496d4 |
feat(dev-auto): record final_revision in spec frontmatter at exit (#2522)
Capture the post-commit HEAD as `final_revision` alongside the existing `baseline_revision`, so the orchestrator running immediately after a dev-auto session can derive the session's commit range (`baseline_revision..final_revision`) without inferring it from git state. The artifacts directory is gitignored, so the spec frontmatter is the only link from the out-of-tree spec to the in-tree commits. A single endpoint suffices: `git log baseline..final` regenerates the commit list on demand, and equal values mean no commits were made. Degrades to `NO_VCS` when version control is unavailable. Also documents both revision fields in docs/reference/dev-auto.md. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
6cbada8689 | docs: retitle dev auto integration reference (#2521) | ||
|
|
60b15dc772 |
fix(bmm-skills): remove explicit host memory loading (#2520)
Delete the explicit CLAUDE.md / memory file loading instruction from the implementation skills that still asked the model to fetch host session context itself. |
||
|
|
53d1bf7fb9 | docs: add dev auto integration reference (#2519) | ||
|
|
35b19db2e3 |
fix(installer): accept windows custom module paths (#2511)
* fix(installer): accept windows custom module paths * fix(installer): reject versioned windows local paths * style: format custom module manager --------- Co-authored-by: Brian <bmadcode@gmail.com> |
||
|
|
2e3632244b | docs: tighten forge idea skill wording (#2513) | ||
|
|
7b2d90a5f0 |
chore(bmm): retire bmad-investigate skill and its documentation (#2509)
* chore(bmm): retire bmad-investigate skill and its documentation
Removes the bmad-investigate skill, its case-file template, the EN/FR
forensic-investigation explainer docs, and every integration point:
Amelia's `IN` menu entry, the plugin marketplace manifest, module-help,
the workflow-map tables and HTML diagrams, and the agent-trigger tables.
EN/FR explanation sidebar orders are renumbered to close the gap left by
the removed doc.
Rationale: the skill's only non-redundant value was a durable, hand-off
case-file artifact — a workflow that is unproven in practice. Everything
else (evidence grading, hypothesis discipline, causal tracing) is
behavior a capable model already performs without a dedicated skill. The
skill also carried method-internal metaphor ("stronghold", "evidence
perimeter") that leaked into user-facing chat. Upstream signals agreed:
issue #2452 flagged the vocabulary leak and a maintainer noted the skill
should not auto-fire. Added in #2364.
Supersedes the in-flight cleanup in #2478 and resolves #2452 by removal.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(bmm): add bmad-investigate to removals.txt and note retirement
The retirement commit removed the skill source and docs but did not add
the removals.txt entry that triggers cleanup of the skill directory on
existing installs during update. Add it, plus an Unreleased CHANGELOG note.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
d5c5cc718f |
feat(dev-auto): route done spec to a follow-up review pass (#2508)
Invoking the skill on a spec with status `done` now resets `review_loop_iteration` and routes to step-04 for a fresh review pass, instead of ingesting the spec as context. This lets an orchestrator layer follow-up reviews on a completed spec without another skill. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
f04260b386 |
fix(review): give Blind Hunter project access; verbatim skill prompts (#2507)
The Blind Hunter review subagent was denied project access in dev-auto,
quick-dev, and code-review — limited to the diff, unable to inspect the
surrounding code that determines whether the change is correct. It is blind
to intent (no spec/context), not to the codebase.
Replace the prose reviewer descriptions with bare verbatim prompts that
invoke the named review skill on {diff_output}. Subagents already have
project read access by default, so the explicit prompt is the only control
needed; this also removes the vague "invoke via the skill" phrasing that
invited emulating the review instead of actually invoking it.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
149e872d2a |
feat(dev-auto): commit completed work at end of successful run (#2506)
* feat(dev-auto): commit completed work at end of successful run Add a commit line to step-04-review.md's Finalize section: if version control is available, commit (no push). This completes the VCS bookend with the existing start-of-run clean-tree check (step-01), making each unattended iteration atomic so the next one starts clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(dev-auto): trim over-prompting in step-04 Finalize Tighten the two closing lines: drop the redundant "Before HALT with status done" ordering (the line already sits right before HALT) and the "do not set on blocked exits" caveat (blocked exits never reach this line). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |