Every task passed. The release didn't.
I build AIWorkHub, a VS Code extension and MCP server that runs AI coding agents as a task system. A manager model plans and reviews but doesn't write features. Workers write code in isolated worktrees, one card at a time. A card lands only when its declared tests and gates pass.
That process accepted 27 commits for the 0.12.95 release. Then I ran the full test suite on Linux, as I do before every tag.
25,326 tests passed. 55 did not.
18
failed because the release script tests an archive with no .git directory.
13
failed because of the test environment: no Node in that Linux install, or tests running as root.
4
failed the same way on the previous release tag.
20
traced back to four changes in this release.
Each of those four changes had passed its own validation. Three had only left something stale: a test fixture missing a newly imported module, a test that still expected a compiler to be refused, and a tool description over its published word limit.
The fourth was a real bug. A new feature recorded why an accept failed, and it wrapped every failed reply. That included the reply a duplicate accept gets while the first is still running. The contract says that refusal writes nothing. The new code wrote to the task database anyway.
The test guarding that contract lives in another file, and the card's validation didn't run it.
Six failures were still unexplained at one point. I ran them against the previous tag, which took 67 seconds. Four failed there too. Two passed, and those two were the bug.
A per-task gate proves a change does what it claims. It can't prove the change left its neighbours alone.
So I keep two gates. Each card runs narrow, targeted tests, which keeps agents fast and cheap. Each release runs everything on Windows and Linux, against a baseline of known failures. Every line in that baseline was measured, and anything not on it stops the release.
That rule stopped this release a second time, after those fixes. Three tests that had passed in two earlier full runs failed. Two of them came from one test with a 30-second limit that needs 28 seconds on Linux with nothing else running. Under full load it ran out of time.
None of the four reached a shipped version.
AIWorkHub is on GitHub: github.com/shrec/AIWorkHub






Comments
0 comments