Skip to content

v0.14.0

Choose a tag to compare

@kvnwolf kvnwolf released this 21 Aug 02:00
· 7 commits to main since this release

🧦 The build loop stopped being a script.

Until now, /dobby:execute handed your whole plan to a native Claude Workflow: a JavaScript program that sequenced waves, counted retries and classified failures. It worked, and then a real run showed what it cost β€” 15 tasks, 1h43m, 1.75M tokens, 3 finished. One task ran out of its two attempts and the script switched off ten dependents in a cascade. Ten of that run's verdicts were environment β€” a dead browser β€” and each one burned an attempt exactly like a genuine bug would.

v0.14.0 takes the script out. The Architect now dispatches named subagents itself, and they talk to each other.


πŸ” Tasks start when they're ready, not when a batch says so

Waves are gone. A task begins the moment its own dependencies are done β€” no barrier waiting for a group to finish. Two exceptions, both deliberate: a destructive task runs alone, and two tasks whose Affected areas overlap never run at once (compared as real, canonical repository paths, which dobby spec lint now enforces).

And when a task dies, only its genuine dependents stop. Everything independent keeps going. No more five empty waves printing ⊘.

πŸ’¬ Workers now message each other

This is the one that changes how a fix feels. When QA finds a defect, it no longer ends the round so a fresh implementor can re-read the task, the spec and the code from nothing. It writes directly to the implementor that still has all of it loaded β€” and to the test-author when the test contract itself is the problem, described as behaviour only, never implementation, so the tests stay honest.

QA numbers every message it sends ("round 2 of 5") so the count lives in the text instead of somebody's memory. Five rounds, then it stops and reports. An environment failure goes to the Architect and doesn't spend a round β€” a dead browser is not a bug in your code.

🧱 Quality split into three layers, one owner each

Nothing told the old verifier what its job was, so it grabbed the widest thing available: it ran the entire quality gate and then discarded the lint findings by hand, and triaged a 3130-test suite to work out which reds were even its own.

Now:

  • The edit hook applies Biome's safe fixes and reports type errors β€” scoped to the file you just edited. On TypeScript 7's native compiler that costs about 0.15 s, so a type error surfaces as you write it instead of ambushing you at commit.
  • The implementor runs the full gate itself before handing off β€” the Exit gate, serialised so two of them never judge each other's half-written code.
  • QA proves behaviour and nothing else: the browser where there's an app, exercising the artefact for real where there isn't.
  • The PR review judges the finished change, tests included.

Tests deliberately did not move into the hook. vitest related pulls in 24 of 29 suites and ~48 s from any file in a densely-imported repo β€” and since the test-author writes the contract before implementation, a task's tests are red by design the whole time. Type checking moved; the suite stayed.

🎯 No more hand-written KNOWN-RED lists

Tasks used to carry prose telling agents which failures to ignore. One agent cloned main into /tmp just to be sure. Now a green baseline records what was already failing before the work began β€” by test identity, not by file β€” and the gate reports only what newly broke. A file with duplicate test names is marked ambiguous and exempts nothing, and says so, because a gate that guesses is worse than one that shouts.

🌐 QA stops rediscovering how to drive a browser

The cmux browser protocol now ships inside the CLI, with its provenance recorded, and dobby env hands QA the instructions for the environment it's actually in. No lookup, no reconstruction from memory.

πŸ”Œ And the ground for what's next

Environment coupling moved behind an adapter seam (cli/src/environment.ts) with two real implementations β€” cmux and plain terminal. Four scattered CMUX_WORKSPACE_ID reads became one. Supporting another host runner is now writing an adapter instead of editing the CLI. (Refs #27 β€” the Claude Desktop adapter is still ahead.)


⚠️ Breaking changes β€” read before you upgrade

dobby:verifier is now dobby:qa. This is the one that will bite. Claude Code pins its agent registry at session startup, so a session you already had open keeps the old one and dobby:qa won't resolve. Run /reload-plugins, or start a fresh session β€” and on a host without that command, a fresh session is the only way through. If /dobby:execute reports an unknown agent type right after upgrading, this is almost certainly why.

The edit hook now reports type errors, not just Biome findings. Expect to see more at edit time β€” that's the point, and it's scoped to the file you touched.

The implementor now runs the gate itself before handing off, inverting the old rule that forbade it from running any check.

dobby env no longer reports workflowRecipe. Agent model and effort live in each agent's frontmatter, full stop. dobby build-plan no longer emits waves[][] β€” it returns tasks with their dependsOn and destructive flags.


πŸ“¦ Upgrading

bun update @kvnwolf/dobby

Then restart your Claude Code session (or /reload-plugins) before running /dobby:execute.

/dobby:upgrade walks the full v0.14 note if you're jumping several versions.

Three architecture decisions came out of this one, if you want the reasoning: ADR-0029 (subagent dispatch, superseding ADR-0023), ADR-0030 (the three-layer quality model), and ADR-0031 (vendoring the browser protocol). ADR-0029 also records the residual risks that were accepted rather than hidden β€” worth reading if you run plans with many parallel tasks.