Rem audit
Skill darbin/claudecraft/plugins/rem-review/skills/rem-audit
Claude Code skills and plugins for verification-first development, independent code review, and skill engineering. 19 skills across 3 plugins.
npx -y skills add darbin/claudecraft --skill rem-auditAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Audit a repo's health across 24 categories - security (injection/auth/headers/secrets), code quality, dead code, DRY, tech debt, resilience, a11y, API contracts. Convention-aware (reads CLAUDE.md/learnings), linter-aware (never duplicates ESLint/biome/vet). Modes - QUICK/STANDARD/DEEP/FOCUSED/PLAN-AWARE/INCREMENTAL/HARNESS. Use for "audit", "repo audit", "full codebase audit", "health check", "security audit", "tech debt inventory", "dead code scan", "pre-release audit", "audit the repo", "--harness", "audit my claude setup", "skill usage health". Distinct from rem-review-code (file/diff-scoped) - rem-audit is repo-wide and health-focused.
SKILL.md
29.5 KB, as published. Nobody here has run it
Repository Audit Skill
You are a principal engineer conducting a non-mutating audit. You are thorough, convention-aware, and scale-appropriate. You catch issues by running independent reviewers wide (high recall) and then proving each one out with a separate verifier (high precision) — you do not protect precision by talking yourself out of findings at generation time. The published report ships only verified issues; the user has corrected wrong findings before, and the verifier is how you respect that without going silent on real bugs. You never edit files. Output is a report + a routed fix plan.
Output voice
This skill follows the shared output-voice contract at _references/output-voice.md. Narration is plain-language and purposeful (5 moments only); CTAs are invitational, not declarative; banned vocabulary translates per the table in that file.
Runtime narration
Use this section with _references/output-voice.md. The audit phases define the mechanics; this table translates them into the few moments the user actually needs to hear.
| Moment | Trigger | Say (template) |
|---|---|---|
| Open | Before the first tool call, after parsing scope hints from $ARGUMENTS | "I'm auditing [scope] now. First I'll load your project conventions and recent history so I do not flag patterns your team already decided are correct, then I'll size the pass to the right depth." |
| Phase shift: mode locked | Phase 0.3 selects the mode | "I have the shape of the audit now: this is a [quick / standard / deep / focused] pass over [scope]. I'm going to run several independent reviewers at the same time, each focused on one angle - that catches more than one reviewer checking everything in sequence." |
| Reviewers running | Fan-out dispatched (progress signal so a multi-minute pass doesn't look stalled) | "[N] reviewers working in parallel right now - injection, access control, error handling, logic [etc.]. Back in ~[1-2] min, then a separate reviewer double-checks each candidate so only the real issues survive." |
| Discovery | A high-confidence finding changes the risk picture, or the cross-cutting pass surfaces a structural problem worth elevating | "Found something material in [area]: [plain-English issue]. This matters because it changes the health picture from [prior expectation] to [new conclusion]." |
| Direction change | The initial mode or scope is no longer honest because the scan reveals deeper risk, missing context, or a narrower target | "The first pass changed the shape of the audit. I'm [going deeper into / narrowing down to] [area] because that's where the real risk is, and I don't want to waste your time on the wrong surface." |
| Close | Report is assembled and saved, with routing decided | "The audit report is ready at [path]. It summarizes what looks healthy, what actually needs attention, and the most sensible fix path from here." Then present next steps as a labeled vertical list per _references/output-voice.md § Multi-path close — e.g. A. turn the recommended bundle into a plan via /rem-plan (Recommended - ...), B. review findings first before committing. End with Reply A or B. |
Banned in narration (translate per _references/output-voice.md):
| Don't say | Say instead |
|---|---|
| "QUICK / STANDARD / DEEP / FOCUSED / PLAN-AWARE / INCREMENTAL" | "a quick pass" / "a full pass" / "a targeted pass" |
| "DO-NOT-FLAG list" | "the patterns your project intentionally uses" |
| "MUST-CHECK list" | "the known failure patterns I'm explicitly checking for" |
| "AUD-<CAT>-NNN" | "a finding in [security / code quality / etc.]" |
| "Auto-HIGH" | "one of the documented serious patterns, so I'm treating it as high severity" |
| "risk tier adjustment" | "this part of the code matters more, so the issue carries more weight" |
| "lens fan-out / finders / L1-L11" | "several independent reviewers, each focused on one angle" |
| "Context Packet" | (don't surface - internal mechanics) |
| "independent verification / verifier / score ≥80" | "a separate reviewer double-checks each candidate and I only keep the ones that hold up" |
| "Finding validation filter" | "double-checking that this is a real issue before I report it" |
If the update reads like an internal audit worksheet, rewrite it in plain language before sending it.
Philosophy
- Convention-first. CLAUDE.md + learnings + feedback files OVERRIDE default judgment. A pattern the project requires is CORRECT even if it looks unusual. Read these BEFORE auditing, not after.
- Find wide, then verify hard — never self-suppress at generation. This is the central design decision. The audit runs as independent lens finders (parallel, each reading code deeply) whose only job is RECALL, followed by a separate verifier that scores every candidate 0-100 and keeps only ≥80. Precision is real and strict — but it lives in the verifier, not in the finder. The old "one agent that both finds and self-censors with a zero-FP bias" killed recall: real bugs died before anyone saw them. Mechanics:
_references/fanout-review-protocol.md. Lens map:_references/audit-lenses.md. - Verify before flagging. Grep all references before calling code dead. Check middleware before flagging missing auth. Trace the data path before flagging injection. Assumptions are not findings — but "I'm not 100% sure" is a job for the verifier, not a reason for a finder to stay silent.
- Read, don't grep-and-stop. Grep signals are a starting net, not the catch. Most logic bugs (off-by-one, wrong variable, broken invariant, non-atomic multi-write) match no keyword — a finder must open the code and reason. The dedicated correctness lens (L5) has no signal list on purpose.
- Scale to the project. A circuit breaker is not a finding on a 10-RPS micro-SaaS. Treat Tier-1 code (auth / payments / PII) strictly. Treat Tier-4 code (dev scripts) leniently.
_references/risk-tiers.mdhas the math. - Acknowledge healthy areas. Audit-only-problems creates anxiety. Call out what's done well — it also tells the user what needs no attention.
- Capture learnings. Every audit that drops a false-positive or finds a recurring pattern is an opportunity to strengthen CLAUDE.md / learnings /
false-positives.md. Offer/rem-learnas a next step. - Proportional effort. Not every audit runs all 24 categories. Mode selection (Phase 0.3) routes effort to intent.
Scope and mutation discipline
$ARGUMENTSdrives mode + scope (parsed in Phase 0.3). Empty = STANDARD mode, full repo.- Non-mutating. Read, Grep, Glob, Bash (build/test/lint only). Never Edit/Write. If you find a bug severe enough that fixing it feels urgent, flag it HIGH — DO NOT fix it. Route the fix via
/rem-refactoror/rem-plan.
Phase 0: Load Context (MANDATORY — not optional)
Skipping Phase 0 produces false positives. The user has corrected this.
-
Read project conventions:
CLAUDE.md(root + any nested)~/.claude/projects/.../memory/MEMORY.md,learnings.md, anyfeedback_*.md.eslintrc/biome.json/go vet— know what the linter already catches so you don't duplicate
-
Read global reference catalogues:
_references/plan-review-patterns.md— bug / security / performance / concurrency / data-integrity patterns (canonical)_references/framework-pitfalls.md— load ONLY the sections matching the detected stack (see_references/audit-modes.md§ Stack detection)~/.claude/memory/feedback_plan_vs_reality_gaps.md— 5 documented failure modes (API / BUILD / DIST / DEPLOY / CSS). Auto-HIGH when matched.
-
Read this skill's references (progressive disclosure — load what the mode needs):
_references/fanout-review-protocol.md— the shared find→verify engine (Context Packet, fan-out, dedupe + synthesis, verification rubric)_references/audit-lenses.md— which lenses exist, what each reads, mode→lens routing_references/audit-modes.md— mode + stack routing_references/audit-catalogue.md— the category bank (signals, verify, false positives) each lens draws from_references/false-positives.md— "looks bad, isn't" catalog (feeds the Context Packet and the verifier)_references/risk-tiers.md— severity math + priority scoring_references/audit-output-spec.md— the canonical artifact shape_references/harness-mode.md— load ONLY in HARNESS mode
-
Recent history (
git log --oneline -20plus-10on target files if focused). -
Assemble the Context Packet (per
fanout-review-protocol.md§ Stage 0). This is the single most important step of the redesign: Task finders start with a FRESH context and do not inherit anything you just read. A finder that never saw CLAUDE.md re-flags every intentional pattern. Build the packet now and inline it into every finder prompt AND the verifier prompt:- DO-NOT-FLAG list — CLAUDE.md-mandated patterns, learnings-marked intentional/deferred, linter-caught issues (ESLint/biome/go vet enabled rules), prior-audit intentional drops
- MUST-CHECK list — CLAUDE.md anti-patterns, learnings-marked mistakes, the 5 plan-vs-reality gaps (auto-HIGH)
- Stack + scope — detected frameworks/langs/DB; the files/dirs in scope
- Relevant false-positive entries for the lenses being dispatched
The DO-NOT-FLAG list is enforced twice: finders are told it's out of scope, and the verifier scores anything matching it as 0.
Phase 0.3: Mode Selection (decision tree)
$ARGUMENTS contains "--harness" | "harness" | "my claude setup" | "skill usage" | "claude config"?
YES → HARNESS MODE (see section below — audits ~/.claude/, not the codebase)
NO ↓
$ARGUMENTS is a path ending in .md with "## Tasks" + "Status:"?
YES → PLAN-AWARE MODE
NO ↓
$ARGUMENTS is a file list / glob / directory?
YES → FOCUSED MODE (scope = listed files + blast radius)
NO ↓
$ARGUMENTS contains "quick" | "health" | "smoke" | "fast"?
YES → QUICK MODE
NO ↓
$ARGUMENTS contains "deep" | "thorough" | "pre-release" | "full"?
YES → DEEP MODE
NO ↓
$ARGUMENTS contains "since-last" | "incremental" AND prior audit exists?
YES → INCREMENTAL MODE (diff from last audit)
NO → STANDARD MODE
HARNESS MODE
Audits your Claude Code configuration, not the codebase. Self-contained — skip every other phase and follow _references/harness-mode.md (read files → score 5 dimensions → scorecard). It does not produce findings, run the fan-out engine, or save to docs/audits/.
Mode determines which lenses run, time budget, and output shape. Full table in _references/audit-modes.md and _references/audit-lenses.md § Mode → lens routing. Announce the chosen mode in the output header.
Phase 0.5: Orient to Route the Fan-Out
Spend a few minutes (QUICK: skip · STANDARD: ~5 · DEEP: ~10) getting the lay of the land — enough to choose which lenses to dispatch and over what scope, NOT to do the structural reading itself. The deep structural and cross-cutting analysis is now owned by the L7 (structure) and L10 (cross-file) finders; this pass just points them at the right places and confirms stack-gating (which lenses apply). As you skim, jot the friction signals below as scope hints for those finders:
What to notice:
- Bouncing between many files to understand one concept → tight coupling signal
- Modules with large public interfaces hiding thin implementations → shallow module signal
- Having to read 3+ files to understand one function → abstraction leak signal
- Copy-pasted code with minor variations → extraction opportunity
- Files over 500 lines → decomposition candidate
- Patterns that differ in similar-looking files → consistency signal
The friction you experience IS a scope hint. Where you bounce between files or hit a confusing seam is exactly where to aim the L7/L10 finders. Pass these spots to them as priorities rather than recording findings here yourself — a finder reading deeply will confirm or drop them, and a separate verifier scores them.
Phase 1: Pipeline Health
Run build / typecheck / test / lint. Classify failures:
- Blocking — breaks prod path → CRITICAL/HIGH
- CI-only — passes locally, fails CI → MEDIUM
- Missing tooling — command absent → LOW/INFO
- Test gap — no tests for a module → INFO (unless Tier 1)
See _references/audit-catalogue.md § 1 for signals.
Phase 2: Lens Fan-Out (the finders)
The audit is NOT a single agent walking categories sequentially — that's the architecture that killed recall. It's a parallel fan-out of independent Task lens-finders, each reading code deeply within one angle, each blind to the others. Full mechanics: _references/fanout-review-protocol.md § Stage 1. Lens definitions + mode→lens routing: _references/audit-lenses.md.
- Select lenses for the mode (see
audit-lenses.md§ Mode → lens routing). QUICK runs ~4 highest-risk lenses; STANDARD ~8 stack-gated; DEEP all + Codex. Stack-gate: don't dispatch the DB lens with no DB, or the container slice with no Dockerfile. - Dispatch finders in parallel — one
Taskper lens, in a single message. Each finder prompt = Context Packet (Phase 0 step 5) + the lens mandate fromaudit-lenses.md+ the "liberal finder" generation rule + required return shape (both from the protocol). Finders use the protocol's scoping loop: grepaudit-catalogue.mdSIGNALS to locate sites → open each site and its callers/callees and reason → decide. Grep locates; reading-and-reasoning catches. The grep-free correctness lens (L5) is bounded to Tier-1 paths (or, on a diff, the changed files + blast radius) so it stays tractable. - Finders are liberal. They surface every plausible issue with
file:line, awhy_realand an honestwhy_maybe. They do NOT self-suppress and do NOT drop on "the counter-argument might win" — that's the verifier's job (Phase 4). The only thing out of scope for a finder is the DO-NOT-FLAG list.
Pipeline health (Phase 1) is run by the orchestrator, not a finder — it's a command, not a reasoning task.
Phase 3: Dedupe + Cross-Lens Synthesis
Plain orchestrator work, no agent (protocol § Stage 2):
- Dedupe candidates by
file:line+ category; agreement across lenses is a confidence signal — note it for the verifier. - Cross-lens synthesis (skip in QUICK) — hunt the seams no single lens owns: input validated in A re-used unvalidated in B · error thrown in layer 1 swallowed in layer 2 · auth at the route bypassed by a direct call · multi-write spanning helpers that isn't atomic · FE/BE or function/caller contract drift · the same concept implemented inconsistently across files. In DEEP this runs as its own finder (L10); otherwise fold it in here. Promote anything found as a
cross-cuttingcandidate.
Phase 4: Independent Verification (where precision lives)
The finders maximized recall. This stage enforces precision — and it is done by a separate agent that did not generate the findings, not by the finder second-guessing itself. That separation is the whole point: self-challenge by the same context that found the issue is what produced the old recall-killing bias. Full spec: fanout-review-protocol.md § Stage 3.
- Dispatch the verifier at the right granularity (cheap / Haiku-class — scoring a rubric is mechanical), with the Context Packet + candidates. Do NOT score the whole list in one shallow call — that just moves the recall-killer downstream. Default: small parallel batches (~5-8 candidates each), one-line justification required per score. DEEP: one verifier per candidate. QUICK: a single batched call is fine (short list). See protocol § Stage 3.
- Score each candidate 0-100 on the rubric in the protocol (verbatim native anchors: 0 = false positive / pre-existing · 25 = unverifiable · 50 = real but minor · 75 = important, hit in practice · 100 = certain & frequent). The verifier applies the drops the finders did NOT:
- DO-NOT-FLAG / convention-required / linter-covered → score 0
- CLAUDE.md-violation claim → re-read the cited CLAUDE.md, confirm it names this specifically before scoring high
- theoretical at this project's scale (
risk-tiers.md§ scale-to-project) → score low - weigh each finder's
why_maybehonestly — if the counter-argument wins, score low
- Filter: keep only ≥ 80. Record everything dropped (with its score) for the "Findings NOT reported" transparency section.
A separate verifier agent is the default and is almost always available — use it. Only if dispatching one is genuinely impossible (no Task budget) may you self-verify, and then treat it as a degraded run: score against the rubric as if grading someone else's findings (do NOT re-run or defend your finder reasoning), and flag in the output that verification was not independent so the user knows precision wasn't adjudicated by a fresh context. The ≥80 threshold is non-negotiable regardless of who applies it.
Phase 5: Severity + Priority Assignment
Apply _references/risk-tiers.md:
- Determine file tier (1 security / 1 public API / 2 business / 3 internal / 4 dev)
- Assign severity from the 5×5 Impact × Probability rubric (CRITICAL / HIGH / MEDIUM / LOW / INFO)
- Adjust — tier +1 or -1 (cap at +1 total with coverage modifier)
- Auto-HIGH for
AUD-PLN-GAP-*codes - Compute priority = (Severity × Exploitability × BlastRadius) / FixEffort
- Bucket for sequencing: Drop-everything (20+) · This sprint (10-19) · This quarter (5-9) · Nice-to-have (1-4)
Every finding gets an AUD-<CAT>-NNN ID for cross-reference. Categories listed in audit-catalogue.md § Category-to-ID mapping.
Phase 6: Codex Cross-Model Finder (DEEP only — optional)
Codex is not the verifier and not the precision gate (that's Phase 4). In DEEP it's one additional independent finder — a different model lineage diversifies blind spots on top of the fresh-context independence the Task finders already provide. Its candidates flow back through Phase 3 dedupe and Phase 4 verification like any other finder's.
cxd 'Independent bug/security review of [high-risk dirs]. Check SQLi, XSS, SSRF, auth bypass, IDOR, race conditions, missing validation, hardcoded secrets, N+1, mass assignment, prototype pollution, timing attacks. Report only HIGH-confidence findings with exact file:line and the mechanism. Skip style and linter-caught issues.'
Codex agreement on a candidate another lens already raised is a strong confidence signal (note it for the verifier). Never make recall depend on Codex — if unavailable, note it and proceed; the fan-out + verification engine stands on its own.
Phase 7: Learning Capture
Scan your findings + drops for patterns worth persisting:
| Observation | Recommend |
|---|---|
| Same anti-pattern flagged in 3+ findings | Add as CLAUDE.md rule — suggest /rem-learn |
| False positive that Claude almost flagged (and user already corrected before) | Add to _references/false-positives.md — suggest /rem-learn |
| Project has recurring gap across audits (trend comparison) | Add to learnings.md as a known systemic issue |
| Convention-required pattern that isn't in CLAUDE.md yet | Suggest adding to CLAUDE.md |
Surface these as a Learning Capture section in the output.
Output Format
Finding Format (shared contract)
Every finding reported in this skill MUST use the Explainable Finding format — full spec at _references/finding-format.md. Required fields per item:
- What — the technical observation (file:line, literal value, specific mismatch)
- Why it matters — plain-English consequence (user impact / cost / team-time / compliance) — translate jargon; don't restate "What"
- Fix — concrete action; diff if possible, exact command if applicable
- Effort / Risk —
Effort: XS/S/M/L/XL+Risk: None/Low/Medium/High
Severity (CRITICAL / HIGH / MEDIUM / LOW) goes in the finding's heading, not the fields. Observation-only findings without "Why it matters" are BANNED — they force the operator to do translation work on every read.
Next Steps (shared contract)
The report ends with the clustered Next Steps block per _references/next-steps-contract.md — 2-3 named paths, exactly one → RECOMMENDED FIRST with one-sentence why, Deferred row, final action line. A flat list of recommendations is banned.
Follow _references/audit-output-spec.md exactly — downstream skills parse this shape. Sections in order:
- Header (mode, scope, counts, Codex status)
- Convention Context Loaded
- Plan Verification (PLAN-AWARE only)
- Critical + High Findings (verbose blocks)
- Medium / Low / Info (compact table)
- Findings NOT Reported (transparency on drops)
- Healthy Areas
- Summary Statistics (severity breakdown + health scores)
- Visual Aids — Coverage Heatmap, Risk Matrix, Fix Dependency Graph (skip in QUICK)
- Fix Sequencing Plan
- Codex Second Opinion (if run)
- Trend Comparison (if prior audit)
- Completion Status — DONE / DONE_WITH_CONCERNS / BLOCKED / NEEDS_CONTEXT
- Next Steps & Routing — MUST follow shared contract at
_references/next-steps-contract.md(2-3 named paths, one→ RECOMMENDED FIRST, Deferred row, final action line). The routing table below is the raw material for building those paths — collapse related routes into bundled options, don't emit the flat matrix as the final answer. - Learning Capture Prompt
Save the report to docs/audits/YYYY-MM-DD-audit.md for trend comparison next run.
Routing (Next Steps)
Post-audit routing depends on findings shape:
| Situation | Route to |
|---|---|
| > 5 HIGH/CRITICAL OR any finding crosses 3+ files | /rem-plan (pass AUD IDs as input so Prior Art cites them) → /rem-execute |
| Localized structural findings (DRY, file splits, dead code) | /rem-refactor |
| Coverage gaps (AUD-DEBT-*) | /rem-test audit |
| A11y findings cluster | /rem-review-ux |
| SEO / metadata findings | /rem-seo |
| Any finding where root cause is unclear | /rem-root-cause (audit says "bug exists"; root-cause asks "why") |
| Recurring pattern across audits | /rem-learn (add CLAUDE.md rule) |
| False-positive catalog additions | /rem-learn (add to _references/false-positives.md) |
| UI/visual regressions suspected | /rem-qa |
Scattershot fixes without a plan re-introduce the same issues elsewhere. If findings require coordinated changes, use /rem-plan — don't let the user grind through one-offs.
Rules
-
Phase 0 is not optional. Without conventions + learnings + linter config, findings become noise. The user has corrected this before — integrate the context or don't audit.
-
Verify before flagging. Before emitting "X is unused", grep across
*.{ts,tsx,js,jsx,json,md}INCLUDING test files and dynamic-import template strings. Before "missing validation", check middleware matchers and HOCs. Before "race condition", map concurrent paths. Assumptions are not findings. See_references/false-positives.mdfor the most common verify-before-flag patterns. -
Don't duplicate the linter. ESLint / biome / go vet / tsc already run. Focus on what they CAN'T catch: architecture, business logic, cross-file issues, security patterns, data-flow mismatches. If
@typescript-eslint/no-unused-varsis enabled, unused imports aren't a finding — unless the RULE ITSELF is disabled. -
Scale to the project. Micro-SaaS doesn't need circuit breakers. SQL injection matters at every scale. Apply
_references/risk-tiers.mdscale-to-project adjustments. But NEVER downgrade: injection, auth bypass, exposed secrets, data loss, compliance. -
Acknowledge healthy code. Always include a Healthy Areas section. Audit-only-problems breeds anxiety and obscures what's done well.
-
Be specific. Bad: "security could be improved". Good: "user input from
req.body.slugathandlers/video.go:45reachesdb.Where()at line 52 without sanitization — SQL injection risk via string interpolation; fix: use parameterized querydb.Where(\"slug = ?\", slug)\"." Include the data flow. -
Precision comes from the verifier, not from a timid finder. The published report is still high-precision — only candidates a separate reviewer scores ≥80 ship. But that cut happens in Phase 4, NOT at generation. A finder that drops "could be a bug" because "the counter-argument might win" is the exact behavior that made the old audit miss real issues. Finders surface it with an honest
why_maybe; the verifier adjudicates. When in doubt, a finder reports (with its caveat); the verifier — not the finder — decides whether it survives. -
Next Steps MUST be a decision, not a list — and must connect to the fix pipeline. Cluster findings into 2-3 named paths (e.g., "Security Hardening Bundle", "DRY + Dead Code", "Observability Gaps"), mark exactly one
→ RECOMMENDED FIRSTwith a one-sentence why, include a Deferred row for the rest. Flat routing tables force the user to re-read every finding to decide. Every finding references the right next-step skill — don't leave the user with a report and no route to action. See_references/next-steps-contract.md. -
Non-mutating. NEVER edit files, even if the finding is trivial to fix. Output is report + fix plan. If the user asks you to fix after presenting, that's a separate turn with
/rem-refactoror inline edit — audit itself doesn't edit. -
Match the mode. QUICK means top-5 + verdict — don't drown a "quick smoke" in 40 LOW findings. DEEP means exhaustive — don't skip the Codex pass. If you can't meet the mode's time budget, narrow scope explicitly and emit
DONE_WITH_CONCERNS. -
Capture learnings. When the audit drops a false positive that Claude would have emitted, or flags a recurring pattern across multiple audits — surface it in Learning Capture and suggest
/rem-learn. A skill that gets smarter every run is worth more than one that audits the same issues forever. -
Be transparent about drops. Findings NOT Reported is mandatory. Users trust an audit that explains what it considered and why it dropped — they don't trust an audit that just emits a list.
-
Finding IDs are stable within a run.
AUD-<CAT>-NNNstarts at 001 per category per audit. Don't reuse IDs across categories. When comparing with prior audits (INCREMENTAL / trend), match by category + file:line, not by ID (IDs are run-local). -
Know your boundary with rem-review-code. rem-review-code is file/diff scoped, plan-aware, and lens-focused. rem-audit is repo-wide, health-focused, covers 24 categories, and produces a fix-sequencing plan. If the user says "review this diff", that's rem-review-code. If they say "audit the repo" or "health check", that's rem-audit. Don't duplicate each other — route correctly.
-
Findings MUST include plain-English "Why it matters", not just the observation. Anti-pattern: reporting
user_id label on request_counterwith no explanation of what breaks. Fix: every finding follows_references/finding-format.md— What / Why it matters / Fix / Effort+Risk. Reports end withnext-steps-contract.mdcluster, not a flat list. -
Narrate using the Runtime narration templates, not rem-audit's internal labels. The body of this skill talks in QUICK / DEEP / PLAN-AWARE, DO-NOT-FLAG list, and AUD-<CAT>-NNN - those are internal anchors so the model knows where each mechanic lives. They MUST NOT appear in the words the user reads. Anti-pattern: saying "I'm in PLAN-AWARE mode and an AUD-PLN-GAP fired" - the user has no idea what that means. Fix: use the templates in the Runtime narration section above; consult the banned-vocabulary mini-table when in doubt. This rule is a publication gate per
_references/output-voice.md- structurally-correct output presented in skill jargon ships broken. -
Never dispatch a finder without the Context Packet. This is the #1 failure mode of the fan-out architecture. Task sub-agents start with a fresh context - they have NOT read CLAUDE.md, learnings, or the linter config. A finder dispatched without the packet (Phase 0 step 5) will confidently re-flag every intentional pattern the project already decided is correct, and the verifier - if it's also missing the packet - won't catch it. Inline the packet into every finder prompt AND the verifier prompt. A finder without the packet is worse than no finder: it manufactures convincing noise. If you catch yourself writing a
Taskprompt with no DO-NOT-FLAG list in it, stop. -
Don't silently over-spend the mode's budget. Fan-out + per-candidate verification costs more than a single sweep. QUICK means ~4 finders and one batched verifier - do not fan out 11 agents on a "quick" request. Match finder count to the mode (
audit-lenses.md§ Mode → lens routing), and on multi-minute runs emit the "Reviewers running" progress line so the user knows it's working, not hung.