9db48053e8
Subagent/cron sessions died mid-run with "Session DB append_message failed: 'NoneType' object has no attribute 'execute'": a teardown owner (cron run_job finally, delegate timeout owner, agent close()) called SessionDB.close() — nulling _conn — while a still-unwinding worker had one more transcript flush to land. The flush then hit None.execute, the turn force-ended as session_persistence_failed, and the session tail was silently dropped while cron delivery reported last_status: ok. Fix at the shared persistence boundary: _execute_write and the _read_ctx writer-lock fallback detect the closed handle under self._lock and reopen a connection to the same database file with a loud WARNING naming the race. Read-only handles never reopen — they raise an explicit 'was closed' error. A failed reopen raises an OperationalError naming the teardown race so classify_persistence_error gets a real cause. Closes #94736