The headline feature was adding Codex as a harness alongside Claude. I pulled the spawning behind a spawnHarness abstraction (spawnCodex, spawnInherit) so a session can run under a different agent CLI without the rest of the daemon caring which one it is. That’s the first step toward assist not being Claude-only.

In the web UI, launching now shows an optimistic pending card immediately rather than waiting for the daemon to confirm the session exists. The socket and sidebar navigation (useSend, useSidebarNavigation) reconcile that placeholder against the real session once it arrives, so a launch feels instant instead of lagging behind a round trip.

A cluster of backlog-run correctness fixes landed too. An item is no longer marked done when a review exits abnormally (resolvePhaseResult, runReview) — an aborted or crashed review shouldn’t count as a pass. And an inserted phase now actually runs instead of being skipped over (insertPhaseAt), which had been quietly dropping freshly-inserted work.

The rest were smaller fixes and hygiene: a backlog-list type filter (TypeFilter) in the web UI, a protocol version bump so a stale daemon heals itself by reconnecting (buildHello), multi-line PR bodies preserved on Windows where the shell was mangling newlines, vitest workers capped to stop intermittent test flakes, and the xterm packages promoted from dev to runtime dependencies where they belong.