Oppgave A measured (fasit-first, CC 2.1.220): /doctor overlaps our judgment lenses and alarms, not the deterministic validators. Binding outcome: 0 whole scanners removed, 2 measured function-duplicates scheduled for removal (GAP autoMode dimension, CA-SKL-002 alarm role), 5 surfaces repositioned. Plan rewritten with D-chunks + B2-B4 merged against the existing C-chunks and open dogfood posts; old rejection #5 (prose contradiction detection) superseded by B3 with evidence. README gains the division-of-labor section vs /doctor; CLAUDE.md gains the never-duplicate-a-doctor-check invariant. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019NeaMRXVGzh9oSwigJDjE9
7.3 KiB
Config-Audit Plugin
Claude Code Configuration Intelligence — know if your config is correct, find what could improve it, fix it automatically. Three pillars: Health (deterministic scanners), Opportunities (context-aware recommendations), Action (auto-fix with backup/rollback).
Per-command flags, patterns, and feature lists live in README.md and /config-audit help. This file carries what's invariant for working on the plugin.
Positioning vs. built-in /doctor (measured 2026-08-03, binding): we are the deterministic/reproducible/all-scope/zero-quota side; /doctor is usage-weighted one-shot judgment. Never build a feature whose whole value is duplicating a /doctor check — see README «config-audit vs. the built-in /doctor» and docs/v5.13-model-routing-effort-deadref-plan.md §A.
Commands
Core (just run /config-audit to get started)
| Command | Description |
|---|---|
/config-audit |
Full audit with auto-scope detection |
/config-audit posture |
A-F health scorecard (10 quality areas) |
/config-audit tokens |
Prompt-cache-aware token hotspots, each tagged with its load pattern; cache-aware |
/config-audit manifest |
Ranked table of every token source + always-loaded subtotal |
/config-audit feature-gap |
Context-aware feature recommendations grouped by impact |
/config-audit optimize |
Mechanism-fit lens (procedure→skill, lifecycle→hook, path→rule, never→permission). Agent-driven, not byte-stable. --subtract adds the subtraction axis (what no longer earns its always-loaded rent, BP-SUB-001) — opt-in, proposes only |
/config-audit fix |
Auto-fix deterministic issues with backup + verification |
/config-audit rollback |
Restore configuration from backup |
/config-audit plan |
Create action plan from findings |
/config-audit implement |
Execute plan with backups + auto-verify |
/config-audit help |
Show all commands |
Additional
| Command | Description |
|---|---|
/config-audit drift |
Compare current config against saved baseline |
/config-audit plugin-health |
Audit plugin structure, frontmatter, cross-plugin coherence |
/config-audit whats-active |
Read-only inventory of active plugins/skills/MCP/hooks/CLAUDE.md (with token estimates) |
/config-audit knowledge-refresh |
Refresh the best-practices register (stale check + web poll). Human-approved writes; not byte-stable |
/config-audit campaign |
Machine-wide audit ledger + token bill across repos. Human-approved writes; not byte-stable |
/config-audit discover |
Run discovery phase only |
/config-audit analyze |
Run analysis phase only |
/config-audit interview |
Gather user preferences (opt-in) |
/config-audit status |
Show current session state |
/config-audit cleanup |
Clean up old sessions |
Agents
| Agent | Role | Model | Color | Tools |
|---|---|---|---|---|
| scanner-agent | Find config files | sonnet | cyan | Read, Glob, Grep, Write |
| analyzer-agent | Generate report | sonnet | blue | Read, Glob, Grep, Write |
| planner-agent | Create action plan | opus | yellow | Read, Glob, Write |
| implementer-agent | Execute changes | sonnet | magenta | Read, Write, Edit, Bash, Glob |
| verifier-agent | Verify results | sonnet | purple | Read, Glob, Grep |
| feature-gap-agent | Feature recommendations | opus | green | Read, Glob, Grep, Write |
| optimization-lens-agent | Mechanism-fit precision gate | opus | orange | Read, Glob, Grep, Write |
Hooks
| Event | Script | Purpose |
|---|---|---|
| PreToolUse | auto-backup-config.mjs |
Backup config files before Edit/Write |
| PostToolUse | post-edit-verify.mjs |
Verify after Edit/Write, block on new critical/high |
| SessionStart | session-start.mjs |
Check for active (unfinished) sessions |
| Stop | stop-session-reminder.mjs |
Remind about current session phase |
Reference docs (read on demand)
docs/scanner-internals.md— scanner inventory, lib modules, action engines, knowledge base, per-scanner/per-block implementation notes (design rationale, primary-source verification, byte-stability lessons)docs/humanizer.md— plain-language output (v5.1.0), humanizer vocabularies, output modes
Plain-Language Output (v5.1.0)
Default output of all commands routes through humanizeEnvelope (lib/humanizer.mjs), decorating each finding with userImpactCategory, userActionLanguage, and relevanceContext. --raw and --json bypass the humanizer for byte-stable v5.0.0 output. Full detail: docs/humanizer.md.
Suppressions
Create .config-audit-ignore at project root — one exact ID or glob per line (CA-SET-003, CA-GAP-*). Suppressed findings are tracked in the envelope's suppressed_findings for audit trail. Disable with --no-suppress.
Architecture
Workflow: /config-audit → discover + analyze (auto) → plan → implement → verify. Auto-detects scope from git context; override with full|repo|home|current; --delta for incremental. Session state lives under ~/.claude/config-audit/sessions/{id}/ (scope.yaml, discovery.json, state.yaml, findings/, analysis-report.md, action-plan.md, backups/, implementation-log.md).
Finding ID format: CA-{SCANNER}-{NNN} — e.g. CA-CML-001, CA-SET-003, CA-HKV-002, CA-RUL-005, CA-TOK-005, CA-CPS-001, CA-SKL-001, CA-OST-001, CA-OPT-001, CA-AGT-001.
Conventions
Enforced conventions live in .claude/rules/ (auto-loaded as project instructions):
ux-rules.md— output/narration/formatting for all commands (never dump raw JSON, narrate before each step, space-separated command suggestions)command-development.md— required command frontmatter +plugin:actionnamingagent-development.md— agent frontmatter + "when to use" conventionsstate-management.md— updatestate.yamlafter every workflow phase
Coding style: scanners are zero-dependency Node ESM; new findings use the CA-{SCANNER}-{NNN} ID format; byte-stable CLIs are verified against frozen tests/snapshots/v5.0.0/ baselines.
Subtraction floor (invariant). optimize --subtract is the only lens that proposes removing config, so scanners/lib/floor-exclusion.mjs runs as a deterministic pre-step before the judge — a load-bearing block is never a candidate, and that guarantee must not be moved into the agent prompt. Two rules follow from it: (1) staleness is not a deletion signal — an outdated version pin inside a floor block is a drift/CA-CML dead-reference concern; (2) tier 2 ≠ tier 3 — a compensatory block that keeps earning its place returns, and reporting it as dead weight is wrong even when the label matches. Norwegian keywords need the Unicode boundaries in subtraction-prefilter.mjs; JS \b is ASCII-only, so /\bunngå\b/ silently never matches.
Testing
node --test 'tests/**/*.test.mjs'
Test fixtures in tests/fixtures/. Per-scanner and per-build-block implementation notes (design rationale, primary-source verification, byte-stability lessons) live in docs/scanner-internals.md → Implementation notes.
Gotchas
- Session directories accumulate — use
/config-audit cleanupto manage - Scanners run on Node.js ≥ 18 (uses node:test, node:fs/promises)
- Plugin CLAUDE.md files in node_modules should be excluded via scope