audit — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited audit (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
plan: Audit a plan file before implementationcode: Audit recent uncommitted changes (default)full: Full codebase scan$PLANS_DIR value, never relative paths.You are the audit coordinator. You dispatch security, performance, and QA scans, then synthesize results into actionable reports. You do NOT fix issues yourself — you identify and report them with severity ratings.
Resolve devkit paths (MUST be first action in Step 1):
Tool: Bash
# --- Devkit Path Resolution ---
DEVKIT_SCRIPTS="${CLAUDE_DEVKIT:-$HOME/.claude-devkit}/scripts"
# Source path resolution helper
if [ -f "$DEVKIT_SCRIPTS/resolve-project-dir.sh" ]; then
. "$DEVKIT_SCRIPTS/resolve-project-dir.sh"
DEVKIT_PROJECT_DIR_RESOLVED=$(resolve_devkit_project_dir) || {
echo "Failed to resolve project directory" >&2; exit 1
}
elif [ -n "${DEVKIT_PROJECT_DIR:-}" ]; then
DEVKIT_PROJECT_DIR_RESOLVED="$DEVKIT_PROJECT_DIR"
else
echo "WARNING: devkit is not installed. Using deprecated .devkit/ fallback." >&2
DEVKIT_PROJECT_DIR_RESOLVED=".devkit"
fi
PLANS_DIR="$DEVKIT_PROJECT_DIR_RESOLVED/plans"
mkdir -p "$PLANS_DIR"
echo "Plans directory: $PLANS_DIR"Tool: Bash (direct — coordinator does this)
Run: git status --porcelain
Scope resolution:
$ARGUMENTS is empty:$ARGUMENTSValidate scope is one of: plan, code, full. If not, stop with: "Invalid scope. Use: /audit [plan|code|full]"
Derive timestamp: [timestamp] = current ISO datetime (e.g., 2026-02-07T12-30-00)
Initialize audit logging:
Tool: Bash
# --- Audit Logging Setup ---
RUN_ID=$(date +%Y%m%d-%H%M%S)-$(cat /dev/urandom | LC_ALL=C tr -dc 'a-z0-9' | head -c 6)
AUDIT_LOG_DIR="$PLANS_DIR/audit-logs"
mkdir -p "$AUDIT_LOG_DIR"
AUDIT_LOG="$AUDIT_LOG_DIR/audit-${RUN_ID}.jsonl"
STATE_FILE=".audit-audit-state-${RUN_ID}.json"
python3 -c "
import json
state = {
'run_id': '${RUN_ID}',
'audit_log': '${AUDIT_LOG}',
'skill': 'audit',
'skill_version': '3.3.0',
'security_maturity': 'advisory',
'hmac_key': ''
}
with open('${STATE_FILE}', 'w') as f:
json.dump(state, f)
print('Audit skill state file created: ${STATE_FILE}')
"
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" "$STATE_FILE" \
"{\"event_type\":\"run_start\",\"scope\":\"${AUDIT_SCOPE:-unknown}\"}"
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" "$STATE_FILE" \
'{"event_type":"step_start","step":"step_1_determine_scope","step_name":"Determine scope","agent_type":"coordinator"}'
echo "Audit skill log: $AUDIT_LOG"Emit step_end for Step 1:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_end","step":"step_1_determine_scope","step_name":"Determine scope","agent_type":"coordinator"}'Emit step_start for Step 2:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_start","step":"step_2_security_scan","step_name":"Security scan","agent_type":"coordinator"}'Secure-review composability check:
Tool: Glob
Glob for ~/.claude/skills/secure-review/SKILL.md
If found AND scope is NOT "plan":
/secure-review instead of the built-in security scan.Tool: Task, subagent_type=general-purpose, model=claude-opus-4-6
Prompt: "You are running a deep security review as part of the /audit workflow.
Read the secure-review skill definition at ~/.claude/skills/secure-review/SKILL.md. Execute its full scanning workflow (vulnerability, data flow, auth/authz scans).
Scope: [map audit scope to secure-review scope: 'code' -> 'changes', 'full' -> 'full']
Write your findings to $PLANS_DIR/audit-[timestamp].security.md (use the audit naming convention, not the secure-review convention, so the synthesis step can find it).
Include the standard secure-review output: verdict, severity-rated findings, redacted secrets.
CRITICAL: Never include actual secret values. Redact to first 4 / last 4 characters."
Skip the existing built-in security scan below. Proceed to Step 3 (Performance scan).
If not found OR scope is "plan":
Pre-check: Glob for .claude/agents/security-analyst*.md
Tool: Glob (direct — coordinator does this)
Pattern: .claude/agents/security-analyst*.md
If found: "Using project-specific security-analyst for security scan" If not found: "No project-specific security-analyst found. Using generic Task subagent for security scan. For project-tailored scanning, generate one: gen-agent . --type security-analyst"
Tool: Task, subagent_type=general-purpose, model=claude-opus-4-6
If scope is "plan":
.claude/agents/security-analyst*.md for your role context and scanning frameworks (STRIDE, OWASP Top 10, DREAD, compliance checklists). Then read the plan file at $ARGUMENTS (after 'plan' keyword). Analyze for security risks:Rate findings: Critical / High / Medium / Low. Write to $PLANS_DIR/audit-[timestamp].security.md"
$ARGUMENTS (after 'plan' keyword). Analyze for security risks:Rate findings: Critical / High / Medium / Low. Write to $PLANS_DIR/audit-[timestamp].security.md"
If scope is "code":
.claude/agents/security-analyst*.md for your role context and scanning frameworks (STRIDE, OWASP Top 10, DREAD, compliance checklists). Then scan uncommitted changes for:Rate findings: Critical / High / Medium / Low. Write to $PLANS_DIR/audit-[timestamp].security.md"
Rate findings: Critical / High / Medium / Low. Write to $PLANS_DIR/audit-[timestamp].security.md"
If scope is "full":
.claude/agents/security-analyst*.md for your role context and scanning frameworks (STRIDE, OWASP Top 10, DREAD, compliance checklists). Then perform a full codebase security audit:Rate findings: Critical / High / Medium / Low. Write to $PLANS_DIR/audit-[timestamp].security.md"
Rate findings: Critical / High / Medium / Low. Write to $PLANS_DIR/audit-[timestamp].security.md"
Emit step_end for Step 2:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_end","step":"step_2_security_scan","step_name":"Security scan","agent_type":"coordinator"}'Emit step_start for Step 3:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_start","step":"step_3_performance_scan","step_name":"Performance scan","agent_type":"coordinator"}'Tool: Task, subagent_type=general-purpose, model=claude-sonnet-4-6
If scope is "plan": Prompt: "Read the plan file at $ARGUMENTS (after 'plan' keyword). Analyze for performance risks:
Rate findings: Critical / High / Medium / Low. Write to $PLANS_DIR/audit-[timestamp].performance.md"
If scope is "code": Prompt: "Analyze uncommitted changes for:
Rate findings: Critical / High / Medium / Low. Write to $PLANS_DIR/audit-[timestamp].performance.md"
If scope is "full": Prompt: "Full codebase performance audit:
Rate findings: Critical / High / Medium / Low. Write to $PLANS_DIR/audit-[timestamp].performance.md"
Emit step_end for Step 3:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_end","step":"step_3_performance_scan","step_name":"Performance scan","agent_type":"coordinator"}'Trigger: Only run if scope is "code" or "full" (skip for "plan"). Plan scope is skipped because six of seven anti-pattern categories (code smells, dead code, duplicated logic, naming violations, error handling, testing) are code-level concerns that cannot be detected in a plan document. This matches the QA regression step, which also skips plan scope.
Emit step_start for Step 4:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_start","step":"step_4_antipattern_scan","step_name":"Anti-pattern scan","agent_type":"coordinator"}'If scope is "plan":
If scope is "code":
Tool: Task, subagent_type=general-purpose, model=claude-sonnet-4-6
Prompt: "Analyze uncommitted changes for code anti-patterns across these categories:
Do not flag error handling or architectural issues that are primarily security vulnerabilities (those belong in the security scan).
Rate findings: Critical / High / Medium / Low.
Write to $PLANS_DIR/audit-[timestamp].antipatterns.md"
If scope is "full":
Tool: Task, subagent_type=general-purpose, model=claude-sonnet-4-6
Prompt: "Full codebase anti-pattern audit across these categories:
Do not flag error handling or architectural issues that are primarily security vulnerabilities (those belong in the security scan).
Rate findings: Critical / High / Medium / Low.
Write to $PLANS_DIR/audit-[timestamp].antipatterns.md"
Emit step_end for Step 4:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_end","step":"step_4_antipattern_scan","step_name":"Anti-pattern scan","agent_type":"coordinator"}'Trigger: Only run if scope is "code" or "full" (skip for "plan")
Emit step_start for Step 5:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_start","step":"step_5_qa_regression","step_name":"QA regression","agent_type":"coordinator"}'Pre-check: Verify qa-engineer agent exists
Tool: Glob (direct — coordinator does this)
Pattern: .claude/agents/qa-engineer*.md or .claude/agents/qa*.md
If no files match:
$PLANS_DIR/audit-[timestamp].qa.md: # QA Regression — Skipped
**Status:** QA agent not found
No qa-engineer agent found in `.claude/agents/`. Skipping regression tests.
To enable QA regression tests, generate a QA agent:python3 ~/workspaces/claude-devkit/generators/generate_agents.py . --type qa-engineer
If QA agent exists:
Tool: Task, subagent_type=general-purpose, model=claude-sonnet-4-6
Prompt: "You are running QA regression validation. Read the .claude/agents/ directory to find the qa-engineer agent. Follow that agent's testing standards.
Run the full test suite and analyze results.
Write $PLANS_DIR/audit-[timestamp].qa.md with:
If no test command is found or tests cannot run, document this limitation."
Emit step_end for Step 5:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_end","step":"step_5_qa_regression","step_name":"QA regression","agent_type":"coordinator"}'Emit step_start for Step 6:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_start","step":"step_6_synthesis","step_name":"Synthesis","agent_type":"coordinator"}'Tool: Read (direct — coordinator does this)
Read all audit reports:
$PLANS_DIR/audit-[timestamp].security.md$PLANS_DIR/audit-[timestamp].performance.md$PLANS_DIR/audit-[timestamp].antipatterns.md (if exists — not produced for plan scope)$PLANS_DIR/audit-[timestamp].qa.md (if exists)Generate $PLANS_DIR/audit-[timestamp].summary.md with this structure:
# Audit Summary — [scope] — [timestamp]
## Verdict
[PASS / PASS_WITH_NOTES / BLOCKED]
## Critical Findings
[Count: N]
- [Finding 1 from any report]
- [Finding 2 from any report]
## High Findings
[Count: N]
- [Finding 1 from any report]
- [Finding 2 from any report]
## Medium Findings
[Count: N]
(Summarize or list)
## Low Findings
[Count: N]
(Summarize or list)
## Risk Score
[1-10 scale]
- 1-3: Low risk (PASS)
- 4-6: Medium risk (PASS_WITH_NOTES)
- 7-10: High risk (BLOCKED)
## Action Items
(Prioritized list of what must be fixed)
1. [Critical item 1]
2. [Critical item 2]
3. [High item 1]
...
## Reports
- Security: $PLANS_DIR/audit-[timestamp].security.md
- Performance: $PLANS_DIR/audit-[timestamp].performance.md
- Anti-patterns: $PLANS_DIR/audit-[timestamp].antipatterns.md (if run)
- QA: $PLANS_DIR/audit-[timestamp].qa.md (if run)Verdict rules:
Emit step_end for Step 6:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_end","step":"step_6_synthesis","step_name":"Synthesis","agent_type":"coordinator"}'Emit step_start for Step 7:
Tool: Bash
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_start","step":"step_7_gate","step_name":"Gate","agent_type":"coordinator"}'Read $PLANS_DIR/audit-[timestamp].summary.md and check verdict.
If BLOCKED: Output: "🚫 Audit BLOCKED — Critical security or performance issues found.
Summary: $PLANS_DIR/audit-[timestamp].summary.md Action items must be resolved before proceeding.
Critical findings: [count] High findings: [count]"
If PASS_WITH_NOTES: Output: "⚠️ Audit PASS with notes — Review recommended but not blocking.
Summary: $PLANS_DIR/audit-[timestamp].summary.md Consider addressing high-priority findings.
High findings: [count] Medium findings: [count]"
If PASS: Output: "✅ Audit PASS — No blocking issues found.
Summary: $PLANS_DIR/audit-[timestamp].summary.md Only minor findings to consider.
Medium findings: [count] Low findings: [count]"
Emit verdict, run_end, and step_end for Step 7:
Tool: Bash
# AUDIT_FINAL_VERDICT: "PASS", "PASS_WITH_NOTES", or "BLOCKED"
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
"{\"event_type\":\"verdict\",\"step\":\"step_7_gate\",\"verdict\":\"${AUDIT_FINAL_VERDICT:-PASS}\",\"verdict_source\":\"synthesis\",\"agent_type\":\"coordinator\"}"
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
"{\"event_type\":\"run_end\",\"outcome\":\"${AUDIT_FINAL_VERDICT:-PASS}\",\"scope\":\"${AUDIT_SCOPE:-unknown}\"}"
bash "$DEVKIT_SCRIPTS/emit-audit-event.sh" ".audit-audit-state-${RUN_ID}.json" \
'{"event_type":"step_end","step":"step_7_gate","step_name":"Gate","agent_type":"coordinator"}'
# Clean up state file
rm -f ".audit-audit-state-${RUN_ID}.json"
echo "Audit skill log complete: $PLANS_DIR/audit-logs/audit-${RUN_ID}.jsonl"~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.