Skip to content

v0.1.0b3 — 2026-04-27

Cutover-enabling cut. Three engine changes plus the first project-specific adapter sibling release. Together these are what an operator needs to retire a prior in-house orchestrator and put oxi in its place.

Headline

MemoryBackend Protocol with NullMemoryBackend and FileMemoryBackend. Adapters can now expose a memory backend so the planner reads relevant prior lessons before each plan. Default is no-op (existing adapters unchanged). The file backend reads ~/.claude-setup/memory/auto/ by default — keyword-overlap search, no embeddings, no LLM in the loop. Forks that want vector search write their own backend. (#202)

What else changed

  • ship_recovery dirty-tree filter (F-01 guard). Recovery previously ran git add -A on any worktree with uncommitted changes, sweeping stray host files into the recovery commit. New DispatchPolicy.ship_recovery_dirty_tree_policy (default "files_touched_only") stages only tracked-modified plus untracked-in-plan paths. Stray files surface as ship_recovery_skipped_dirty_tree ledger events instead of landing in the PR. Three policies: strict | files_touched_only | permissive for legacy behavior. (#201)

  • CI fixes that unblock a green main. Fixed two strict-mypy errors in adapter.py introduced by #159, the unused [README](../README.md) link in architecture.md that was tripping mkdocs --strict, and a wall-clock-fragile test in test_auto_external_dedup.py that was silently aging out the moment date drift moved past its anchor. (#206)

  • infra/oxi/ production deployment surface. Two systemd units (oxi-tick.service/.timer + oxi-dashboard.service), an env.example, and a first-time install README. Single-tick architecture: every reaper / pr-watcher / auto-merge / ship-recovery pass runs inside oxi v3 tick, so the deployment is two units, not eight. (#204)

  • Cutover spec and Phase 0 runbook. First end-to-end documented path for retiring a prior autonomous coding engine. Generic enough to apply to any prior system; specific values (paths, hostnames, version) come from a per-project cutover spec. (#200, #205)

Sibling release: oxi-adapter-contably 0.1.0b1

The first project-specific adapter to ship. ~70-line dataclass implementing the 10-method Adapter Protocol with the values for the Contably engineering instance. Day-1 dispatch concurrency is conservative (2), to be raised to the design ceiling (20) once the first 2 engine-originated PRs land cleanly. Wired through pip install --pre oxi-adapter-contably.

This is also the proof that the adapter pattern works: every project-specific value (repo, budget, dispatch host, scope, promote recipe) lives in 70 lines outside oxi-core. (#203, #208)

What "beta" means (unchanged)

  • No breaking changes within 0.1.0b*. Adapters that work on 0.1.0b1 work on 0.1.0b3.
  • 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.0b3
pip install --pre oxi-adapter-contably  # first release

--pre remains required.

What's next

  • 0.1.0b4+: continue ratcheting v3/ modules into the mypy strict list
  • 0.1.0b4+: more adapter siblings as forks adopt oxi
  • 0.2.0 (eventually): adapter protocol changes, if any are warranted

Audit trail

PRs merged into this cut: #200 (cutover spec), #201 (ship_recovery filter), #202 (memory backend), #203 (Contably adapter scaffold), #204 (systemd units), #205 (Phase 0 runbook), #206 (CI fix), #207 (gitignore .claude/), #208 (day-1 max_concurrent gate).