Skip to content

v0.1.0b4 — 2026-04-27

Production-feedback cut. Two structural fixes prompted by observed gaps in the first Mini-local saturate run against the Contably codebase. Both increase how much oxi gets done per dollar.

Headline

saturate now closes the loop on shipped work. The continuous-dispatch supervisor was missing two flow steps that oxi v3 tick already ran: pr_watcher.watch (stamps PRs onto tasks, transitions merged/closed) and auto_merge.run (critic-gated auto-merge). Without them, saturate dispatched forever without ever closing the loop — operators had to manually merge every PR even when the critic would have approved it. New iteration body: ingest → auto_observe → seed → dispatch_loop → pr_watcher → auto_merge. (#211)

What else changed

  • ship_recovery rescues failed-task work. The candidate filter was status = 'dispatched' AND pr_number IS NULL. After a worker crashed (SIGTERM, turn-budget exhaustion, rate-limit timeout), dispatch classified it as failed before ship_recovery saw it. The work — real commits in the worktree — got silently discarded. New filter: status IN ('dispatched', 'failed'), plus a new push_only mode for the case where the worker committed real work but exited before reaching the push step. Observed in production: $4.24 of T0-1/T0-3 commits would have been auto-recovered by this. (#210)

  • No adapter changes. 0.1.0b4 is engine-only. Adapters that work on 0.1.0b3 work on 0.1.0b4 unchanged.

Observed impact (first Mini-local saturate run, 2026-04-27)

Metric b3 b4 (predicted)
Hit rate 1 of 3 dispatches → PR 3 of 3 (T0-1 + T0-3 would auto-recover)
Cost per recoverable PR $5.90 ~$1.97
Manual operator merges All PRs Only critic-rejected

What "beta" means (unchanged)

  • No breaking changes within 0.1.0b*. Adapters that work on 0.1.0b1 work on 0.1.0b4.
  • Adapter protocol is frozen until 0.2.0a*.
  • Auto-merge defaults stay off. Operators opt in per DispatchPolicy().auto_merge.

Install

pip install --pre --upgrade oxi-core    # picks up 0.1.0b4

--pre remains required.

What's next

  • 0.1.0b5+: persist per-session dispatch logs to <oxi_dir>/dispatch-logs/<session_id>.log for forensic-grade failure investigation
  • 0.1.0b5+: continue ratcheting v3/ modules into the mypy strict list

Audit trail

PRs merged into this cut: #210 (ship_recovery extension), #211 (saturate flow).