v0.7.0
Changed
-
Retired the
bmad-auto-devfork; the orchestrator now drives the upstreambmad-dev-auto
skill unmodified (bmad-code-org/BMAD-METHOD#2500, merged upstream) as its sole dev primitive.
The skill is the inner autonomous coding session; everything automator-specific — escalation,
sprint/ledger bookkeeping, repair-resume — stays in the orchestrator, which synthesizes
result.jsonfrom the spec the skill leaves on disk. There is no fork to keep in sync with upstream. -
Review is now a re-invocation of
bmad-dev-autoon the done spec, not a separate skill.
bmad-dev-autoroutes astatus: donespec to a fresh step-04 review pass (BMAD-METHOD#2508), so
the orchestrator's follow-up review just re-runs/bmad-dev-auto <done spec>in a fresh context.
review.enabledstill gates whether that follow-up pass runs at all; the newreview.triggerknob
(see Added) decides when it fires. The loop converges when a pass finishesdonewithout the skill
settingfollowup_review_recommended, still bounded bylimits.max_review_cycles(default 3). -
The skill commits each iteration; the orchestrator squashes to one commit per story.
bmad-dev-autonow commits its own work at the end of a successful run (BMAD-METHOD#2506). At
finalize the orchestrator collapses that chain plus its own sprint/ledger writes back onto the
pre-dev baseline into a single commit carrying the configured message —pre_commit/post_commit
hooks andscm.commit_message_templatestay authoritative.
Added
-
Skill-recommended review (
review.trigger).bmad-dev-autoself-reviews inline and sets
followup_review_recommendedon adonespec when its changes warrant an independent pass
(BMAD-METHOD#2505). The orchestrator consumes it:review.trigger = "recommended"(new default)
runs the follow-upbmad-dev-autoreview pass only when flagged;"always"keeps the old
run-every-story behavior. Adjustable in the TUI andpolicy.toml. The follow-up loop stays bounded
bylimits.max_review_cycles(default 3) — the oscillation guard — so a skill-recommended review
can never loop indefinitely. -
Non-bundled-skill preflight.
bmad-auto validateand run/sweep/resume start verify that
bmad-dev-autoand the two adversarial review hunters (bmad-review-adversarial-general,
bmad-review-edge-case-hunter) — whichbmad-dev-auto's step-04 invokes inline on every run — are
installed in each active CLI skill tree, failing loudly with remediation instead of stalling mid-run
on anUnknown command. Worktree provisioning copies these upstream skills from the main repo,
since they are not bundled in the wheel. -
result.jsonworkflowis now an enforced contract on the dev path.verify_dev/
verify_dev_bundlereject a mismatch againstverify.DEV_WORKFLOW("auto-dev"); the synthesized
result carries"auto-dev". Review re-runs the same skill, so it carries the same tag, and
verify_reviewstays purely disk-derived — it is never handed the result.json. -
Pluggable terminal-multiplexer seam (groundwork for native Windows). All tmux usage now goes
through aTerminalMultiplexerABC (get_multiplexer());TmuxMultiplexeris the only code that
shells out totmuxand the only place the POSIXsh -cparked-window trailer lives. The generic
adapter (renamedgeneric_tmux.py→generic.py),runs.py,tui/launch.py,probe.py, and
tui/data.pyall route through it, so a future non-tmux backend slots in with no engine changes.
Behavior on Linux/macOS/WSL is byte-identical; no native-Windows backend ships yet (see ROADMAP). -
POSIX portability hardening + CI guard. Scattered POSIX-only primitives are guarded behind a
platform seam —SIGKILLfallback, detach kwargs,terminate_pid,os.devnull— and the Unity
plugin degrades off Linux (/proc→psutilvia a new optionalwindowsextra,/tmp,cp -a
CoW, symlinks,start_new_session), keeping every Linux fast path unchanged. A new
tests/test_portability_guard.pyAST/byte scan blocks new POSIX-only patterns from creeping back,
with sanctioned exceptions carrying# portability:acks. -
Adapter & profile authoring guide.
docs/adapter-authoring-guide.mdnow carries the complete
CLIProfile/HookSpecfield reference (the single canonical schema home) and a "writing a new
adapter class" section for non-tmux transports — linked from the README documentation index.
Removed
- Retired the bundled
bmad-auto-devandbmad-auto-reviewskills.bmad-auto initnow installs
three bundled skills —bmad-auto-resolve,bmad-auto-sweep,bmad-auto-setup— and the upstream
bmad-dev-autoskill (from a recent bmm module) is a hard prerequisite.bmad-auto-review's
adversarial review is fully covered bybmad-dev-auto's inline step-04 (Blind + Edge-Case hunters);
the independent Acceptance Auditor layer is dropped, and the two hunters are now always-required base
skills rather than gated onreview.enabled. The canonicaldeferred-work-format.mdmoved into
bmad-auto-sweep, its remaining owner.
Fixed
- Resolving a CRITICAL escalation no longer loops on a manual-rollback prompt. Re-arming an
escalation requests a clean rebuild, which in non-worktree (in-place) runs means resetting to the
story baseline. With the defaultscm.rollback_on_failure = falsethe orchestrator paused for a
manual reset — but never clearedbaseline_commit, so following the instructions (git reset --hard,
thenresume) re-paused on the next resume, an endless loop._rollback_or_pausenow no-ops when the
tree is already at baseline (nothing this attempt touched), so a clean tree — including one the
operator just reset — proceeds straight to the re-drive. The same guard suppresses the spurious prompt
when an escalation left no changes at all. - Manual-recovery notice wording. The prompt no longer claims the story "failed" — it now reflects
the real cause ("escalation was resolved; re-driving needs a clean baseline" vs. "attempt was stopped"). - Resolved escalations now actually re-drive instead of HALTing on a stale
blockedspec.verify_dev
only recordedtask.spec_fileon a fully successful session, so a dev session that escalated with a
blockedspec (the common escalation case) left it unset.rearm_escalationthen had no spec path to
flip toready-for-dev, so on resumebmad-dev-auto's step-01 routing re-HALTed on the still-blocked
frontmatter — a second loop. The orchestrator now captures the spec the session produced when it
escalates or defers (the synthesized result names it even on a HALT), so re-arm flips the status and
the re-drive proceeds, and a deferred story's spec is stashed as intended. - Copilot dev stage no longer stalls on a subagent
agentStop. Copilot firesagentStopfor
every subagent turn too — with an emptytranscriptPathand a tool-use session id, not the main
session's turn-end. With dev decoupled tobmad-dev-auto(which implements via subagents), that
premature Stop reached the dev stage, where 0 nudges made the orchestrator declare an outright stall
before the skill wrote its terminal spec (same root cause as the 0.6.4 review stall). A new
per-profilesubagent_stop_without_transcript(true forcopilot) ignores aStopcarrying no
transcript, so the main session's real turn-end drives completion — and restores usage tallying,
since that Stop carries the transcript. - Process liveness/termination no longer risks signaling the wrong process. A corrupt
engine.pidread as0or negative would makeos.killtarget a process group — for0, the
orchestrator's own — sopid_alive/terminate_pidnow reject non-positive PIDs before signaling.
The remaining liveness checks (runs.py,tui/data.py) that calledos.kill(pid, 0)directly now
route throughpid_alive, since on Windowsos.kill(pid, 0)maps toTerminateProcessand is
destructive; a CI guard blocks bareos.kill(_, 0)from regressing.