Standards Review

opus session

Quick reference

FieldValue
Command/brewcode:standards-review
Arguments[commit|branch|folder] [-p <prompt>]
Modelopus
Contextsession
ToolsRead, Glob, Grep, Task, Bash, Write, mcp__grepai__search, AskUserQuestion, Skill

Review priorities

PrioritySourceFocus
1Existing codeSearch FIRST, import instead of creating
2CLAUDE.mdProject standards, conventions, patterns
3rules/*.mdStrict rules with numbers — check ALL [avoid#N], [bp#N]
4references/{stack}.mdStack-specific guidelines from this skill

Phase 0: User confirmation

BEFORE any analysis, ask the user using AskUserQuestion tool:

“Run /simplify at the end for an additional review pass (efficiency, concurrency, hot-paths)? This will increase execution time.”

OptionValue
A”Yes - run /simplify after report”
B”No - standards review only”

Remember the answer. If “Yes” - execute Phase 7 after Phase 6. If “No” - stop after Phase 6.


Input

InputExampleAction
Empty/standards-reviewBranch vs main/master
Commitabc123Single commit
Foldersrc/main/java/...Folder contents

Arguments: $ARGUMENTS

Phase 1: Detect tech stack

Check project root for stack indicators:

Files presentStackReference
pom.xml, build.gradle, build.gradle.ktsJava/Kotlinreferences/java-kotlin.md
package.json with react/typescriptTypeScript/Reactreferences/typescript-react.md
pyproject.toml, setup.py, requirements.txtPythonreferences/python.md

ACTION: When stack confirmed — READ references/{stack}.md (relative to this skill directory) and use as expert guidelines.

Multi-stack: If multiple detected, read ALL matching references, process each separately.

Unknown stack: Use only project’s .claude/rules/ — skip stack reference.

Phase 2: Get files

Based on detected stack, use appropriate patterns:

StackPatternsCommand
Java/Kotlin*.java, *.ktgit diff --name-only ... -- '*.java' '*.kt'
TypeScript/React*.ts, *.tsx, *.js, *.jsxgit diff --name-only ... -- '*.ts' '*.tsx'
Python*.pygit diff --name-only ... -- '*.py'

Commands by input type:

# Commit
git diff --name-only {COMMIT}^..{COMMIT} -- {PATTERNS} | head -50

# Branch (auto-detect main/master)
MAIN=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main")
git diff --name-only ${MAIN}...HEAD -- {PATTERNS} | head -50

# Folder
find {FOLDER} -type f \( {FIND_PATTERNS} \) | head -50

Phase 3: Load context

SourceFilesCondition
Stack referencereferences/{stack}.mdBased on Phase 1 detection
Project rules.claude/rules/avoid.md, .claude/rules/best-practice.md, .claude/rules/*-avoid.md, .claude/rules/*-best-practice.md, .claude/rules/*.mdMay not exist
Project standardsCLAUDE.md, .claude/CLAUDE.mdMay not exist

Search-first protocol

Before reviewing code: identify new utilities/helpers/patterns/abstractions, then search via grepai_search, check common locations, and decide based on similarity.

Common locations by stack:

StackSearch paths
Java/Kotlin**/util/, **/common/, **/shared/, **/core/
TypeScript/React**/components/common/, **/shared/, **/hooks/, **/utils/
Python**/utils/, **/common/, **/lib/, **/helpers/

Similarity decision matrix:

SimilarityDecisionAction
90-100%REUSEImport existing
70-89%EXTENDAdd params/config to existing
50-69%CONSIDEREvaluate effort vs benefit
<50%KEEP_NEWJustified new code

Phase 4: Expert analysis

Step 4.1: Group files by type

From Phase 2 file list, group by pattern matching:

Java/Kotlin:

GroupPatternFocus
entities**/entity/*.java, **/model/*.ktEntity suffix, DI, Lombok
services**/service/*.java, **/service/*.ktStream API, constructor injection
tests**/*Test.java, **/*Test.ktAssertJ, BDD comments, no logs
buildpom.xml, build.gradle, build.gradle.ktsDependencies, plugins, versions

TypeScript/React:

GroupPatternFocus
styles**/styles.ts, **/*.styled.tsTheme tokens, no hardcoded colors
components**/*.tsxHooks, functional components
tests**/*.test.tsx, **/*.spec.tsJest patterns, coverage
buildpackage.json, tsconfig*.json, vite.config.*, webpack.config.*Dependencies, scripts, bundler config

