Each OpenCode thread's startSession (Layers/OpenCodeAdapter.ts) spawns its own scoped opencode serve via connectToOpenCodeServer, plus OpenCodeServerOwner owns another per-instance server, plus probes/inventory spawn more — all opening the same shared OpenCode SQLite DB (~/.local/share/opencode/opencode.db). This multiplies SQLite lock contention and produces the immediate 'database is locked' turn-start failures seen in live userdata (Oct 3-4).
Proposed: share one scoped server per provider instance across sessions (extend OpenCodeServerOwner.withServer to adapter startSession), lengthen the 30s idle TTL / reference-count across threads, and serialize startups behind a mutex so probes don't race turn starts.
Diagnosed from live-DB forensics; agent harness openrouter/meta/muse-spark-1.3-contributor via T3 Code.
Each OpenCode thread's
startSession(Layers/OpenCodeAdapter.ts) spawns its own scopedopencode serveviaconnectToOpenCodeServer, plus OpenCodeServerOwner owns another per-instance server, plus probes/inventory spawn more — all opening the same shared OpenCode SQLite DB (~/.local/share/opencode/opencode.db). This multiplies SQLite lock contention and produces the immediate 'database is locked' turn-start failures seen in live userdata (Oct 3-4).Proposed: share one scoped server per provider instance across sessions (extend
OpenCodeServerOwner.withServerto adapterstartSession), lengthen the 30s idle TTL / reference-count across threads, and serialize startups behind a mutex so probes don't race turn starts.Diagnosed from live-DB forensics; agent harness openrouter/meta/muse-spark-1.3-contributor via T3 Code.