deep-audit
Deep consistency audit of the entire repository infrastructure. Launches 4 parallel specialist agents to find factual errors, code bugs, count mismatches, and cross-document inconsistencies. Then fixe
SKILL.md.claude/skills/deep-audit/SKILL.md
GitHub/deep-audit — Repository Infrastructure Audit
Run a comprehensive consistency audit across the entire repository, fix all issues found, and loop until clean.
When to Use
- After broad changes (new skills, rules, hooks, scripts, AGENTS.md edits)
- Before releases or major commits
- When the user asks to "find inconsistencies", "audit", or "check everything"
Workflow
PHASE 1: Launch 4 Parallel Audit Agents
Launch these 4 agents simultaneously using Agent with subagent_type=general-purpose:
Agent 1: Canonical Docs Accuracy
Focus: AGENTS.md (the single canonical description) and README.md (short external intro)
- All numeric claims match reality (skill count, agent count, rule count, hook count, script count)
- All file paths mentioned actually exist on disk
- All skill/agent/rule/script names match actual directory and file names
- Code examples and commands are correct (
scripts/deckpath.py,scripts/deckprofile.py,scripts/new_deck.pyflags exist) - Cross-references resolve
- No stale counts, and no mentions of layers that git history shows as removed
Agent 2: Hook Code Quality
Focus: .claude/hooks/*.py and .claude/hooks/*.sh
- No remaining
/tmp/usage (should use~/.claude/sessions/) - Hash length consistency (
[:8]across all hooks) - Proper error handling (fail-open pattern: top-level
try/exceptwithsys.exit(0)) - JSON input/output correctness (stdin for input, stdout/stderr for output)
- Exit code correctness (0 for non-blocking, non-zero only when intentionally blocking)
from __future__ import annotationsfor Python 3.8+ compatibility- Correct field names from hook input schema (
sourcenottypefor SessionStart) - PreCompact hooks print to stderr (stdout is ignored)
Agent 3: Skills, Agents, and Rules Consistency
Focus: .claude/skills/*/SKILL.md, .claude/agents/*.md, .claude/rules/*.md, .claude/rules/slide-profiles/*.yml
- Valid YAML frontmatter in all files
- No stale
disable-model-invocation: true allowed-toolsvalues are sensible- Rule
paths:reference existing directories - No contradictions between rules, or between a rule and the profile numbers the gate enforces
- AGENTS.md skills and agents tables match actual directories 1:1
- Every agent a skill launches exists in
.claude/agents/ - All templates referenced in rules/skills exist in
templates/
Agent 4: Scripts and Cross-Document Consistency
Focus: scripts/, README.md, AGENTS.md, MEMORY.md
- Every script a skill, rule, or doc invokes exists, and its documented flags match its
--help - Feature counts and the directory tree agree between
README.mdandAGENTS.md - All links point to valid targets
- License section matches LICENSE file
MEMORY.mdentries do not point at deleted files- Test scripts still pass:
python3 scripts/test_profiles.py,python3 scripts/test_minyaml.py,python3 scripts/test_media.py,python3 scripts/test_series.py,bash scripts/test_note_filter.sh,bash scripts/test_korean_gate.sh
PHASE 2: Triage Findings
Categorize each finding:
- Genuine bug: Fix immediately
- False alarm: Discard (document WHY it's false for future rounds)
Common false alarms to watch for:
- Quarto callout
## Titleinside:::divs — this is standard syntax, NOT a heading bug allowed-toolslinter warning — known linter bug (Claude Code issue #25380), field IS valid- Counts in old session logs — these are historical records, not user-facing docs
PHASE 3: Fix All Issues
Apply fixes in parallel where possible. For each fix:
- Read the file first (required by Edit tool)
- Apply the fix
- Verify the fix (grep for stale values, check syntax)
PHASE 4: Loop or Declare Clean
After fixing, launch a fresh set of 4 agents to verify.
- If new issues found → fix and loop again
- If zero genuine issues → declare clean and report summary
Max loops: 5 (to prevent infinite cycling)
Key Lessons from Past Audits
These are real bugs found across 7 rounds — check for these specifically:
| Bug Pattern | Where to Check | What Went Wrong |
|---|---|---|
| Stale counts ("19 skills" → "21") | AGENTS.md, README | Added skills but didn't update all mentions |
| Hook exit codes | All Python hooks | Exit 2 in PreCompact silently discards stdout |
| Hook field names | post-compact-restore.py | SessionStart uses source, not type |
| State in /tmp/ | All Python hooks | Should use ~/.claude/sessions/<hash>/ |
| Hash length mismatch | All Python hooks | Some used [:12], others [:8] |
| Missing fail-open | Python hooks __main__ |
Unhandled exception → exit 1 → confusing behavior |
| Python 3.10+ syntax | Type hints like `dict | None` |
| Missing directories | paths named in rules and skills | A destination path was documented but nothing ever created it |
| macOS-only commands | Skills, rules | open without xdg-open fallback |
| Protected file blocking | settings.json edits | protect-files.sh blocks Edit/Write |
Output Format
After each round, report:
## Round N Audit Results
### Issues Found: X genuine, Y false alarms
| # | Severity | File | Issue | Status |
|---|----------|------|-------|--------|
| 1 | Critical | file.py:42 | Description | Fixed |
| 2 | Medium | file.qmd:100 | Description | Fixed |
### Verification
- [ ] No stale counts (grep confirms)
- [ ] All hooks have fail-open + future annotations
- [ ] Test scripts pass
### Result: [CLEAN | N issues remaining]