{"repo":"NousResearch/hermes-agent","public_id":"102589","display_label":"SQLite state.db concurrent-write and locking fixes","summary":"These issues and fixes address multiple sources of unintended concurrent writes and lock conflicts on state.db, including lifecycle guard raw-opens bypassing POSIX locks, WAL split-brain conditions, and serialization of SQLite access across cron, gateways, dashboard, and doctor.","subsystem":null,"counts":{"members":4,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":2},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":108076,"merged_at":"2026-09-11T13:21:49+00:00"},"resolution":{"state":"resolved","by":"pr-108076"},"freshness":{"state":"verified","last_verified_at":"2026-09-11T13:21:49+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.5},"fix_edges":[{"issue_number":102120,"pr_number":108076,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-11T13:21:49+00:00"},{"issue_number":102589,"pr_number":108076,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-11T13:21:49+00:00"},{"issue_number":107440,"pr_number":108076,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-11T13:21:49+00:00"},{"issue_number":107688,"pr_number":108076,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-11T13:21:49+00:00"}],"members":[{"kind":"issue","number":102589,"title":"cron/lifecycle_guard raw-opens state.db when a command mentions its path, dropping the gateway's POSIX locks -> WAL split-brain","url":null,"state":"closed"},{"kind":"pr","number":102596,"title":"fix(cron): route lifecycle guard script reads through the sqlite live-connection registry","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"902eccae3f","number":0},{"kind":"pr","value":"#102682","number":102682},{"kind":"pr","value":"#108076","number":108076}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":102682,"title":"fix(cron): serialize lifecycle script reads with SQLite locks","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"902eccae3f","number":0},{"kind":"pr","value":"#108076","number":108076}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":108076,"title":"state.db no longer gets a second writer from profile gateways, the dashboard, the lifecycle guard or doctor --fix (#102120 #107688 #102589 #107440; salvage #103489 #102682 #108012 #105428)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["contributors/emails/[redacted:email]","cron/lifecycle_guard.py","gateway/hosted_room_policy_checkpoint.py","gateway/hosted_rooms.py","hermes_cli/doctor_state.py","hermes_cli/web_server_lifecycle.py","hermes_state_holders.py","tests/cron/test_lifecycle_guard_live_db.py","tests/gateway/test_hosted_rooms.py","tests/hermes_cli/test_doctor_wal_holder_guard.py","tests/hermes_cli/test_web_server.py","tests/state/test_fts_holder_instance_scope.py","tests/tui_gateway/test_groups_methods.py","tests/tui_gateway/test_hosted_room_service.py","tui_gateway/hosted_room_service.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}