v1.7.0 — Persistent Instances
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.jsonwith 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_minutesdefaults 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
exportcommands in tmux scroll buffer - Fixed
codex resumeflag mutual exclusion (-a nevervs--dangerously-bypass-approvals-and-sandbox) - Fixed
codex resumeshowing interactive session picker (now uses--last) resume_instancegenerates new UUID (doesn't reuse original instance ID)StateStoreuses 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