| name | audit-hooks |
| description | Audit Claude Code hooks for safety and correctness. Use when reviewing hook health, checking hook safety, validating hooks, or after adding/modifying hooks. |
| disable-model-invocation | true |
| allowed-tools | Read, Grep, Glob, Bash |
Hook Audit
Goal: verify that every Claude Code hook registered in .claude/settings.json is safe — advisory hooks can never hang or block a session, validators actually block what they exist to block, and no hook fails silently. Check each hook against the rules in BEST_PRACTICES.md and report PASS/WARN/FAIL per hook. Read-only: findings only, fixes are applied by a human.
Repo Context Probe
If .claude/skill-context/audit-hooks.md exists, read it and honor its declarations; otherwise use the generic defaults described below.
The context file is where a repo declares its validator inventory (hooks that must NOT have || true), its error-logging convention, and its hook log path. Generic defaults: validators are identified by a validate_* script name on PreToolUse/PostToolUse with a matcher; the error log is logs/hooks.log; the logging helper is log_hook_error() if the repo has one.
Audit Procedure
Step 1: Parse settings.json
Read .claude/settings.json and extract every hook entry. For each hook, record:
- Event type (UserPromptSubmit, PreToolUse, PostToolUse, Stop)
- Matcher (empty string = all, or specific tool name)
- Command string
- Timeout value
- Whether
|| true is present
Step 2: Classify hooks
| Classification | Criteria | || true required? |
|---------------|----------|-------------------|
| Validator | PreToolUse/PostToolUse + matcher + named validate_*.py | NO — must NOT have || true |
| Advisory | Any hook whose purpose is logging/tracking/enrichment | YES — must have || true |
| Stop | Any hook on Stop events | YES — must have || true |
Step 3: Check each hook against rules
For EACH hook command, check:
Settings-level checks:
Python script checks (for hooks targeting .py files):
Bash script checks (for hooks targeting .sh files):
Step 4: Deployment readiness
Step 5: Check the hook log
If the hook log (default logs/hooks.log) exists, scan for recent errors (last 24h). Report:
- Total error count
- Unique hook names that errored
- Most frequent error message
Report Format
Output findings as a structured table:
## Hook Audit Report
### Summary
- Total hooks: N
- PASS: N | WARN: N | FAIL: N
### Findings
| Hook | Event | Type | Finding | Severity |
|------|-------|------|---------|----------|
| stop.py | Stop | Advisory | Has || true, has log_hook_error() | PASS |
| validate_commit_message.py | PreToolUse | Validator | No || true (correct) | PASS |
| calendar_prompt_hook.sh | UserPromptSubmit | Advisory | Missing || true | FAIL |
### Recommendations
[List specific fixes for FAIL and WARN items]
Severity Levels
- FAIL: Rule violation that can cause session hangs, silent failures, or security issues
- WARN: Suboptimal pattern that should be improved but is not immediately dangerous
- PASS: Hook follows all applicable best practices