--- description: Code audit workflow - structured code review and quality verification --- # Audit Workflow ## Purpose Inspect existing code quality and produce structured findings. This workflow does not write new features — it identifies issues for subsequent fix workflows. ## When to Use - After another agent's feature is committed (cross-agent review) - Periodic quality gates on the codebase - Before releases or deployments - When user wants assurance without writing new code - After addressing review findings, to verify the fixes ## When NOT to Use - When writing new features (use `/orchestrator`) - When fixing known bugs (use `/quick-fix`) - When restructuring code (use `/refactor`) ## Pre-Audit Checklist Before starting, you MUST: 1. Scan `.agents/rules/` directory — these form the review criteria 2. Read `rule-priority.md` for conflict resolution 3. Identify the scope of the audit (specific feature, module, or full codebase) ## Phases ### Phase 1: Code Review **Set Mode:** Use `task_boundary` to set mode to **PLANNING** Invoke the **Code Review Skill** against the specified files/features. Review against these categories (in priority order from `rule-priority.md`): #### 1. Security - Input validation on all boundaries - No hardcoded secrets or credentials - Parameterized queries (no SQL injection) - Proper authentication/authorization checks #### 2. Reliability - Error handling on all I/O operations (no empty catch blocks) - All resources cleaned up (connections, files, locks) - Timeouts on external calls - Graceful degradation patterns #### 3. Testability - I/O operations behind interfaces/abstractions - Business logic is pure (no side effects) - Dependencies injected, not hardcoded - Test coverage on critical paths #### 4. Observability - All operation entry points logged (start/success/failure) - Structured logging with correlation IDs - Appropriate log levels #### 5. Code Quality - Follows existing codebase patterns (>80% consistency) - Functions are focused and small (10-50 lines) - Clear naming that reveals intent - No code duplication (DRY) ### Phase 1.5: Cross-Boundary Review **Set Mode:** Continue in **PLANNING** Cross-boundary issues live at the seams between components, not inside any single file. This phase defines a **menu of dimensions** — activate only those that apply to the project under audit, and explicitly state which you skipped and why. #### Dimension Selection | Dimension | Activate When | |---|---| | **A. Integration Contracts** | Project has both a frontend and a backend | | **B. Database & Schema** | Project uses a relational/document database | | **C. Configuration & Environment** | Always — universal | | **D. Dependency Health** | Always — universal | | **E. Test Coverage Gaps** | Always — universal | | **F. Mobile ↔ Backend** | Project has a mobile app and a backend | At the start of this phase you MUST state: > "Activating dimensions: A, B, C, D, E. Skipping F (no mobile app)." --- #### Dimension A: Integration Contracts *Applies to: full-stack projects with frontend + backend* - [ ] Map every backend endpoint (route + method) against its frontend adapter — flag any unmapped endpoints in either direction - [ ] Verify request/response field names, types, and status codes match across the boundary - [ ] Verify all outbound HTTP calls use the project's centralized API client (not raw `fetch`/`axios`) — see `typescript-idioms-and-patterns.md § Centralized HTTP Client` - [ ] Build an auth coverage matrix: which endpoints require auth, do the frontend adapters send tokens for each? - [ ] Check error contract alignment: does the frontend handle the full set of error codes the backend can return? #### Dimension B: Database & Schema *Applies to: projects using a relational or document database* - [ ] Verify all tables have required base columns (`id`, `created_at`, `updated_at`) - [ ] Check all foreign keys have corresponding indexes - [ ] If using Supabase or Postgres RLS: verify RLS policies exist on every table storing user data - [ ] Cross-reference the application's struct/model field names against actual DB column names — flag any drift - [ ] Check migrations are reversible (up + down) and follow the additive-first strategy - [ ] Scan storage adapters for N+1 query patterns #### Dimension C: Configuration & Environment *Always active* - [ ] No hardcoded secrets, tokens, URLs, or credentials in source code - [ ] `.env.template` exists and covers every env var referenced in the codebase - [ ] Startup validation fails fast on missing required config (does not silently fall back to bad defaults) - [ ] Secrets are never logged (not in debug, not in error messages) #### Dimension D: Dependency Health *Always active* - [ ] No unused top-level dependencies in `go.mod` / `package.json` / `Cargo.toml` - [ ] No circular dependencies between feature modules - [ ] Cross-module imports only use each module's public API (not internal files) - [ ] Run `npm audit` / `go list -m -json all | nancy` / `cargo audit` — flag high-severity CVEs #### Dimension E: Test Coverage Gaps *Always active* - [ ] A handler/controller test exists for every API endpoint - [ ] An integration test exists for every storage/database adapter - [ ] Every error path (catch block, error return) has at least one test that exercises it - [ ] E2E tests cover the primary user journeys (login, main feature flow, error states) #### Dimension F: Mobile ↔ Backend *Applies to: projects with a mobile app and a backend* - [ ] API version compatibility — mobile must not call endpoints that no longer exist - [ ] Offline data sync: conflict resolution and retry logic are tested - [ ] Auth token refresh flows work correctly when the access token expires mid-session --- ### Phase 2: Automated Verification **Set Mode:** Use `task_boundary` to set mode to **VERIFICATION** Run the full validation suite (same as `/4-verify`): 1. Linters and static analysis 2. Full test suite 3. Build check 4. Coverage report ### Phase 3: Findings Report **Output location:** `docs/audits/review-findings-{feature}-{YYYY-MM-DD}-{HHmm}.md` You MUST save the report to the repo (not just as a conversation artifact) so it can be: - Referenced from other conversations/agents - Tracked in version control - Passed as context to fix workflows **Steps:** 1. Create the `docs/audits/` directory if it doesn't exist 2. Write the findings report to `docs/audits/review-findings-{feature}-{YYYY-MM-DD}-{HHmm}.md` 3. Use the template below > **Zero-Findings Guard:** If the audit produces fewer than 3 findings, you MUST complete the "Dimensions Covered" attestation section in the report before declaring a clean result. This proves cross-boundary coverage was not skipped. ```markdown # Code Audit: {Feature/Module Name} Date: {date} ## Summary - **Files reviewed:** N - **Issues found:** N (X critical, Y major, Z minor) - **Test coverage:** N% - **Dimensions activated:** A, B, C, D, E (list which were skipped and why) ## Critical Issues Issues that must be fixed before deployment. - [ ] {description} — {file}:{line} ## Major Issues Issues that should be fixed in the near term. - [ ] {description} — {file}:{line} ## Minor Issues Style, naming, or minor improvements. - [ ] {description} — {file}:{line} ## Verification Results - Lint: PASS/FAIL - Tests: PASS/FAIL (N passed, N failed) - Build: PASS/FAIL - Coverage: N% ## Dimensions Covered | Dimension | Status | Files / Queries Examined | |---|---|---| | A. Integration Contracts | ✅ Checked / ⏭ Skipped (reason) | e.g., all 26 backend routes cross-referenced against 11 frontend adapters | | B. Database & Schema | ✅ Checked / ⏭ Skipped (reason) | e.g., reviewed all 8 Supabase tables + 4 storage adapters | | C. Configuration & Environment | ✅ Checked | e.g., scanned for raw secrets, verified .env.template | | D. Dependency Health | ✅ Checked | e.g., ran npm audit, checked go.mod for unused deps | | E. Test Coverage Gaps | ✅ Checked | e.g., verified handler tests for all 26 endpoints | | F. Mobile ↔ Backend | ⏭ Skipped | No mobile app in this project | ``` ## Feedback Loop After the audit produces findings, choose the right workflow based on finding type: | Finding Type | Example | Workflow | | ----------------------------------------------------------------------------------- | ------------------------------------ | ------------------------------------- | | **Nit / minor** (naming, formatting, missing comment) | "Rename `x` to `userCount`" | Fix in this conversation directly | | **Small isolated fix** (missing log, error handling, validation) | "Add input validation on handler" | `/quick-fix` in a new conversation | | **Structural change** (wrong abstraction, missing interface, pattern inconsistency) | "Storage not behind interface" | `/refactor` in a new conversation | | **Missing capability** (new endpoint, feature, auth check) | "No auth middleware on admin routes" | `/orchestrator` in a new conversation | ### Using Findings in Other Contexts When starting a fix workflow in a new conversation, reference the persisted report: > "Fix the critical issues in `docs/audits/review-findings-gatekeeper-2026-02-16-1430.md`" The agent in the new context can read the file directly from the repo — no need to copy-paste findings. ## Completion Criteria - [ ] All specified files/features reviewed - [ ] Full verification suite run - [ ] Findings document saved to `docs/audits/` in the repo