Code Review Taxonomy

SkillMedia

Code review tag taxonomy and findings output format — guardrail violations, dead code, test quality, bad comments, optimizations, YAGNI/over-engineering, error handling, and design depth. Triggered by code-reviewer.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Code Review Taxonomy skill

What this skill tells your AI

The instructions your AI receives, as published by marconae/speq-skill in .claude/skills/speq-code-review/SKILL.md and read by ahel’s review.

Analyze each changed file for the categories below.

Non-goal: a deviation the brief notes as authorized by an active project hook (a skipped guardrail, a relaxed convention) is a settled, intentional choice. Do not raise it as a finding under any category.

1. Guardrail Violations

Per /speq-code-guardrails:

  • [TOO_MANY_ARGUMENTS]: more than 3 arguments
  • [SIDE_EFFECT]: function has side effects
  • [BOOLEAN_FLAG_PARAMETER]: boolean flag parameter
  • [MAGIC_NUMBER]: magic number without a named constant (standing in for a failure, it is [SENTINEL_ERROR_VALUE], not this tag)
  • [MISSING_DOC_COMMENT]: missing doc comment on a public interface
  • [INLINE_COMMENT]: inline comment present (TODOs and other work-tracking comments are [WORK_TRACKING_COMMENT], not this tag)
  • [SELECTOR_ARGUMENT]: an argument (of any type, not just boolean) that picks which branch a function takes
  • [OUTPUT_PARAMETER]: a value returned via a mutated argument instead of the return value
  • [MIXED_ABSTRACTION_LEVEL]: a function mixes high-level orchestration with low-level detail
  • [COMMAND_QUERY_MIX]: a single call both mutates something and hands back an answer
  • [WEASEL_NAME]: a name that states no responsibility (Manager, Processor, Handler, Data, Info, Util)
  • [IMPLEMENTATION_IN_NAME]: a name that bakes in a transport, vendor, or format instead of the abstraction

2. Dead Code

  • [UNUSED_FUNCTION]: unused function or method
  • [UNREACHABLE_CODE]: unreachable code path
  • [UNUSED_IMPORT]: import not used
  • [UNUSED_VARIABLE]: variable assigned but never read

3. Test Quality

Per /speq-code-guardrails' Tests section. Tests are quality subjects, not only removal candidates:

  • [OBSOLETE_TEST]: tests removed functionality
  • [DUPLICATE_TEST]: duplicate test coverage
  • [ASSERTION_FREE_TEST]: test always passes, no assertions
  • [VAGUE_TEST_NAME]: test name does not state the condition and expected behavior
  • [NONDETERMINISTIC_TEST]: test depends on real clock, network, filesystem, or unseeded randomness
  • [IMPLEMENTATION_COUPLED_TEST]: test asserts internal state instead of observable behavior
  • [UNTESTED_ERROR_PATH]: a failure path with no test
  • [MISSING_BOUNDARY_TEST]: no test for empty, single, maximum, off-by-one, or transition input
  • [SKIPPED_TEST]: test is skipped or ignored rather than fixed or deleted
  • [SUPPRESSED_WARNING]: a lint or compiler warning is silenced instead of resolved

4. Bad Comments

  • [REDUNDANT_COMMENT]: describes "what" not "why"
  • [OUTDATED_COMMENT]: does not match the code
  • [COMMENTED_OUT_CODE]: commented-out code block
  • [WORK_TRACKING_COMMENT]: TODO, FIXME, ticket refs

5. Optimization Opportunities

The Evidence Rule applies here: raise a finding in this category only with a measurement. Without one, the finding is [UNMEASURED_OPTIMIZATION] against the code that was optimized speculatively.

  • [PERFORMANCE_ISSUE]: obvious performance issue
  • [UNNECESSARY_ALLOCATION]: unnecessary allocation in a loop
  • [DUPLICATE_OPERATION]: operation that repeats work already done
  • [UNMEASURED_OPTIMIZATION]: a change justified as a performance optimization with no measurement behind it

6. YAGNI / Over-Engineering

