ultracodex 0.4.0
The multi-vendor release. One [route] table now sends each agent in a workflow to the backend best cast for it — implementation on one vendor, gates on a second, adversarial review on a third, one journal for all of it.
OpenCode backend
Route any label to opencode and it runs on whatever provider your opencode speaks — hosted or local. The adapter drives opencode serve's HTTP API: synchronous turns, SSE activity + live usage ticks, graceful /abort, session-resume repair turns, and wire structured output (json_schema) that degrades to a prompt contract mid-call when a provider rejects it. Tested against opencode 1.16.2.
[route]
"impl:*" = "opencode"
"review:*" = "claude"
"*" = "codex"
[backends.opencode]
model = "deepseek/deepseek-chat"Read the sandbox note before routing untrusted content here — opencode has no OS sandbox; ultracodex doctor now prints the full posture (docs/operations.md).
Executor Contract v1
The backend seam is now a documented, versioned contract — docs/executor-contract.md: every adapter declares a capability descriptor (schema / resume / interrupt / usage / activity / sandbox), the engine owns the degradation rules for whatever a backend lacks (journaled as warnings, never silent), and a shared 10-assertion conformance kit runs against every adapter via a scripted fake of its harness. All three backends pass. Want a fourth? The contract + kit are designed so you never read engine source — the OpenCode adapter was built exactly that way.
The kit caught three real bugs in the existing adapters on day one (an abort that leaked process trees, validation against the wrong schema form, a missing wire-rejection fallback). All fixed here.
Verified recursively
The acceptance test for this release was a run on this repository: OpenCode implemented doctor's new opencode section, Codex gated it with the full test suite, Claude adversarially reviewed it (found real issues, requested changes, approved the fix) — five agents, three vendors, one journal, green. Every build wave of the release was itself executed by ultracodex fleets.
Also
ultracodex doctor: opencode section (binary + version pin + security posture) when a route targets opencode.- Hardened dead-runner detection in
ps-less sandboxes. - 338 → 465 tests; suite stays hermetic (scripted fakes for all three harnesses, no API keys in CI).
Zero-config behavior is unchanged: without a config file everything runs on Codex, exactly as before.