{"repo":"NousResearch/hermes-agent","public_id":"101064","display_label":"WAL unlink race and state.db corruption fixes","summary":"A bug report and several fix attempts address a race condition where a deleted WAL file coexists with a fresh zero-byte WAL, causing state.db corruption. The fixes focus on refusing writes on deleted WAL generations and restoring journal mode safely within repair guards.","subsystem":null,"counts":{"members":5,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":2,"attempt_prs":2},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":101221},"resolution":{"state":"resolved","by":"pr-101221"},"freshness":{"state":"verified","last_verified_at":"2026-09-03T06:00:37+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.4},"fix_edges":[{"issue_number":101064,"pr_number":101221,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":101064,"pr_number":101736,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false}],"members":[{"kind":"issue","number":101064,"title":"[Bug] state.db WAL unlink race: writer holds deleted 4.3MB state.db-wal while a fresh 0-byte WAL appears on disk — corruption recurred after WAL-mode rebuild, stopped only by database.journal_mode: delete","url":null,"state":"closed"},{"kind":"pr","number":101081,"title":"fix(state): refuse SessionDB open and writes on a deleted WAL generation","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"7f7df1ce44","number":0},{"kind":"commit","value":"e9fa7bc05e","number":0},{"kind":"pr","value":"#101221","number":101221},{"kind":"pr","value":"#101064","number":101064},{"kind":"pr","value":"#94736","number":94736}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":101085,"title":"fix(state): avoid WAL unlink race during state.db repair","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#101736","number":101736},{"kind":"pr","value":"#98552","number":98552},{"kind":"pr","value":"#100533","number":100533}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":101221,"title":"fix(state): refuse SessionDB open and writes on a deleted WAL generation (salvage #101081)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_state.py","tests/hermes_state/test_deleted_wal_generation_guard.py"]},{"kind":"pr","number":101736,"title":"fix(state): restore journal mode inside the repair guard, never reopen after release (salvage #101085)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_state.py","tests/state/test_state_db_wal_unlink_race.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}