Skip to content

v1.7.0 — Persistent Instances

Choose a tag to compare

@barkain barkain released this 01 May 10:45
· 24 commits to main since this release
d450626

Persistent Instances

Instances now survive backend restarts and can be resumed across sessions with full conversation context preserved. This enables long-lived advisory teams that run across days or weeks.

New Features

  • State persistence: All instance state saved to {log_dir}/state/instances.json with atomic writes and file locking. State saved on every mutation (spawn, busy/idle transitions, terminate).
  • Auto-reconnection: On backend startup, live tmux sessions are reconnected automatically. Dead sessions are recovered using claude --continue / codex resume --last.
  • Stable session ID: Workspace paths stay consistent across restarts — no more orphaned directories.
  • Graceful shutdown: Backend shutdown preserves instances instead of killing them. Tmux sessions continue running independently.
  • list_persisted_instances (MCP tool): Discover previous instances available to resume from any new session.
  • resume_instance (MCP tool): Spawn a new instance that picks up a previous one's conversation context. Works for both Claude and Codex.
  • No idle timeout by default: instance_timeout_minutes defaults to 0 so long-lived teams aren't auto-terminated. Set to a positive value to re-enable.

What Survives What

Event Instance alive? Context preserved?
Backend restart ✅ Yes ✅ Yes
Backend crash ✅ Yes ✅ Yes
tmux session killed Recovered ✅ Yes (via --continue / resume)
Machine reboot Recovered ✅ Yes (via --continue / resume)
Explicit terminate_instance No Workspace kept, resumable

Workflow: Resume Previous Team

1. list_persisted_instances()  → see all previous instances
2. resume_instance(instance_id="...", name="analyst-v2")
   → spawns with claude --continue / codex resume --last
3. send_to_instance(...)  → continue where you left off

Bug Fixes

  • Fixed shell health check false positive from export commands in tmux scroll buffer
  • Fixed codex resume flag mutual exclusion (-a never vs --dangerously-bypass-approvals-and-sandbox)
  • Fixed codex resume showing interactive session picker (now uses --last)
  • resume_instance generates new UUID (doesn't reuse original instance ID)
  • StateStore uses dedicated lock file across full read-modify-write cycle
  • _save_state_async() runs file I/O in executor for hot async paths

Documentation

Updated: CLAUDE.md, ARCHITECTURE.md, API_REFERENCE.md, FEATURES.md, TROUBLESHOOTING.md

Testing

  • 1260 unit/integration tests passing
  • Full E2E verified: spawn 3-agent team (Opus + Haiku + Codex) → debate → terminate → resume with context preserved