proactive-audit
Proactive Audit
Overview
Automated health checks for framework artifacts that were modified during the current pipeline. This skill fills the gap between reactive verification (tests, lint) and proactive framework-level validation (wiring, syntax, security patterns).
Core principle: Framework artifact changes require the same rigor as code changes. If a skill was created, verify it is wired. If a hook was modified, verify it compiles. If an agent was changed, verify its tool/skill lists are consistent.
When to Invoke
Invoke this skill as the final pipeline step whenever ANY of the following paths were created, modified, or deleted during the session:
.claude/hooks/**/*.cjs.claude/skills/**/SKILL.md.claude/agents/**/*.md.claude/workflows/**/*.md.claude/schemas/**/*.json.claude/templates/**/*.claude/CLAUDE.md.claude/lib/routing/routing-table.cjs
Invocation:
Skill({ skill: 'proactive-audit' });
Mandatory Skills
| Skill | Purpose | When |
|---|---|---|
task-management-protocol |
Track audit progress | Always |
ripgrep |
Fast targeted artifact search | During checks |
code-semantic-search |
Pattern discovery across artifacts | When investigating |
token-saver-context-compression |
Compress large audit results | When output is large |
verification-before-completion |
Gate completion on zero CRITICAL | Before marking done |
memory-search |
Check prior audit patterns | At start |
Step 1: Detect Changed Artifacts
Use git diff to identify which framework artifacts changed in this session:
# Primary: git diff against recent commits
git diff --name-only HEAD~5 -- .claude/hooks/ .claude/skills/ .claude/agents/ .claude/workflows/ .claude/schemas/ .claude/templates/ .claude/CLAUDE.md .claude/lib/routing/
# Secondary: check unstaged changes
git diff --name-only -- .claude/hooks/ .claude/skills/ .claude/agents/ .claude/workflows/ .claude/schemas/ .claude/templates/
# Tertiary: check untracked files
git ls-files --others --exclude-standard .claude/hooks/ .claude/skills/ .claude/agents/ .claude/workflows/ .claude/schemas/ .claude/templates/
Combine all three lists into a deduplicated set of changed artifact paths.
Step 2: Apply Check Matrix
For each changed artifact, apply the relevant checks from this matrix:
Hook Files (.claude/hooks/**/*.cjs)
| Check ID | Check | Command | Severity |
|---|---|---|---|
| H-01 | Syntax validity | node --check <file> |
CRITICAL |
| H-02 | SE-02: raw JSON.parse without safeParseJSON | grep -n "JSON.parse(" <file> then verify safeParseJSON import |
HIGH |
| H-03 | SE-01: shell injection via shell: true | grep -n "shell:\\s*true" <file> |
HIGH |
| H-04 | Hook registered in settings.json | grep "<hook-filename>" .claude/settings.json |
MEDIUM |
| H-05 | Exit code correctness | Verify try/catch wrapping, exit 0 on non-critical errors | MEDIUM |
H-02 detail: If JSON.parse( is found, check if the file also imports safeParseJSON from .claude/lib/utils/safe-json.cjs. If not, flag as HIGH finding. Exclude test files (*.test.cjs).
Skill Files (.claude/skills/**/SKILL.md)
| Check ID | Check | Command | Severity |
|---|---|---|---|
| S-01 | Skill appears in skill-catalog.md | grep "<skill-name>" .claude/docs/skill-catalog.md |
HIGH |
| S-02 | At least one agent has skill in frontmatter | grep -r "<skill-name>" .claude/agents/ --include="*.md" |
MEDIUM |
| S-03 | Skill appears in CLAUDE.md Section 8.5 | grep "<skill-name>" .claude/CLAUDE.md |
MEDIUM |
| S-04 | SKILL.md has valid frontmatter | Verify name:, description:, version: fields exist |
MEDIUM |
| S-05 | Validate skills (if available) | pnpm validate:skills 2>&1 |
LOW |
Agent Files (.claude/agents/**/*.md)
| Check ID | Check | Command | Severity |
|---|---|---|---|
| A-01 | Agent appears in agent-registry.json | grep "<agent-name>" .claude/context/agent-registry.json |
HIGH |
| A-02 | Agent's skills: list references existing skills | For each skill in frontmatter, verify .claude/skills/<skill>/SKILL.md exists |
MEDIUM |
| A-03 | Agent's tools: list contains only valid tools | Verify each tool name against known tool list | MEDIUM |
| A-04 | Agent appears in CLAUDE.md routing table | grep "<agent-name>" .claude/CLAUDE.md |
MEDIUM |
Workflow Files (.claude/workflows/**/*.md)
| Check ID | Check | Command | Severity |
|---|---|---|---|
| W-01 | Workflow referenced in WORKFLOW_AGENT_MAP.md | grep "<workflow-name>" .claude/docs/@WORKFLOW_AGENT_MAP.md |
MEDIUM |
| W-02 | Referenced agents exist | For each agent name in workflow, verify agent file exists | MEDIUM |
Schema Files (.claude/schemas/**/*.json)
| Check ID | Check | Command | Severity |
|---|---|---|---|
| SC-01 | Valid JSON syntax | node -e "JSON.parse(require('fs').readFileSync('<file>', 'utf8'))" |
CRITICAL |
| SC-02 | Schema appears in schema-catalog.md | grep "<schema-name>" .claude/context/artifacts/catalogs/schema-catalog.md |
MEDIUM |
Root Cleanliness Check
ls -1 | grep -cvE '^(\.|node_modules|src|tests|scripts|dist|build|docs|package\.json|package-lock\.json|pnpm-lock\.yaml|tsconfig|eslint|prettier|jest|vitest|README|LICENSE|CHANGELOG|CLAUDE\.md|\.env)'
FAIL if the count is greater than 0.
Known slop patterns (any of these in project root = FAIL):
*-debug*.txt,*-debug*.log,debug-*.jsondump-*.cjs,dump-*.js,dump-*.jsonrename_*.cjs,revert_*.cjs,update_*.cjstest-out.txt,lint-output.txt,eslint.json,errors.json- UUID-named files (e.g.
a3f2c1b0-*.json) new_session_analysis.mdor any*.analysis.mdnot under.claude/context/- Any
.cjs/.js/.mjsnot referenced inpackage.jsonscripts or tracked project source - Any
.mdnot namedREADME.md,CLAUDE.md,LICENSE, orCHANGELOG.md
Action when FAIL:
- Delete the offending files (or move to
.claude/context/tmp/if content may be needed) - Log deletion to
session-gap-log.jsonlwithtype: "cleanup" - Append a
reflection-spawn-request.jsonentry withtrigger: "ai-slop-found"so the root cause is investigated
Reference: .claude/rules/cleanup-always.md
Documentation Staleness Check
After any feature work, verify:
-
CHANGELOG.md — does it have an entry dated within the last session?
- Check:
git log --oneline -5vsgrep "## \[" CHANGELOG.md | head -3 - FAIL if: feature commits exist but no matching CHANGELOG entry
- Check:
-
.env.example — does it document all env vars in the codebase?
- Check:
grep -r "process.env\." .claude/skills/ .claude/hooks/ | grep -oP "process\.env\.\K\w+" | sort -u - Compare against entries in
.env.example - FAIL if: env var used in code but not documented in
.env.example
- Check:
-
README.md — are agent/skill counts current?
- Check counts in README vs
jq '.agents | length' .claude/context/agent-registry.json - WARN if counts diverge by more than 2
- Check counts in README vs
Routing Files (.claude/lib/routing/routing-table.cjs, .claude/CLAUDE.md)
| Check ID | Check | Command | Severity |
|---|---|---|---|
| R-01 | routing-table.cjs syntax | node --check .claude/lib/routing/routing-table.cjs |
CRITICAL |
| R-02 | Validate skills (full) | pnpm validate:skills 2>&1 |
MEDIUM |
Step 3: Generate Report
Write a structured report to .claude/context/reports/ecosystem-audit/proactive-audit-{ISO-date}.md with this format:
<!-- Agent: qa | Task: #N | Session: YYYY-MM-DD -->
# Proactive Audit Report
**Date:** YYYY-MM-DD
**Artifacts Scanned:** N
**Findings:** N CRITICAL, N HIGH, N MEDIUM, N LOW
**Overall:** PASS | FAIL
## Changed Artifacts
- path/to/artifact1 (type: hook)
- path/to/artifact2 (type: skill)
## Findings
### CRITICAL
| ID | File | Check | Detail | Remediation |
| ---- | ------------- | ------ | ---------------------- | ---------------- |
| H-01 | hooks/foo.cjs | Syntax | SyntaxError at line 42 | Fix syntax error |
### HIGH
| ID | File | Check | Detail | Remediation |
| ---- | ------------- | ----- | ------------------------------------------- | --------------------------------------------------------- |
| H-02 | hooks/bar.cjs | SE-02 | JSON.parse at line 15 without safeParseJSON | Import safeParseJSON from .claude/lib/utils/safe-json.cjs |
### MEDIUM
(same table format)
### PASS
| ID | File | Check | Result |
| ---- | ------------- | ------ | ------ |
| H-01 | hooks/baz.cjs | Syntax | OK |
## Summary
- Total checks run: N
- Passed: N
- Failed: N
- Pass rate: N%
Step 4: Return Verdict
After generating the report:
- If ANY CRITICAL findings exist: return
FAILwith the report path and list of critical findings - If ANY HIGH findings exist: return
WARNwith the report path and list of high findings - If only MEDIUM/LOW findings: return
PASSwith the report path and note about medium findings - If no findings: return
PASSwith the report path
Iron Laws
- ALWAYS run every applicable check from the check matrix — skipping "small" changes is how undetected wiring failures accumulate across sessions.
- NEVER trust task metadata alone for change detection — use
git diffas the primary source of changed artifact paths. - NEVER report PASS without actually executing each check command — self-attested PASS without evidence violates verification-before-completion.
- NEVER ignore SE-02 (prototype pollution) findings in hook files — a single compromised hook can corrupt all subsequent tool calls in the pipeline.
- ALWAYS validate hook syntax with
node --checkbefore reporting findings — broken hooks silently block the entire tool pipeline.
Anti-Patterns
| Anti-Pattern | Why It Fails | Correct Approach |
|---|---|---|
| Skipping checks for "small" changes | Small wiring failures accumulate silently until a pipeline breaks | Run all checks regardless of perceived change size |
| Trusting task metadata for change detection | Metadata can be incomplete or stale; misses unstaged changes | Use git diff --name-only + git ls-files --others as primary source |
| Self-attesting PASS without running commands | Unverified PASS masks real failures; violates verification-before-completion | Execute every check command and capture output as evidence |
| Ignoring SE-02 (prototype pollution) in hooks | One polluted hook corrupts Object.prototype globally across all tool calls |
Flag SE-02 as HIGH severity and block pipeline until fixed |
| Reporting findings without remediation steps | Developers know what broke but not how to fix it | Include specific remediation for every finding with file+line reference |
Severity Guide
| Severity | Meaning | Action Required |
|---|---|---|
| CRITICAL | Framework will break | Fix immediately, block pipeline completion |
| HIGH | Security risk or invisible artifact | Fix before next session, warn user |
| MEDIUM | Missing integration, incomplete wiring | Fix in follow-up task |
| LOW | Best practice violation, cosmetic | Track for future improvement |
Integration with Router Step 0.7
The router invokes this skill via Step 0.7 in the Router Output Contract (CLAUDE.md Section 0.1). The router:
- Detects that framework artifacts were modified during the pipeline
- Spawns a QA agent with this skill as the final pipeline step
- Reads the audit report
- If CRITICAL findings: spawns developer to fix them before claiming completion
- If HIGH findings: warns user and notes findings in pipeline summary
- If PASS: proceeds to claim pipeline completion
Related Skills
verification-before-completion-- General evidence-based completion gateschecklist-generator-- IEEE 1028 quality checklistssharp-edges-- Known hazard patterns (SE-01 through SE-07)
Related References
.claude/context/plans/proactive-audit-design-2026-02-22.md-- Design document.claude/rules/security.md-- SE-01 and SE-02 patterns.claude/rules/artifact-integration.md-- Must-have integration requirements