Commit Graph
1987 Commits
Author SHA1 Message Date
Brian Madison 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
2026-07-22 21:45:18 -05:00
Brian Madison 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.
2026-07-22 18:50:35 -05:00
Brian Madison 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.
2026-07-21 19:53:39 -05:00
Brian Madison 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).
2026-07-21 16:18:42 -05:00
Brian Madison 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
2026-07-21 13:00:11 -05:00
Brian 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.
2026-07-19 18:40:47 -05:00
Brian 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.
2026-07-18 23:49:22 -05:00
N0wahandBrian 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>
2026-07-18 20:06:35 -05:00
Alex Verkhovsky 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.
2026-07-15 13:19:03 -07:00
Alex Verkhovsky 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.
2026-07-14 09:26:17 -07:00
Alex Verkhovsky 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.
2026-07-14 02:35:00 -07:00
Alex Verkhovsky 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
2026-07-12 21:00:38 -07:00
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>
2026-07-12 00:46:01 -05:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-07-07 19:31:55 -07:00
Dov Benyomin Sohacheski 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
2026-07-06 17:33:20 -05:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-07-06 10:58:41 -07:00
Alex Verkhovsky 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.
2026-07-06 10:46:41 -07:00
Alex Verkhovsky 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).
2026-07-06 07:59:54 -07:00
Alex Verkhovsky 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.
2026-07-06 07:17:22 -07:00
Alex Verkhovsky 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
2026-07-06 03:14:38 -07:00
Alex Verkhovsky 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
2026-07-06 02:11:09 -07:00
Alex VerkhovskyandClaude Fable 5 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>
2026-07-06 01:30:30 -07:00
Alex Verkhovsky 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.
2026-07-05 11:45:50 -07:00
Alex Verkhovsky 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' (682a2005), which
reads as a compliance step: the agent spawns an explorer, then explores
and plans itself without waiting for it. Restore the isolate framing,
scope inline reading to narrow localized tasks, and require planning
from the subagent summaries.
2026-07-05 11:22:53 -07:00
Alex Verkhovsky 1f29bd3d0a fix(review): harden finding triage independence (#2555) 2026-07-05 11:08:19 -07:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-07-03 23:05:29 -05:00
github-actions[bot] 081e64ee5a chore(release): v6.10.0 [skip ci] v6.10.0 2026-07-03 23:56:56 +00:00
Brian 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.
2026-07-03 18:55:14 -05:00
JunandBrian ce65425f21 fix(bmad-help): resolve central config (#2541)
Co-authored-by: Brian <bmadcode@gmail.com>
2026-07-03 10:04:37 -05:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-07-03 10:02:49 -05:00
PinkyDandClaude Opus 4.8 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>
2026-07-02 22:55:26 -07:00
PinkyDandClaude Opus 4.8 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>
2026-06-29 11:34:18 -07:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-06-28 23:25:46 -05:00
Alex Verkhovsky 74e8f61229 feat(party-mode): add anti-consensus club (#2530) 2026-06-28 23:23:38 -05:00
Jacob du ToitandBrian d9210244f3 feat(elicitation): add subtraction and map-is-not-the-territory methods (#2515)
Co-authored-by: Brian <bmadcode@gmail.com>
2026-06-28 23:20:57 -05:00
Brian 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.
2026-06-28 23:19:33 -05:00
Alex Verkhovsky 58c1e38be9 fix(review): normalize review layer invocation (#2526) 2026-06-27 16:42:24 -07:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-06-27 14:22:47 -07:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-06-27 13:30:30 -07:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-06-27 09:15:59 -07:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-06-27 09:02:26 -07:00
Alex Verkhovsky 6cbada8689 docs: retitle dev auto integration reference (#2521) 2026-06-27 08:25:20 -07:00
Alex Verkhovsky 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.
2026-06-27 08:05:15 -07:00
Alex Verkhovsky 53d1bf7fb9 docs: add dev auto integration reference (#2519) 2026-06-27 07:42:53 -07:00
Davor RacicandBrian 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>
2026-06-26 20:06:07 -05:00
Alex Verkhovsky 2e3632244b docs: tighten forge idea skill wording (#2513) 2026-06-26 20:05:17 -05:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-06-24 19:42:10 -07:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-06-24 16:13:07 -07:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-06-24 15:40:39 -07:00
Alex VerkhovskyandClaude Opus 4.8 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>
2026-06-24 15:14:28 -07:00