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_recoverydirty-tree filter (F-01 guard). Recovery previously rangit add -Aon any worktree with uncommitted changes, sweeping stray host files into the recovery commit. NewDispatchPolicy.ship_recovery_dirty_tree_policy(default"files_touched_only") stages only tracked-modified plus untracked-in-plan paths. Stray files surface asship_recovery_skipped_dirty_treeledger events instead of landing in the PR. Three policies:strict|files_touched_only|permissivefor legacy behavior. (#201) -
CI fixes that unblock a green main. Fixed two strict-mypy errors in
adapter.pyintroduced by #159, the unused[README](../README.md)link inarchitecture.mdthat was tripping mkdocs--strict, and a wall-clock-fragile test intest_auto_external_dedup.pythat 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), anenv.example, and a first-time install README. Single-tick architecture: every reaper / pr-watcher / auto-merge / ship-recovery pass runs insideoxi 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 on0.1.0b1work on0.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 list0.1.0b4+: more adapter siblings as forks adopt oxi0.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).