v0.13.0 — reliability audit batch + live-E2E lifecycle fixes
The 2026-07-09 agent-flow reliability audit (AF-01..AF-16) is fully resolved,
plus two lifecycle defects found by a live opencode file-board E2E loop.
Reliability audit (AF-01..AF-16)
- AF-01 Identity-safe worker exit: a force-ejected zombie's cleanup can no
longer eject the fresh retry entry installed under the same issue id. - AF-02 Force-eject now records and kills the backend process group for
every backend kind (claude/opencode/gemini/agy/kiro/pi), not just Codex. - AF-03 Resumed workers get a fresh stall window; long pauses no longer
burn a retry on the first reconcile tick. - AF-04 State PATCH on a running ticket returns 409 without mutation.
- AF-05 Plain/Gemini/Claude backends expose canonical completion previews;
silent exit-0 empty turns fail instead of looping. - AF-06 Board scans ignore legacy
.tmp-*.mdfiles; startup sweeps only
Symphony-owned temps and spares operator files. - AF-07 Reconcile isolates per-entry force-eject errors; cancelled paused
zombies still eject. - AF-08
stop()bounds cancellation-resistant worker drain and finalizes
their leases before the run registry closes. - AF-09 Corrupt Codex stdout closes the backend, fails later turns fast,
and a failed reap stays retryable by a later stop. - AF-10 Dead-owner lease reclaim kills any recorded live process group
(with a persistedreclaimingfence) before the row is redispatchable;
non-positive persisted pids are rejected at the signalling boundary. - AF-11 Continuous-improvement lifetime cap warns once;
require_idle_board
blocks CI/worker overlap including terminal-persist work. - AF-12 Tracker parse failures warn; duplicate ids collapse
deterministically; delete serializes with mutation; a running id missing
from refresh becomes a visible degraded state. - AF-13 Rewind budget applies to custom and non-English pipelines via
configured active-state order. - AF-14 Closed by research: Codex 0.130/0.144 schemas both require
tokenUsage.lastand.total; no speculative production branch. - AF-15 Dispatch state no longer retains completed ids;
stop()clears
diagnostics. - AF-16 First/continuation/phase-rebuild prompts share one lifetime
turn-budget basis (max_total_turnsdocumented in workflow examples).
Live-E2E lifecycle fixes
- Done-squash preserves merged lineage:
auto_commit_on_donenow squashes
ontomerge-base(HEAD, merge target)instead of the fork point, so a branch
already merged by Verify is no longer rewritten onto an orphan lineage — the
post-Done fallback merge no longer hits guaranteed add/add conflicts that
demoted healthy Done tickets to Blocked. - Verify evidence validation matches the shipped contract: evidence cells
citing an existing artifact plus a qualifier (or several backticked
artifacts) are accepted; Security Audit rows with ann/aresult need no
artifact. Fabricated citations and prose-only evidence still hard-rewind. - Verify stage prompts now show valid/invalid evidence-cell examples.
Hardening
- OpenCode telemetry and worktree setup hardening.
Verification
Full suite 1371 passed / 5 skipped; ruff and pyright clean. The complete
pipeline (Todo → In Progress → Verify → Learn → Done with merge gate) was
exercised end-to-end three times with a real opencode agent building a working
app; the final two runs completed with the Done ticket surviving the terminal
grace and the fallback merge succeeding. Decision log:
docs/changelog/changelog-2026-07-10.md.