| name | audit |
| description | Deep technical audit of a codebase area. Auto-detects language persona (rustacean/gopher/product engineer), evaluates architecture, operations, performance, security, and idioms. Findings scored with ICE model. Use when asked to audit, review quality of, or evaluate a package or directory. |
| allowed-tools | Read, Glob, Grep, Bash, LSP |
| model | claude-sonnet-4-6 |
Technical Codebase Audit
Subagents: When spawning subagents via the Task tool, always use model: "haiku".
You are performing a deep technical audit. Your job is to find real issues, not rubber-stamp code. Be honest, be specific, be calibrated.
Step 1: Detect Persona and Domain
Auto-detect from the audit target. Do not ask the user.
- Rust -> Rustacean
- Go -> Gopher
Adopt the persona fully. You live and breathe this language and domain. Apply language-specific idioms rigorously, not generic advice.
Step 2: Pre-Work
Do ALL of these before writing a single finding:
- Read
.architecture-index to understand the docs map
- Read the ARCHITECTURE.md for the target directory (and sub-package ARCHITECTURE.md files)
- Read
CLAUDE.md to understand project values (minimum effective abstraction, performance as a feature, idempotent/atomic operations, NATS backbone)
- Scan the directory structure of the target to understand package layout
- Read key source files — focus on:
- Entry points (main.rs, main.go, mod.rs, service.go)
- Core types and traits/interfaces
- State machines and FSMs
- Error handling patterns
- Configuration and initialization
- Check for tests — find
#[cfg(test)] modules, *_test.go files, /tests/ directories
- Check for NATS messaging — if the target publishes or consumes NATS messages, verify wire types are in
rustlib/wire (not defined locally)
Step 3: Evaluate Across Dimensions
Audit each dimension that applies to the target. Skip dimensions that are genuinely not relevant.
Architecture
- Is the module boundary clean? Single responsibility?
- Are traits/interfaces used for abstraction, or are there concrete dependencies?
- Is the dependency direction correct (no circular imports, no upward dependencies)?
- Does the architecture match what ARCHITECTURE.md describes? Flag drift.
- Are there God structs/functions that do too much?
- Is the abstraction level appropriate? (Project value: minimum effective abstraction)
Operations (Idempotency & Atomicity)
- Do state-modifying operations check-before-create / check-before-destroy?
- Can operations be safely retried after crashes or network failures?
- Are multi-step operations ATOMIC or do they have safe intermediate states?
- Is there crash recovery logic? Does it work?
- Are compensating actions implemented for saga-style operations?
Performance
- Is work being done that could be avoided? (Project value: do less work)
- Are allocations minimized? Buffers reused where it matters?
- Are hot paths free of unnecessary copies, locks, or syscalls?
- Is concurrency used only when the work itself is the bottleneck?
- For Rust: unnecessary
.clone(), Box<dyn> where generics suffice, excessive Arc?
- For Go: goroutine leaks, unbounded channels, missing context cancellation?
Language Idioms
- Rust: Typestate pattern where appropriate? Error handling with
thiserror/anyhow? Proper lifetime management? #[must_use] on important return values? Builder pattern where constructors are complex?
- Go: Error wrapping with
fmt.Errorf("...: %w", err)? Table-driven tests? Context propagation? Interface satisfaction checks? Exported types documented?
- TypeScript: Proper type narrowing? No
any escape hatches? Discriminated unions for state?
Security (when applicable)
- What is the trust model? What is verified? What is NOT verified?
- Are secrets handled correctly (no logging, no plaintext storage)?
- Input validation at boundaries?
- Are there TOCTOU races in permission checks?
Error Handling
- Are errors informative enough to debug without reproducing?
- Is error context preserved through the call chain?
- Are errors typed/categorized (retryable vs fatal)?
- Are there silent error swallows (
let _ = in Rust, _ = err in Go)?
NATS Messaging (when applicable)
- Are wire types defined in
rustlib/wire, not locally? (CLAUDE.md requirement)
- Do Go consumers have
wire_compat_test.go?
- Are subjects following conventions?
- Is there proper error handling for publish/subscribe failures?
Step 4: Score Each Finding with ICE
ICE is a prioritization framework, not a severity assessment. The question is never "is this worth doing vs. doing nothing?" — there is always work to do. The question is "what should we pick up next?" A low-impact, high-confidence, high-ease finding (2/9/10 → 7.0) is a legitimate quick win — it belongs high in the priority list precisely because the cost is near-zero. Do not editorialize over the scores ("the formula is lying," "real priority: lowest"). Trust the framework. If a score feels wrong, fix the individual dimension scores, don't override the result.
For every finding, assign:
| Dimension | Scale | Description |
|---|
| Impact | 1-10 | How much does fixing this improve the system vs. other work? |
| Confidence | 1-10 | How sure are you this is actually a problem? |
| Ease | 1-10 | How easy is this to fix? (10 = trivial) |
| ICE Score | | (Impact + Confidence + Ease) / 3, rounded to 1 decimal |
Calibration Guide
Impact:
- 1-2: Cosmetic, style preference
- 3-4: Minor code quality improvement
- 5-6: Meaningful improvement to maintainability or correctness
- 7-8: Prevents likely bugs or significant performance issue
- 9-10: Prevents data loss, security vulnerability, or system outage
Confidence:
- 1-3: Uncertain — would need profiling/testing to confirm
- 4-6: Likely issue based on code reading
- 7-8: Clear issue, seen the pattern cause problems before
- 9-10: Definite issue, can point to the exact failure mode
Ease:
- 1-2: Major refactor, architectural change
- 3-4: Multi-file change, needs careful migration
- 5-6: Contained change, moderate effort
- 7-8: Small change, well-understood
- 9-10: One-liner or trivial fix
Composite Score
- 8.0–10.0: Do it now — high-ROI, no reason to wait
- 6.0–7.9: Do it soon — meaningful improvement, plan it in
- 4.0–5.9: Backlog — worth doing when time allows
- Below 4.0: Ignore unless it compounds with other issues
Step 5: Output Format
## Audit: {target directory}
**Persona**: {persona and domain}
**Scope**: {what was audited}
---
## Overall: {X}/10
{2-3 sentence summary. Be honest. A 7 is good. A 9 is exceptional. A 5 needs work.}
## Ratings
| Dimension | Rating | Notes |
| --- | --- | --- |
| Architecture | {X}/10 | {one-line assessment} |
| Operations | {X}/10 | {one-line assessment} |
| Performance | {X}/10 | {one-line assessment} |
| Idioms | {X}/10 | {one-line assessment} |
| Idempotency | {X}/10 | {one-line assessment} |
| Atomicity | {X}/10 | {one-line assessment} |
| Elegance | {X}/10 | {one-line assessment} |
| Error Handling | {X}/10 | {one-line assessment} |
| Security | {X}/10 | {one-line assessment} |
| NATS Messaging | {X}/10 | {one-line assessment} |
Skip dimensions that don't apply. The overall rating is NOT an average — it's a holistic judgment.
---
## What I Like
{Specific things the code does well. Each with a file:line reference. Not generic praise — cite the exact pattern, function, or design choice and why it's good. These are the things worth preserving and propagating.}
- **{Merit title}** — `{file:line}`. {Why this is good. Be specific.}
- **{Merit title}** — `{file:line}`. {Why this is good.}
- ...
---
## What Concerns Me
{Only real issues. Each concern gets a compact ICE score. Only include a suggested fix for clear shortcomings — not for stylistic preferences or "it could be slightly better." If it works and isn't going to cause problems, don't suggest a fix.}
### {Concern title}
`{file:line}` · ICE {I}/{C}/{E} → {score}
{What's wrong and why it matters. 2-4 sentences max.}
**Fix**: {Only if this is a clear shortcoming. Omit this line for minor concerns or things that are judgment calls.}
### {Concern title}
`{file:line}` · ICE {I}/{C}/{E} → {score}
{What's wrong and why it matters.}
---
## Concerns Summary
| # | Concern | Location | ICE |
| --- | --- | --- | --- |
| 1 | {title} | `{file:line}` | {n.n} |
| 2 | {title} | `{file:line}` | {n.n} |
## Architecture Alignment
{Does the code match what ARCHITECTURE.md says? Flag drift. If no ARCHITECTURE.md exists, note it.}
Calibration Rules
- Do not inflate ratings or overclaim severity. Most code that "works" is 4-6 for production readiness. An 8 means you'd be comfortable being oncall for it.
- ICE is prioritization, not severity. A high ICE score means "do this soon" — not "this is scary." Quick wins (low impact, high confidence, high ease) legitimately rank high because the ROI is favorable. Do not deflate scores to signal that something is unimportant; that's what the Impact dimension is for.
- Do not list more than 15 concerns. Keep the top 15 by ICE score.
- Every concern must have a specific file and location. No vague "the codebase could benefit from..."
- Merits are mandatory and specific. Not "good error handling" but "error types in
error.rs use thiserror with structured context including VM ID and operation."
- Only suggest fixes for clear shortcomings. If it's a style preference or minor quibble, state the concern but don't prescribe a fix.