Per /speq-code-guardrails's YAGNI Checks:

  • [STANDARD_LIBRARY_DUPLICATE]: logic that reimplements something the language's standard library already provides
  • [SHRINKABLE]: same logic expressible in meaningfully fewer lines
  • [DEAD_FLEXIBILITY]: a feature flag, extension point, or parameter that is never varied
  • [UNNEEDED_DEPENDENCY]: a dependency added for something the standard library or an already-installed dependency already covers
  • [SPECULATIVE_ABSTRACTION]: an interface, generic type, or configuration value with exactly one implementation or caller, and not a seam over I/O, nondeterminism, or a third party

7. Error Handling

  • [SENTINEL_ERROR_VALUE]: a magic value or in-band signal stands in for an error instead of the language's own error mechanism
  • [CONTEXTLESS_ERROR]: an error that does not state what was attempted, the input that failed, or the constraint violated
  • [SWALLOWED_ERROR]: an error is discarded instead of handled or propagated
  • [BROAD_CATCH]: a catch broader than the specific error it handles
  • [LEAKED_PROVIDER_ERROR]: a third-party error type crosses a module boundary unwrapped
  • [ERROR_AS_CONTROL_FLOW]: an error mechanism used for expected, non-exceptional flow

8. Design Depth

Per /speq-design-philosophy:

  • [SHALLOW_MODULE]: learning the interface takes almost as much effort as the implementation behind it would, or classitis (many small modules named for a role, not a responsibility; a purely naming defect with no structural symptom is [WEASEL_NAME], not this tag)
  • [INFORMATION_LEAKAGE]: a single design choice (a format, a protocol, an execution-order split) shows up in more than one module and would need editing in both if it changed
  • [TACTICAL_SHORTCUT]: a shortcut taken with no follow-up to invest in the design
  • [MISSING_DESIGN_INTENT]: a public/interface comment states purpose but not the design intent or rationale a non-obvious abstraction needs
  • [BOUNDARY_VIOLATION]: business logic names a delivery mechanism, storage engine, or framework directly
  • [IO_IN_BUSINESS_LOGIC]: I/O performed directly inside business logic instead of through an injected abstraction
  • [AMBIENT_STATE_READ]: environment or global state read in place instead of injected
  • [LEAKED_BOUNDARY_TYPE]: a framework, storage, or third-party type crosses a module boundary
  • [DEPENDENCY_CYCLE]: a cycle in the module dependency graph
  • [SELF_CONSTRUCTED_DEPENDENCY]: a module constructs its own concrete dependency instead of receiving it
  • [PROVIDER_SHAPED_ABSTRACTION]: an abstraction shaped around a provider's API instead of the consumer's own vocabulary
  • [FEATURE_ENVY]: a function reaches into another module's data more than its own

Output Format

Write the findings document to specs/_plans/<plan-name>/review-findings.md per references/review-findings-template.md. Then return exactly one line and nothing else:

CODE REVIEW: <n> findings — standard: <n>, expert: <n> — specs/_plans/<plan-name>/review-findings.md

Never return the findings as response text. The implementer agents read them from the file.

Each finding's Fix: field follows the template's rules: an imperative addressed to the consuming implementer agent, never an optional suggestion.

Routing

You partition the findings. The orchestrator never sees them individually. Place each finding under ## Standard fixes or ## Expert fixes in the findings document. The partition decides which single agent applies the whole fix pass: any Expert finding routes both sections to implementer-expert-agent. With no Expert finding, implementer-agent applies ## Standard fixes.

Every tag across all 8 categories is eligible for either section. Route a finding to ## Expert fixes when its fix has cross-file, concurrency, or subtle-correctness implications: removing a dependency or abstraction with several call sites, correcting a dependency-direction or boundary violation, or any change whose failure mode is a passing test over wrong behavior. Everything else goes to ## Standard fixes. You hold the context for this call. Decide it here, do not defer it.

Signals

GitHub stars
50
Forks
9
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
speq-code-review
Source
github.com/marconae/speq-skill