{"repo":"NousResearch/hermes-agent","public_id":"98022","display_label":"Update receipt and fleet restart loop fixes","summary":"Multiple fixes targeting bugs in the update system where stale or interrupted receipts caused fleet restarts to re-trigger indefinitely, and related issues with catch-up restart logic and receipt lifecycle management.","subsystem":"hermes_cli","counts":{"members":7,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":2,"attempt_prs":4},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":103478},"resolution":{"state":"resolved","by":"pr-104153"},"freshness":{"state":"verified","last_verified_at":"2026-09-06T09:23:34+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.2857142857142857},"fix_edges":[{"issue_number":92535,"pr_number":103478,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":97332,"pr_number":103478,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":98022,"pr_number":103478,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":98022,"pr_number":104153,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":98436,"pr_number":103478,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":103590,"pr_number":104153,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false}],"members":[{"kind":"issue","number":98022,"title":"[Bug]: hermes update catch-up fleet restart (#95294 fix) re-fires on every run when update_receipts/latest.json is a stale interrupted receipt — fleet restarts forever even though it is already current","url":null,"state":"closed"},{"kind":"pr","number":98526,"title":"fix(update): skip catchup fleet restart when interrupted receipt pulled SHA already matches checkout","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#103414","number":103414},{"kind":"pr","value":"#103414","number":103414},{"kind":"pr","value":"#98022","number":98022},{"kind":"pr","value":"#103414","number":103414}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":98689,"title":"fix(update): dismiss stale receipt after catch-up fleet restart","url":null,"state":"closed","close_reason":{"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":103478,"title":"fix(update): fleet check no longer fails with \"no rows\" after stopping unmapped/dashboard-only runtimes; receipts survive the module purge (#97332, #98436, salvage #97350 #92934)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["contributors/emails/[redacted:email]","hermes_cli/update_cmd_fleet.py","hermes_cli/update_cmd_maint.py","tests/hermes_cli/test_update_fleet_check_fail_closed.py","tests/hermes_cli/test_update_fleet_probe_resume_token.py","tests/hermes_cli/test_update_stale_module_purge.py"]},{"kind":"pr","number":103499,"title":"fix(update): stop treating a clean command-boundary stop_reason as an interrupted update","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"f58fcc8118","number":0},{"kind":"commit","value":"f58fcc8118","number":0},{"kind":"pr","value":"#97547","number":97547},{"kind":"pr","value":"#103478","number":103478},{"kind":"pr","value":"#98022","number":98022},{"kind":"pr","value":"#103478","number":103478},{"kind":"pr","value":"#97547","number":97547},{"kind":"pr","value":"#95294","number":95294},{"kind":"pr","value":"#98022","number":98022}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":103677,"title":"fix(update): retire unfinished receipt after fleet restart catch-up","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#95294","number":95294},{"kind":"pr","value":"#98022","number":98022},{"kind":"pr","value":"#100249","number":100249},{"kind":"pr","value":"#103414","number":103414},{"kind":"pr","value":"#98022","number":98022},{"kind":"pr","value":"#97547","number":97547},{"kind":"pr","value":"#103478","number":103478},{"kind":"pr","value":"#100249","number":100249},{"kind":"pr","value":"#100249","number":100249}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":104153,"title":"fix(update): a successful update no longer re-arms the fleet restart forever (#98022, salvage #97547)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/main.py","hermes_cli/update_cmd_fleet.py","hermes_cli/update_receipt.py","tests/hermes_cli/test_update_fleet_restart_pending.py","tests/hermes_cli/test_update_handoff_exit.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}