v0.4.0 — resilience, parallel-correctness & PR reconciliation
The plugin's first hardening release: a tested, CI-gated, resilient autonomous board-driver. Everything since v0.2.0 (PRs #4–#13).
Highlights
Testing & CI
- First test suite — 116 tests, runs standalone (no protoAgent host needed).
- CI on the org's Namespace runner (
rufflint + format +pytest). ruff-clean source; manifest ↔ pyproject version coherence.
Throughput
- Parallel drives —
max_concurrent > 1builds several features at once, each in its own worktree. - Merge-poll / PR reconcile Done edge — works without a public webhook URL.
P0 — resilience (survives unattended)
- Failure classification + backoff — transient failures (rate-limit / network / merge-conflict) retry with backoff; capability failures escalate a tier or block; terminal failures (auth / unknown) block. No more "any failure → permanently blocked."
- Stuck-coder watchdog (
coder_timeout_s, default 30 min) — a hung coder is killed and reaped; everyawaitin a drive is now bounded. - Crash recovery on boot — features stranded
in_progressby a previous run are resumed (adopt an open PR) or reset toready.
P1 — concurrency-correctness
- Hot-file overlap guard — two parallel coders never edit the same file (a guaranteed conflict).
- Review-queue WIP limit (
max_pending_reviews, default 5) — don't pile up PRs faster than they merge. - Periodic health sweep (
health_sweep_interval_s) — reclaim slots from dead drives, reap orphaned worktrees. - Foundation-aware dependency gate — opt-in
dep_gate: reviewreleases non-foundation blockers atin_review;foundation=Truefeatures always gate dependents on merge.
P2 — reconciliation
- PR reconcile —
in_reviewfeatures are reconciled to their PR's real state: merged →done, closed-unmerged →blocked(the last "stuck-forever" class).
Compatibility
- Requires protoAgent ≥ 0.27.0, the
br(beads) CLI,git+gh, and thedelegatesplugin with anacpcoder. - Ships disabled; new config knobs all have safe defaults (serial, merge-gated, watchdog on). No breaking changes — install/enable as before.
Full diff: v0.2.0...v0.4.0