{"repo":"NousResearch/hermes-agent","public_id":"106393","display_label":"Infinite FTS deferral blocked by permanent holders","summary":"These issues and fixes address a bug where stale full-text-search repair defers indefinitely when the blocking database holder is a permanent or supervised process. Work covers detection, diagnosis, holder identification, and retry logic to break the deadlock.","subsystem":null,"counts":{"members":6,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":2,"attempt_prs":3},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":106591},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-09-11T13:37:28+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.3333333333333333},"fix_edges":[{"issue_number":56815,"pr_number":108130,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":88587,"pr_number":108130,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":96591,"pr_number":108130,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":97794,"pr_number":108130,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":103647,"pr_number":108130,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":103840,"pr_number":108130,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":106393,"pr_number":106591,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":106393,"pr_number":108130,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":106667,"pr_number":108130,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false}],"members":[{"kind":"issue","number":106393,"title":"[Bug]: stale-FTS repair defers forever when the blocking holder is a supervised service — every message write fails behind it","url":null,"state":"closed"},{"kind":"pr","number":106410,"title":"fix(state): diagnose futile FTS deferral from a stable holder set","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"060cd7f9bb","number":0},{"kind":"pr","value":"#106591","number":106591},{"kind":"pr","value":"#106393","number":106393}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":106559,"title":"fix(state): give the stale-FTS deferral an exit when the holder is permanent","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#106393","number":106393},{"kind":"pr","value":"#106591","number":106591}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":106591,"title":"fix(state): futile stale-FTS deferral by a resident peer names the holder, fixes the remedy, and retries once it leaves (#106393, salvage #106410)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/doctor_state.py","hermes_state_schema.py","tests/state/test_fts_runtime_rebuild.py"]},{"kind":"pr","number":107981,"title":"fix(state): a permanent state.db holder no longer blocks the FTS rebuild forever (#106393, salvage #106559)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"060cd7f9bb5","number":0},{"kind":"commit","value":"afff63ced7","number":0},{"kind":"pr","value":"#108130","number":108130}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":108130,"title":"state.db FTS damage no longer kills turns; doctor/repair/recover handle real incident shapes (#97794, #88587, #100227, #103840, #106667, #102240, #98050, #103647, #96591, #105887; salvage #97843 #88604 #56824 #91413 #102808 #103657 #106890 #103321)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/turn_explainers.py","contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","gateway/run_notifications.py","hermes_cli/console_engine.py","hermes_cli/doctor_state.py","hermes_cli/session_lost_and_found.py","hermes_cli/session_recovery.py","hermes_cli/sessions_cmd.py","hermes_cli/web_routers/_common.py","hermes_cli/web_routers/analytics.py","hermes_cli/web_server_sessions.py","hermes_constants.py","hermes_state_errors.py","hermes_state_fts.py","hermes_state_repair.py","hermes_state_schema.py","hermes_state_search.py","tests/hermes_cli/test_doctor_structural_corruption.py","tests/hermes_cli/test_session_recovery.py","tests/hermes_cli/test_session_recovery_lost_and_found.py","tests/hermes_cli/test_sessions_repair_check_only_exit.py","tests/hermes_cli/test_web_analytics_corrupt_store.py","tests/hermes_state/test_state_db_corrupt_quarantine.py","tests/run_agent/test_corruption_recovery_guidance.py","tests/run_agent/test_turn_completion_explainer.py","tests/state/test_fts_index_fail_open.py","tests/state/test_fts_orphan_shadow_repair.py","tests/test_fts_cjk_bigram.py","tests/test_state_db_fts_segment_collision_probe.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}