{"repo":"NousResearch/hermes-agent","public_id":"104865","display_label":"Serialize and harden concurrent plugin hook callbacks","summary":"These items address how overlapping plugin hook callback invocations are handled, shifting from dropping concurrent calls to serializing them. Related policy work covers failure modes, precedence rules, and async dispatch behavior for hook guards.","subsystem":"hermes_cli","counts":{"members":3,"open_issues":1,"open_issues_distinct":1,"open_prs":0,"closed_issues":0,"merged_prs":1,"attempt_prs":1},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":118844,"merged_at":"2026-09-22T06:47:52+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-09-22T06:47:52+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":87420,"pr_number":118844,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-22T06:47:52+00:00"},{"issue_number":92553,"pr_number":118844,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-22T06:47:52+00:00"},{"issue_number":104865,"pr_number":118844,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-09-22T06:47:52+00:00"},{"issue_number":105223,"pr_number":118844,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-22T06:47:52+00:00"},{"issue_number":105827,"pr_number":118844,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-22T06:47:52+00:00"},{"issue_number":109624,"pr_number":118844,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-22T06:47:52+00:00"},{"issue_number":110241,"pr_number":118844,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-09-22T06:47:52+00:00"}],"members":[{"kind":"issue","number":104865,"title":"Serialize concurrent hook callbacks instead of dropping overlap","url":null,"state":"open"},{"kind":"pr","number":104763,"title":"fix(plugins): serialize overlapping hook callback fires instead of dropping","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"75e9567ca7","number":0},{"kind":"pr","value":"#118844","number":118844}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":118844,"title":"Plugin hook policy: hung or raising guards fail closed without wedging, block outranks approve, shell approve reaches the gate, async pre_gateway_dispatch awaited (#105223 #109624 #87420 #92553 #105827 #110241)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/shell_hooks.py","gateway/run_inbound.py","hermes_cli/lifecycle.py","hermes_cli/middleware.py","hermes_cli/plugins.py","hermes_cli/plugins_dispatch.py","tests/agent/test_shell_hooks.py","tests/gateway/test_bot_loop_guard.py","tests/gateway/test_pre_gateway_dispatch.py","tests/hermes_cli/test_plugins.py","website/docs/user-guide/features/hooks.md"]}],"trust":{"default_tier":"verified","includes_suggested":false}}