{"repo":"NousResearch/hermes-agent","public_id":"102405","display_label":"fail_closed hook non-zero exit not blocking","summary":"These issues and PRs concern a bug where fail_closed shell hooks that exit non-zero or crash without producing a directive do not correctly block execution. The work focuses on ensuring fail_closed behaves as expected in those edge cases.","subsystem":null,"counts":{"members":6,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":4},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":131909},"resolution":{"state":"resolved","by":"pr-131909"},"freshness":{"state":"verified","last_verified_at":"2026-10-03T01:18:27+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.3333333333333333},"fix_edges":[{"issue_number":102405,"pr_number":131909,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":102405,"title":"shell hooks: `fail_closed` does not block when the hook exits non-zero with empty stdout","url":null,"state":"closed"},{"kind":"pr","number":102417,"title":"fix(hooks): keep fail-closed gates from permitting crashed hooks","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#131909","number":131909}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":108664,"title":"fix(shell_hooks): fail_closed must also block when the hook crashes silently","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#108664","number":108664},{"kind":"pr","value":"#102417","number":102417},{"kind":"pr","value":"#122576","number":122576},{"kind":"pr","value":"#108664","number":108664}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":122576,"title":"fix(shell_hooks): fail_closed blocks a non-zero exit with no directive","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#102405","number":102405},{"kind":"pr","value":"#131909","number":131909},{"kind":"pr","value":"#102417","number":102417}],"category":"wontfix_bydesign","implication":"wontfix"},"merged":false},{"kind":"pr","number":122651,"title":"fix(agent): fail closed when a fail_closed shell hook exits non-zero without a directive","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#122576","number":122576},{"kind":"pr","value":"#122576","number":122576}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":131909,"title":"fix(hooks): keep fail-closed gates from permitting crashed hooks [risk 0.20]","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/shell_hooks.py","tests/agent/test_shell_hooks.py","website/docs/user-guide/features/hooks.md"]}],"trust":{"default_tier":"verified","includes_suggested":false}}