Python:

GroupPatternFocus
modules**/*.py (non-test)Type hints, docstrings
tests**/test_*.py, **/*_test.pypytest patterns
configs**/config*.py, **/settings*.pyEnvironment handling
buildpyproject.toml, setup.py, setup.cfg, requirements*.txtDependencies, tool configs

Step 4.2: Spawn experts (haiku per group)

For each non-empty group, spawn parallel haiku agent:

Template:

Task(subagent_type="Explore", model="haiku", prompt="
## Standards Review - {EXPERT_TYPE}

**Stack:** {STACK}
**SEARCH-FIRST:** Use grepai_search for finding existing code before flagging duplicates.

**Files:** {FILE_LIST}

**Project Rules:**
{RULES_CONTENT}

**Stack Guidelines:**
{STACK_REFERENCE_CONTENT}

**Output JSON:**
{
  \"changes\": [{
    \"location\": \"file:15-20\",
    \"description\": \"...\",
    \"existing\": \"path/to/similar|null\",
    \"reuse\": \"REUSE|EXTEND|CONSIDER|KEEP_NEW\",
    \"rating\": \"good|warning|bad\"
  }],
  \"violations\": [{
    \"file\": \"path\",
    \"line\": 42,
    \"rule\": \"avoid#5|best-practice#3|stack:entity-suffix\",
    \"issue\": \"...\",
    \"fix\": \"...\",
    \"severity\": \"error|warning|info\"
  }]
}
")

Phase 5: Validation (sonnet)

Task(subagent_type="reviewer", model="sonnet", prompt="
Validate EACH finding from expert analysis.
Read actual code at file:line locations.
Verify rule actually applies in context.

**Findings:** {AGGREGATED_JSON}

**Output:** [
  {\"id\": \"1\", \"verdict\": \"CONFIRM|REJECT\", \"reason\": \"...\"}
]
")

Phase 6: Report

Create report directory

TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
REPORT_DIR=".claude/reports/${TIMESTAMP}_standards-review"
mkdir -p "${REPORT_DIR}"

REPORT.md structure

# Standards Review Report

**Generated:** {TIMESTAMP}
**Stack:** {DETECTED_STACK}
**Scope:** {INPUT_TYPE} - {INPUT_VALUE}
**Files Reviewed:** {COUNT}

## Summary

| Category | Count | Severity |
|----------|-------|----------|
| Violations | X | Y errors, Z warnings |
| Reuse Opportunities | X | - |
| Good Patterns | X | - |

## Violations

### Errors

| File | Line | Rule | Issue | Fix |
|------|------|------|-------|-----|
| path | 42 | avoid#5 | Description | Suggested fix |

### Warnings

| File | Line | Rule | Issue | Fix |
|------|------|------|-------|-----|

## Reuse Opportunities

| New Code | Existing | Similarity | Action |
|----------|----------|------------|--------|
| path:15-20 | util/X.java | 85% | EXTEND |

## Good Patterns Found

| File | Pattern | Description |
|------|---------|-------------|
| path | stream-api | Proper use of Stream API |

## Reuse Statistics

| Metric | Value |
|--------|-------|
| Total new code blocks | X |
| Reusable (>70%) | Y |
| Reuse rate | Z% |

## Legend

**Severity:** error (must fix), warning (should fix), info (consider)
**Reuse:** REUSE (import), EXTEND (modify existing), CONSIDER (evaluate), KEEP_NEW (justified)
**Rating:** good (exemplary), warning (suboptimal), bad (violation)

Phase 7: Simplify pass (conditional)

Execute ONLY if user answered “Yes” in Phase 0.

After Phase 6 report is written, invoke:

Skill(skill="simplify", args="{INPUT_VALUE}")

Where {INPUT_VALUE} is the same scope used in this review (commit, branch, or folder from Phase 2).

If user answered “No” in Phase 0 - skip this phase entirely.

Error handling

ConditionAction
No files foundExit: “No files to review for {SCOPE}“
>50 filesWarn user, suggest narrowing scope
Unknown stackContinue with project rules only
No rules foundContinue with stack reference only
All compliantReport: “All code compliant with standards”