--- name: ai-code-review description: "Review AI-authored code for its characteristic failure modes — plausible-but-wrong logic, hallucinated APIs, over-engineering, dead scaffolding, and silent security shortcuts. Use when reviewing an AI-generated or heavily AI-assisted PR, when AI-written code keeps shipping subtle bugs, or when setting review standards for a team using coding agents. Produces a focused review with AI-specific findings, verification steps per risk class, and a team checklist for AI-authored changes. For general PR review use code-review-checklist — this skill covers what that one assumes a human wouldn't do." --- # AI Code Review Skill Human code fails where the human got tired or didn't know; AI code fails where *plausibility diverged from correctness* — and it fails fluently, with confident naming, clean formatting, and tests that pass without testing anything. Reviewing it with human-code instincts ("looks careful, probably is careful") is how the new bug class ships. This skill reviews for the failure modes that are characteristically AI. ## What This Skill Produces - A **review of the change** organised by AI-characteristic risk, each finding with file/line and severity - **Verification steps** the reviewer must actually run (not read) per risk class - A **team checklist** for AI-authored PRs, calibrated to this codebase ## Required Inputs Ask for (if not already provided): - **The diff or PR** (or the files changed) - **Provenance honestly**: fully agent-written, human-piloted, or mixed — and whether the *author reviewed it themselves* before requesting review - **The codebase context**: existing conventions/utilities the AI may not have known, and what the change claims to do - **Test infrastructure**: what CI actually runs (the AI may have written tests CI never executes) ## The AI-Characteristic Failure Modes Review in this order — most damaging first: 1. **Plausible-but-wrong logic.** The code reads correctly and does something subtly different: inverted edge conditions, off-by-one on boundaries the prompt never mentioned, the right algorithm for a slightly different problem. *Verification: trace 2-3 concrete inputs through the changed logic by hand — the fluency of the code is not evidence; it's the camouflage.* 2. **Hallucinated or misused APIs.** Methods that don't exist in this version, config keys from a different library, plausible-sounding parameters silently ignored. *Verification: for every external API call touched, check the actual dependency version's docs — not memory, not the AI's comment.* 3. **Tests that test nothing.** Asserting mocks return what they were mocked to return; happy-path-only suites with confident names; tests copied from the implementation (tautological). *Verification: mentally break the implementation — would any test fail? If not, the coverage number is decoration.* 4. **Reinvention and drift.** A new utility duplicating an existing one (the AI didn't know your `utils/`), a new pattern where the codebase has a convention, a second source of truth. *Verification: for each new helper/abstraction, grep for the existing equivalent.* 5. **Over-engineering as default.** Speculative generality: interfaces with one implementer, config for things that never vary, error hierarchies for a script. AI pads scope because scope was ambiguous. *Finding, not felony — but it's yours to maintain forever.* 6. **Dead scaffolding.** Unused imports/variables, TODO stubs presented as done, commented-out alternatives, leftover debug logging. Cheap to catch, and its *presence predicts* the deeper failures — a diff with scaffolding wasn't self-reviewed. 7. **Silent security shortcuts.** Broad exception swallowing, disabled TLS verification "for now", string-built SQL, secrets in examples that became code, permissive CORS. AI reproduces the internet's average security posture unless told otherwise. *Verification: run the security linters even for a "trivial" change; the shortcut is rarely where the feature is.* ## Output Format ### AI Code Review: [PR/change] — provenance: [stated] **Verdict:** ✅ approve / 🟡 approve with required fixes / 🔴 request changes — [one line] **Findings** | # | Failure mode | Location | Severity | Finding + fix | |---|---|---|---|---| **Verified by running:** [the hand-traces, API checks, and break-the-test exercises actually performed — a review that only read the diff says so] **Debt accepted knowingly:** [over-engineering/style items merged anyway, listed so they're chosen] **Team checklist for AI-authored PRs:** [the 7 modes as a calibrated checklist + the house rule: AI-assisted PRs declare provenance, and the author self-reviews before requesting review] ## Quality Checks - [ ] At least one concrete input was hand-traced through the changed logic - [ ] Every touched external API was verified against the actual dependency version - [ ] Each test was assessed by "what breakage would this catch?" - [ ] New helpers were grepped against existing utilities - [ ] The verdict distinguishes required fixes from accepted debt ## Anti-Patterns - [ ] Do not extend human-code trust heuristics ("clean and well-named, so probably correct") — fluency is the failure mode's costume - [ ] Do not approve on green CI without checking whether the tests can fail - [ ] Do not review the description instead of the diff — AI PR descriptions are confident summaries of intent, not of behaviour - [ ] Do not reject code *for being* AI-written — review the code; provenance calibrates scrutiny, not verdicts - [ ] Do not skip security linting because the change is small — the shortcut hides in the periphery - [ ] Do not accept "the agent tested it" as verification — demand the evidence in the PR