用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/duc01226/EasyPlatform --skill review-changes命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | review-changes |
| version | 2.6.0 |
| description | [Code Quality] Use when reviewing current changes, staged or unstaged diffs, or branch-to-branch diffs. |
[BLOCKING] Execute skill steps in declared order. NEVER skip, reorder, or merge steps without explicit user approval. [BLOCKING] Before each step or sub-skill call, update task tracking: set
in_progresswhen step starts, setcompletedwhen step ends. [BLOCKING] Every completed/skipped step MUST include brief evidence or explicit skip reason. [BLOCKING] If Task tools are unavailable, create and maintain an equivalent step-by-step plan tracker with the same status transitions.
[TOP REMINDER — WHY-REVIEW FINDINGS-VALIDATION GATE IS NON-NEGOTIABLE]
If this review produces ANY finding (Critical / High / Medium / Low) in standalone mode, you MUST invoke the
/why-reviewskill through theSkilltool with--validate-findings <report-path>before any fix, docs-update, commit, or handoff. An actual skill call is the ONLY way to pass this gate — re-reading the citedfile:lines yourself, "self-validating," or any inline/manual substitute does NOT count.Create the todo the moment the first finding is recorded — never rely on memory: call
TaskCreate→[Review Phase 6] Why-review findings validation gate — invoke /why-reviewso the gate is tracked and cannot be skipped. Inside$workflow-review-changes, stop after the report; parent step 2 owns validation. Full protocol in Phase 6; mirrored in the Closing Reminders at the bottom.
Goal: Review current working-tree, staged, branch, or commit diffs across code, docs, config, infra, and non-code artifacts — finding correctness bugs, flaws, missing updates, stale docs, and convention drift with evidence — so every reviewed change is defect-free, evidence-backed, convention-aligned, and synchronized with required tests/docs before handoff; when code files changed, also prove the code stays easy to change.
Summary: read-this-if-nothing-else digest —
plans/reports/code-review-{date}-{slug}.md with file:line proof; speculation is forbidden, "looks fine" is not a verdict, codebase convention (grep 3+ examples) wins over textbook rules./why-review --validate-findings, an actual skill call) → fix (Phase 7) → restart /review-changes from Phase 0 over the full diff, looping until one whole pass has zero findings. Inside $workflow-review-changes you stop after the report and hand findings to the parent./code-simplifier (clarity/maintainability), Phase 3.7 /integration-test-review Gate-7 coverage (every behavior change → covering test + spec TC), and — for every behavior change — Spec Drift Adjudication + the Dual-Feedback Ledger (the gap feeds BOTH spec AND tests)./docs-update ALWAYS runs over the full changeset (deferred only to the parent inside the workflow).Routing boundary: This skill reviews a git diff — working-tree (default), staged, branch, or commit. For an explicit file-set or SHA-range review, processing received review feedback, or a pre-completion verification gate over already-known scope, use
code-reviewinstead.
Shared engine (keep in sync):
review-changesandcode-reviewshare the same review-protocolSYNC:blocks. Canonical source:.claude/skills/shared/sync-inline-versions.md; policy:SYNC:shared-protocol-duplication-policy. When you change a shared block in one skill, update the canonical file AND the sibling skill so the two never drift. The skills differ only in entry intent (diff vs explicit scope) and diff-specific gates (integration-test-sync, translation-sync, the Phase 3.7 integration-test-review coverage gate) — not in review quality.
Workflow:
/graph-blast-radius skill FIRST (if .code-graph/graph.db exists)/code-simplifier scoped to the changed code files to surface clarity/consistency/maintainability simplifications; record them as findings that flow into the same validation/fix loop (skip docs-only diffs)/integration-test-review over the full diff; its 7 quality gates audit changed tests AND its Gate 7 (Change Coverage) maps every behavior-changing production file to a covering test (integration-first; unit fallback needs justification) and a spec TC. GAP/SPEC-GAP results become findings for the same validation/fix loop (skip docs-only diffs; deferred to the parent's dedicated step inside $workflow-review-changes)/why-review skill (an actual Skill-tool call) with --validate-findings to verify every finding is correct, proof-backed, reasonable, and best-practice before fixing. This is a genuine skill invocation — re-reading the cited lines yourself, "self-validating," or any inline/manual substitute does NOT satisfy this gate. When this skill is step 1 inside $workflow-review-changes, stop after the report; parent step 2 owns findings validation.Key Rules:
plans/reports/code-review-{date}-{slug}.mdfile:line proof/code-simplifier optimization gate over the changed code files — its simplification opportunities are findings that flow through the same Phase 6 validation → Phase 7 fix loop (never auto-applied unvalidated)/integration-test-review coverage gate over the full diff — every behavior change must map to a covering test (integration-first) and a spec TC; GAP/SPEC-GAP verdicts are findings for the same Phase 6 → Phase 7 loop, never silently logged/docs-update sweep over the full changeset — unconditional, never skipped on a clean verdict — why: a clean code review still leaves docs stale unless docs-update reconciles them against the actual changes/review-changes from Phase 0 and review the full updated diff, including the fixesMANDATORY Plan ToDo Task to discover and READ project-specific reference docs:
- Search for code standards docs:
*code-review*,*patterns*,*conventions*,*style-guide*— read any found- Search for architecture docs:
*architecture*,*adr-*,README.mdat service/module roots- Look for docs referencing changed technology areas (backend, frontend, infra, etc.)
- Read docs most relevant to the categories of files changed
Prerequisites: MUST ATTENTION READ before executing:
Critical Purpose: Ensure quality — no flaws, no bugs, no missing updates, no stale content. Verify both artifacts AND documentation.
External Memory: For complex or lengthy work (research, analysis, scan, review), write intermediate findings and final results to a report file in
plans/reports/— prevents context loss and serves as deliverable.
Evidence Gate: MANDATORY — every claim, finding, and recommendation requires
file:lineproof or traced evidence with confidence percentage (>80% to act, <80% must verify first).
OOP & DRY Enforcement: MANDATORY — flag duplicated patterns that should be extracted to a base class, generic, or helper. Classes in the same group or suffix MUST ATTENTION inherit a common base (even if empty now — enables future shared logic and child overrides). Verify project has code linting/analyzer configured for the stack.
Review current changes or explicit branch/commit diffs against project standards.
Target: current working-tree changes by default; explicit branch/tag/commit diff when user asks branch comparison.
Use these sources:
git status, git diff, and git diff --cachedgit diff <base>...<head> plus git diff --name-only <base>...<head>git diff <base>..<head> plus git diff --name-only <base>..<head>Be skeptical. Apply critical thinking, sequential thinking. Every claim needs traced proof, confidence >80%.
file:line evidence (grep results, read confirmations)Apply this gate when diff includes source-code or code-adjacent files
(.cs, .ts, .html, .scss, .css, tests, scripts, build/config-as-code).
Pure docs-only changes skip this gate except for executable examples or code
snippets.
Success metric: future change cost. DRY, SRP, abstraction, design patterns, naming, layering, tests — all serve one goal: make next change cheaper.
When evaluating code, refactor, test, or abstraction, ask: does this make next change cheaper or more expensive?
Apply this lens before specific rules, patterns, or checklists below. If downstream rule raises change cost, this principle wins.
YAGNI — Flag code solving hypothetical future problems (unused parameters, speculative interfaces, premature abstractions)
KISS — Flag unnecessarily complex solutions. "Is there a simpler way meeting same requirement?"
DRY — Actively grep for similar/duplicate code before accepting new code. 3+ similar patterns → flag for extraction.
Clean Code — Readable > clever. Names reveal intent. Functions do one thing. No deep nesting.
Follow Convention — Before flagging ANY pattern violation, grep for 3+ existing examples. Codebase convention wins over textbook rules.
No Flaws/No Bugs — Trace logic paths. Verify edge cases (null, empty, boundary values). Check error handling covers failure modes.
Proof Required — Every claim backed by file:line evidence or grep results. Speculation FORBIDDEN.
Doc Staleness — Cross-reference changed files against related docs (feature docs, test specs, READMEs). Flag stale or missing updates.
Run
python .claude/scripts/code_graph batch-query <f1> <f2> --jsonon changed files for test coverage and caller impact.
IMPORTANT MANDATORY MUST ATTENTION: FIRST action in every review. Call
/graph-blast-radiusBEFORE any other review work.
If .code-graph/graph.db exists, run graph-blast-radius analysis before reviewing changes:
/graph-blast-radius skill (runs python .claude/scripts/code_graph blast-radius --json)For each changed file, trace full impact:
python .claude/scripts/code_graph trace <changed-file> --direction downstream --json — all files affected by changesMANDATORY FIRST: Create Todo Tasks for Review Phases Before starting, call TaskCreate with:
[Review Phase 0] Run /graph-blast-radius to analyze change impact - in_progress (MUST ATTENTION BE FIRST)[Review Phase 0.3] Detect high-risk change types, create risk tasks - pending[Review Phase 0.7] Categorize changed files, create dimension review tasks - pending[Review Phase 0.5] Plan compliance check (skip if no active plan) - pending[Review Phase 1] Get changes and create report file - pending[Review Phase 2] Review file-by-file and update report - pending[Review Phase 3] Evaluate fresh-context gate; skip when findings already exist - pending[Review Phase 3.5] Run /code-simplifier on changed code files to optimize code quality - pending (MANDATORY when code files changed; skip docs-only diffs)[Review Phase 3.7] Run /integration-test-review coverage gate over full diff - pending (MANDATORY when behavior-bearing code changed; skip docs-only diffs; deferred to parent step inside $workflow-review-changes)[Review Phase 4] Generate final review findings - pending[Review Phase 5] Record stale-doc findings for validation/fix loop - pending[Review Phase 6] Why-review findings validation gate before any fix - pending (MANDATORY when findings exist)[Review Phase 7] Auto-fix validated findings and restart /review-changes from Phase 0 - pending (MANDATORY when validated findings remain)[Review Phase 8] Run /docs-update over full changeset to sync all impacted docs - pending Update todo status as each phase completes.
Note: If Phase 1 reveals 10+ changed files, replace Phase 2-4 tasks with Systematic Review Protocol tasks:
[Review Phase 2] Categorize and fire parallel sub-agents,[Review Phase 3] Synchronize and cross-reference,[Review Phase 3.5] Run /code-simplifier on changed code files,[Review Phase 3.7] Run /integration-test-review coverage gate,[Review Phase 4] Generate consolidated report
Phase 0: Run Graph Blast Radius Analysis (MANDATORY FIRST STEP)
IMPORTANT MANDATORY MUST ATTENTION: FIRST action before ANY other review work.
/graph-blast-radius skill.code-graph/graph.db does not exist, note "Graph not available — skipping blast radius" and proceed to Phase 0.3Phase 0.3: Change Type Detection + Risk Tasks (MANDATORY)
Purpose: Identify HIGH-RISK change types in this diff before dimensional review. Each detected type creates a focused risk task. Change types are ORTHOGONAL to file category: the same file can be both a migration AND a security change — detect all independently.
Step 1: Detect change types
git diff --name-only HEAD # unstaged
git diff --cached --name-only # staged
# For branch or commit-range review, use the user-provided diff source:
git diff --name-only <base>...<head>
Evaluate each change type for this diff:
| Change Type | Detection Signal (adapt to project's actual conventions) | TRUE if... |
|---|---|---|
| DepUpgrade | Dependency manifest changed (package.json, *.csproj, Gemfile, go.mod, requirements.txt, Cargo.toml, pom.xml, etc.) | A version number changed in any dependency manifest |
| Migration | File path or name suggests schema change (contains migration, schema, alter_table, or matches project's migration convention) | Any migration-convention file appears in the diff |
| BusEvent | New or modified event/message definition or consumer (infer from project conventions: consumer naming, message type directories) | A consumer or event class is new or its contract changed |
| ApiContract | API definition file changed (controller, route handler, OpenAPI/GraphQL schema) with route or field differences | Diff shows route/action/field additions or removals |
| SecurityChange | Auth/permission definition changed — infer from project conventions (auth middleware, permission constants, policy definitions) | Any auth or permission gate is added, removed, or changed |
| ConfigChange | Configuration files changed (e.g., *.json, *.yaml, *.env*, *Config*, *Options*, *Settings*, *.toml) | Any config-convention file appears |
| InfraChange | Infrastructure definition changed (Dockerfile, docker-compose*.yml, CI/CD pipelines, k8s manifests, IaC files) | Any infra-convention file appears |
Record in report:
## Change Type Analysis
DepUpgrade: [YES/NO] | Migration: [YES/NO] | BusEvent: [YES/NO]
ApiContract: [YES/NO] | SecurityChange: [YES/NO] | ConfigChange: [YES/NO] | InfraChange: [YES/NO]
Step 2: Create change-type risk tasks (ALWAYS before any review work)
MANDATORY: Call
TaskCreatefor each TRUE signal. Do NOT create tasks for FALSE signals. The concerns listed are starting points — apply domain knowledge beyond them.
| Condition | TaskCreate subject | Key concerns to investigate (starting points — expand with domain knowledge) |
|---|---|---|
| DepUpgrade TRUE | [Review-DepUpgrade] Dependency upgrade — semver, breaking changes, security advisories | Major/minor/patch? Read upstream CHANGELOG for breaking API changes. Grep deprecated API usage. Check transitive dependency changes. Known security advisories for new version? Peer dependency compatibility? Tests still passing? |
| Migration TRUE | [Review-Migration] DB migration — rollback path, volume impact, zero-downtime | Rollback/Down script exists? Table size estimate — large tables need lock analysis. NOT NULL column without default on non-empty table? Indexes created with no-lock option? Deployment ordering (before/after service deploy)? Backfill idempotent if run twice? |
| BusEvent TRUE | [Review-BusEvent] Cross-service event/message — consumer, idempotency, retry, poison pill | Consumer exists for new event? Retry strategy: prerequisite data not synced → wait-retry vs silent skip? Handler safe to run twice (idempotency)? Malformed message handling / dead-letter configured? Ordering assumptions vs broker guarantees? |
| ApiContract TRUE | [Review-ApiContract] API contract change — backward compat, client alignment, auth | Additive or breaking? Breaking → versioning or coordinated deploy required. All callers (UI, other services, tests) still compatible? New endpoint protected appropriately? No required response fields added without client update? |
| SecurityChange TRUE | [Review-SecurityChange] Security/permission change — all paths covered, no privilege escalation | All code paths reaching the gate covered? Negative test verifying unauthorized access DENIED? Privilege escalation possible? BOTH enforcement AND display control updated? Permission definition in single authoritative place (no duplicated strings risking drift)? |
| ConfigChange TRUE | [Review-ConfigChange] Config/env change — all environments, no secrets committed | New config key present in ALL environment configs? Hardcoded default masking missing production config? Any secret value in the diff? → CRITICAL if yes. Documented in setup guide? App fails fast if config missing? |
| InfraChange TRUE | [Review-InfraChange] Infrastructure change — env parity, no dev values in prod, reproducible build | Change affects all environments consistently? Hardcoded dev values (localhost, debug flags, dev credentials)? Pinned image/dependency versions? Local dev impact documented? CI/CD secret/permission requirements documented? |
AI-SDD risk lenses: Apply these lenses when the changed files touch specs, workflows, tooling, or shared guidance.
| Lens | Review focus |
|---|---|
| Contract/API/routes | Public behavior, clients, generated specs, and regression tests still agree. |
| Permissions/security-review | Enforcement, display controls, negative tests, and authoritative permission definitions align. |
| Config/flags | All environments, examples, fail-fast behavior, and docs are current. |
| Docs/spec/test drift | Canonical specs, Section 8 TCs, dashboards, and test code are synchronized or explicitly N/A. |
| Generated mirrors | Shared skill/workflow/tooling changes were synced to generated agent surfaces. |
| Reference-only artifacts | AI-extracted specs/TCs remain draft/reference until accepted by the owning review gate. |
Step 3: Work through change-type tasks before dimensional review
For each created change-type task:
in_progressfile:line for PASS or describe finding for FAIL/WARN## {Task Subject} Findings in reportcompletedIMPORTANT: Complete ALL change-type tasks FIRST, then proceed to Phase 0.7. If no change-type signals detected, log
"No high-risk change types detected"and proceed.
Phase 0.7: Change Surface Detection + Dynamic Review Tasks (MANDATORY)
Purpose: Let AI categorize the changes by nature and create review tasks accordingly. Derive categories from what the project's actual changed files are, never assume a fixed set. Think, don't classify into a preset grid. The AI owns this step entirely.
Step 1: Derive categories from the diff
git diff --name-only HEAD # unstaged
git diff --cached --name-only # staged
# For branch or commit-range review, use the user-provided diff source:
git diff --name-only <base>...<head>
For each changed file, infer its category by examining:
Do NOT map to fixed buckets. Derive categories that fit the current repository's actual structure and vocabulary.
Common category types to consider as starting points (not exhaustive — derive what fits):
Record in report:
## Change Surface
{Category name} ({category type}): {N} files
{Category name} ({category type}): {M} files
...
Step 2: For each category, enumerate concerns and create a task
This is where you THINK, not fill in blanks. Apply
SYNC:category-review-thinkingfor each category.
For EACH identified category:
TaskCreate task named [Review-{Category}] {brief concern summary} listing derived concernsALWAYS create:
[Review-General]— universal quality: correctness, YAGNI/KISS/DRY, doc staleness, test coverage. Runs across ALL changed files regardless of other categories.
Sub-Agent Type Selection:
| Category Nature | subagent_type |
|---|---|
| Code logic (any stack) | code-reviewer |
| Implements a documented spec/PBI | spec-compliance-reviewer (pre-pass, before code-reviewer) |
| Security, auth, permissions | security-auditor |
| Performance, query efficiency, latency | performance-optimizer |
| Documentation, plans, specs, ADRs | general-purpose |
| Infrastructure, CI/CD, config | general-purpose |
| Mixed or default | code-reviewer |
Spec-compliance pre-pass (when the changeset implements a documented
docs/specs/**capability or a PBI/story): spawnspec-compliance-reviewerFIRST — it verifies the implementation matches the spec (catches spec drift, missing requirements, extra features) BEFORE thecode-reviewerquality pass runs. Skip when no spec/PBI governs the change (thencode-revieweris the sole code pass). This is the one wired dispatch site forspec-compliance-reviewer(sub-agent-selection-guide.md"Spec compliance" row).
UI/frontend dimension (OWNED by this skill): When a Client-side logic or Styles/Assets category surfaces frontend files matching the project's configured frontend/UI file patterns,
/review-changesowns the UI review and invokes/review-uias its UI dimension — preferably as a dedicatedui-ux-designersub-agent spawned in the same parallel batch as the other dimensional agents (inline-fold its checklist only when sub-agent spawning is unavailable). The checklist: long-content overflow (wrap vs ellipsis+tooltip), responsive multi-screen via flex, flex-grow vs fixed sizing (prefer min/max + flex over fixed px), z-index scale discipline (no raw numbers, no!important), and SCSS/BEM quality. This is the SAME behavior in both standalone and workflow contexts —/review-uiis NOT a separate workflow step; it always runs here. Skip entirely if no frontend files changed.
Step 3: Work through tasks in order
For each created task:
in_progress before startingSYNC:category-review-thinking — trust your domain knowledge beyond the examples there## {Task Subject} Findings sectioncompleted before starting next taskNEVER mark a dimension task completed by scanning. Work through each relevant file explicitly. For large categories (10+ files): escalate to a parallel sub-agent using the Systematic Review Protocol.
Phase 0.5: Plan Compliance Check (CONDITIONAL — only when active plan exists)
Check ## Plan Context in injected context:
{plan-path}/plan.md — get phase list and scopePhase 1: Get Changes and Create Report File (MUST ATTENTION)
git status for current changes, or git diff --name-only <base>...<head> for branch comparisonsgit diff or git diff <base>...<head> to see actual changesplans/reports/code-review-{date}-{slug}.mdPhase 2: File-by-File Review (Build Report Incrementally)
For EACH changed file, read and immediately update report with:
Phase 3: Fresh-Context Gate (Conditional Protocol — branch on findings and Phase 0.7 surface)
Protocol:
SYNC:double-round-trip-review+SYNC:fresh-context-review+SYNC:review-protocol-injection(all inlined above). INVARIANT: Phase 3 is review-only. It may add findings, but it MUST NOT fix or validate them. Existing findings do not require a fresh-context re-review; any non-zero finding set flows to Phase 6 why-review validation, then Phase 7 auto-fix + full/review-changesrestart from Phase 0. A Phase 7 restart alone is NOT a Phase 3 trigger.
Entry gate:
Skipped fresh-context pass because findings already exist; Phase 6 why-review validation is the required next gate. Then proceed to Phase 4 consolidation and Phase 6 validation.Skipped fresh-context pass because the current review is clean and no second-round trigger exists. Then proceed to Phase 4 finalization.Anti-waste rule: Do not run Phase 3 to re-review known findings before Phase 6. Do not run Phase 3 solely because Phase 7 restarted the review after fixes. The restarted review is already the required full pass; if it has zero findings and no explicit trigger above, finalize cleanly.
If the entry gate allows Phase 3, check categories from Phase 0.7 — if multiple distinct domains changed (e.g., server-side + client-side), run Synthesis Mode. Otherwise run Holistic Mode.
[SYNTHESIS MODE — when multiple distinct domains changed]
Spawn a Synthesis Agent as Round 2. Purpose: catch cross-boundary issues individual dimensional tasks cannot see.
When constructing Agent call prompt:
Copy Agent call shape from SYNC:review-protocol-injection template verbatim, subagent_type: "code-reviewer"
Embed all 11 universal SYNC blocks verbatim
Set Task as:
Synthesis review — cross-boundary concerns ONLY across the changed domains in this diff.
You have these dimensional findings as context: {summary from each dimensional task}.
Re-read ALL changed files from scratch via your own tool calls.
Focus ONLY on cross-boundary concerns — do NOT re-review each domain's internals:
1. Contract Alignment: Do callers match what callees expose? (routes, parameters, field names, types)
2. Data Consistency: Are field names/types consistent across layer boundaries?
3. Security Boundary: Is auth enforced on BOTH sides (enforcement AND display control)?
4. Cross-Layer Naming: Same concept named differently across layers?
5. Missing Wiring: New producer with no consumer? New consumer with no producer? New feature with no doc?
6. Documentation: Docs reflect changes in BOTH domains together?
Set Target Files as "use the selected diff source from Phase 1"
Set report path as plans/reports/synthesis-review-{date}.md
After sub-agent returns:
## Synthesis Round Findings in main report — DO NOT filter or override[HOLISTIC MODE — when single domain changed]
No cross-boundary synthesis needed. Spawn standard holistic Round 2.
When constructing Agent call prompt:
SYNC:review-protocol-injection template verbatimsubagent_type based on domain's dominant concern (see Sub-Agent Type Selection)"Review the selected diff holistically. Focus on big picture — overall technical approach coherence, architecture layers, logic placement (lowest layer), DRY violations, YAGNI/KISS, function complexity. Domain: {category from Phase 0.7} — apply domain knowledge for this category accordingly.""use the selected diff source from Phase 1"plans/reports/code-review-changes-round{N}-{date}.mdAfter sub-agent returns:
## Round {N} Findings (Fresh Sub-Agent) in main report — DO NOT filter or overrideThe following checks are handled by sub-agent but can be verified in Phase 4:
Clean Code & Over-engineering Checks:
Documentation Staleness Check (REQUIRED):
For each changed file, identify related documentation:
/docs-update or applies doc edits.Spec Drift Adjudication (REQUIRED when behavior changed): Apply SYNC:spec-drift-adjudication. For every behavior-bearing change, compare it against the canonical Feature Spec under docs/specs/ and classify any divergence as CODE-WRONG (change violates an intended spec rule/AC/invariant → BLOCKING finding, fix code/test), SPEC-STALE (intentional behavior change the spec no longer reflects → route to /spec [update] + /spec [mode=tests] [update]), AMBIGUOUS (AskUserQuestion before editing either side), or SPEC-SILENT (code correctly enforces an invariant no spec artifact states → ENRICH: add the §4 BR/§3 AC + a §8 TC via /spec [update] + /spec [mode=tests], then a guarding test). Record the verdict per changed behavior (Spec in sync when no divergence). Do not normalize drift just because code/tests pass. This is the bidirectional generalization of the post-bugfix "Was spec wrong?" check — it runs for ALL behavior-changing reviews, not only post-bugfix. Flag findings here; Phase 6 validates and Phase 7 fixes (CODE-WRONG fixes route through the fix loop; SPEC-STALE and SPEC-SILENT fixes route to the canonical spec updater before /docs-update).
Correctness & Bug Detection: Apply SYNC:bug-detection — null safety, boundaries, error handling, resource cleanup, concurrency.
Test Spec Verification: Apply SYNC:test-spec-verification — locate specs, verify coverage, flag gaps.
Integration Test Sync: Apply SYNC:integration-test-sync-check — surface missing tests via AskUserQuestion.
Translation Sync: Apply SYNC:translation-sync-check — for multilingual UI text changes, require translation updates or explicit user risk acceptance.
Phase 3.5: Code-Simplifier Quality Optimization (MANDATORY when code files changed)
Purpose: A correctness review proves the change WORKS; this gate proves the changed code stays easy to read, consistent, and cheap to change. Bug-finding (Phases 2-3) and simplification optimization are different lenses — run both.
/code-simplifieris the canonical owner of clarity/consistency/maintainability refinement, so this skill delegates to it rather than duplicating that logic.
Entry gate:
.cs, .ts, .tsx, .html, .scss, .css, tests, scripts, build/config-as-code).Skipped Phase 3.5 — no code files in diff.Protocol:
[Review Phase 3.5] task to in_progress./code-simplifier scoped to the changed code files only (pass the Phase 1 diff source — working-tree, staged, branch, or commit range — so it refines the related changed files, NOT the whole codebase). Direct it to surface reuse, DRY, KISS/YAGNI, naming, dead-code, altitude/layer-placement, and readability simplifications./code-simplifier runs in report mode: integrate its recommendations into the main report under ## Code-Simplifier Optimization Findings with file:line evidence and a one-line rationale each. These are findings, not edits.[Review Phase 3.5] task to completed.Pipeline integration: Phase 3.5 findings are ordinary findings — they consolidate in Phase 4, are validated in Phase 6 (/why-review --validate-findings filters false-positive or change-cost-raising simplifications), and only validated ones are fixed in Phase 7. NEVER let /code-simplifier mutate the working tree before Phase 6 validates its suggestions.
Parent workflow boundary: When this skill is invoked as step 1 inside $workflow-review-changes, still run Phase 3.5 (it is a review dimension, producing findings for the report) but do NOT fix here — the parent workflow's /code-simplifier self-review and /feature-implement fix cycle own application. Record the findings and hand the report to parent step 2.
Phase 3.7: Integration-Test-Review Coverage Gate (MANDATORY when behavior-bearing code changed)
Purpose: Phases 2-3 prove the change is correct as written; this gate proves the change is covered and specced.
/integration-test-reviewis the canonical owner of the 7-gate test-quality audit — its Gate 7 (Change Coverage) maps every behavior-changing production file in the diff to a covering test (integration-first; unit fallback needs explicit justification) AND a spec TC. This skill delegates to it rather than duplicating that logic.SYNC:integration-test-sync-checkstays as the lightweight file-pairing check; this gate goes deeper — assertion quality, data-state verification, repeatability, and bidirectional spec↔test↔code alignment over the full change set.
Entry gate:
Skipped Phase 3.7 — no behavior-bearing code in diff.Protocol:
[Review Phase 3.7] task to in_progress./integration-test-review scoped to the Phase 1 diff source (working-tree, staged, branch, or commit range) so it audits the FULL change set — changed production code AND changed test files, never just the test files. It runs all 7 quality gates, builds the Gate 7 Coverage Mapping Table, and cross-checks spec TCs in both directions.## Integration-Test-Review Findings: per-gate verdicts, the Coverage Mapping Table, and every GAP / SPEC-GAP / unjustified COVERED-UNIT as a finding (GAP = HIGH severity minimum; CRITICAL for auth/money/data-integrity paths).[Review Phase 3.7] task to completed.Pipeline integration: Phase 3.7 findings are ordinary findings — consolidated in Phase 4, validated in Phase 6, fixed in Phase 7. GAP fixes WRITE the missing test via /integration-test; SPEC-GAP fixes run /spec [mode=tests] [update]. The Phase 7 restart then re-audits coverage over the full updated diff, including the new tests.
Parent workflow boundary: When this skill is invoked as step 1 inside $workflow-review-changes, do NOT run Phase 3.7 locally — the parent workflow's dedicated /integration-test-review step owns the 7-gate audit and coverage mapping. Record Phase 3.7 deferred to parent workflow /integration-test-review step. (SYNC:integration-test-sync-check still applies locally as the lightweight pairing check.)
Phase 4: Generate Final Review Result
Update report with final sections (MUST ATTENTION — include every section below):
Spec in sync, with the routed fix; or "No behavior change — N/A")Dual-Feedback Ledger (REQUIRED for every behavior-changing finding). A behavior gap must feed back into BOTH the spec AND the tests — not merely fix the code. The Spec Drift Adjudication row above and the Phase 3.7 Gate 7 coverage row each cover only ONE axis; this ledger unifies them into a single "update BOTH" assertion so neither is silently skipped. For each behavior-changing finding, emit one row with two cells:
Finding ( file:line)Spec feedback Test feedback {cite}{the §8 spec/Feature-Spec update needed — e.g. /spec [update] then /spec [mode=tests], OR N/A-because-CODE-WRONG-spec-already-correct}{the TC/regression test needed — e.g. new §8 regression TC via /spec [mode=tests], or covering integration test via /integration-test}
- A blank cell on EITHER axis = FAIL. "N/A" alone is not allowed — every N/A must carry its reason inline (e.g.
N/A — CODE-WRONG: canonical spec already describes the correct behavior, so no spec edit; only the regression TC is owed).- CODE-WRONG finding → Spec feedback is typically
N/A — spec correct, Test feedback is REQUIRED (regression TC first, perSYNC:spec-drift-adjudication).- SPEC-STALE finding → BOTH cells are non-N/A: Spec feedback =
/spec [update]then/spec [mode=tests]; Test feedback = the new/updated TC + guarding test.- SPEC-SILENT finding (code correctly enforces an invariant the spec never states) → BOTH cells are non-N/A: Spec feedback = add the missing §4 BR / §3 AC (+ §5 invariant if applicable) and a §8 TC via
/spec [update]+/spec [mode=tests]; Test feedback = the new property/regression test guarding the now-written invariant. The highest-value capture — never leave a discovered invariant only in code or only in tests.- Covered-but-stale TC (Gate 7 SPEC-GAP routed by
/integration-test-review— its Gate 7 classifies a TC that exists but no longer describes current behavior as a SPEC-GAP, not a satisfied coverage row): Spec feedback = correct the stale §8 TC via/spec [mode=tests] [update]; Test feedback = update the guarding test to the corrected TC.- This ledger is itself an ordinary finding set: it consolidates here (Phase 4), is validated in Phase 6 (
/why-review --validate-findingsconfirms BOTH axes are present for each behavior change), and its owed spec/test actions are applied in Phase 7. A ledger row with a blank axis that survives to Phase 7 = the review is INCOMPLETE.
If Documentation Staleness Check in Phase 4 identified stale docs:
/docs-update yet; stale-doc findings are fixed in Phase 7 only after /why-review --validate-findings returns CLEAN for them/review-changes invocation must re-review the updated docs from Phase 0Phase 5 triages only the docs the review FLAGGED. Regardless of whether anything is flagged here, the mandatory Phase 8 final
/docs-updategate still runs once the review converges clean — it independently detects impacted docs this triage may have missed. Phase 5 is conditional; Phase 8 is unconditional.
Before approving, verify artifacts are easy to read, maintain, understand:
docs/project-config.json or equivalent)orderRecords not data)isActive, hasPermission, canEdit)file:line showing existing pattern)For bugfix, failed-verification, stale/incorrect final output, regression, or behavior-changing fixes, FAIL review if any required proof is missing:
Debugger Trace: End -> Start names the observed final state and final reader/query/renderer/assertionSYNC:spec-drift-adjudication): for every behavior-changing file, decide whether a divergence from the canonical Feature Spec is CODE-WRONG (change is the defect — BLOCKING, fix code/test), SPEC-STALE (change is intended — update spec via /spec [update] first), AMBIGUOUS (intended behavior unclear — AskUserQuestion before editing either side), or SPEC-SILENT (code correctly enforces an invariant no spec artifact states — enrich: add §4 BR/§3 AC + §8 TC + guarding test). Do not flag a divergence as a one-directional "stale doc" without naming which side is canonical. Unadjudicated behavior-vs-spec divergence is a FAIL; an unwritten-but-enforced invariant left uncaptured is equally a FAIL.Contract: See
.claude/skills/shared/sdd-artifact-contract.md→ "AI-SDD Mandates (M1-M6)". This review enforces M6 for any spec/feature-doc/PBI/story/test-spec touched by — or supposed to be synced by — this change. Frame each check as: did this change introduce M1/M2 prose leakage, break a logical-ID mapping (M3), or create AC/expected-result ambiguity (M4)? A FAIL must name the violated mandate ID and cite the changed file + line. Passing an introduced M1-M5 violation makes this review itself defective.Carriers are EXEMPT from M1/M2 — source identifiers stay CORRECT inside
[Source: ...],**Evidence**,**IntegrationTest**fields, YAML frontmatter, and```mermaid ```blocks. Only flag leakage in spec/doc narrative prose. Banned prose token list:docs/project-reference/spec-principles.md§3.2. Scope this gate to changed artifact files (docs/specs/**, PBI/story/test-spec files in the diff); SKIP with a one-line note when the diff touches no such artifact.
spec-principles.md §3.2). Cite the changed file + line + token.FR-/BR-/OP-/TC-), strips a logical ID, demotes it below the [Source:] evidence, writes physical code coordinates or repository-root paths instead of a stack-portable abstract anchor ([Source: namespace/service/id]), OR drops the [Source:] abstract-anchor evidence (evidence is REQUIRED and KEPT — SECONDARY to the logical ID; a code move alone does NOT change the anchor — physical coords live only in the provenance sidecar).If ANY item fails → the verdict is FAIL; list each violated mandate ID with its changed-file/line citation in the Critical Issues or High Priority section.
Provide feedback in this format:
Summary: Brief overall assessment
Critical Issues: (Must fix before commit)
High Priority: (Should fix)
Suggestions: (Nice to have)
Documentation Staleness: (Docs that may need updating)
No doc updates needed — if no changed file maps to a docSpec Drift Adjudication: (Behavior-changing changes only — per SYNC:spec-drift-adjudication)
<behavior/file> → CODE-WRONG | SPEC-STALE | AMBIGUOUS | SPEC-SILENT — verdict + routed fix (/spec [update], regression TC, AskUserQuestion, or enrich-spec: add §4 BR/§3 AC + §8 TC + guarding test)Spec in sync — if changed behavior matches the canonical Feature SpecNo behavior change — N/A — if the diff is docs/tooling/style onlyDebugger Trace Gaps: (Bugfix/behavior-changing changes only)
Trace complete — if the required trace, feeder paths, hypothesis matrix, owner, and forward proof are presentGoal Satisfaction: (MANDATORY before any PASS verdict — resolve the active Goal Contract per the goal-contract-satisfaction-loop protocol: active plan goal.md → plans/goals/{YYMMDD-HHmm}-{slug}/goal.md; if none exists, record No active goal — skipped: {one-line reason})
| Success Criterion | Evidence | Status |
|---|---|---|
| {saved criterion} | {file:line, command output, report path} | PASS/FAIL/BLOCKED |
Positive Notes:
Suggested Commit Message:
type(scope): description
- Detail 1
- Detail 2
When Phase 1 finds 10+ changed files, apply the Systematic Review Batching protocol (map-reduce: size-capped batches + hierarchical synthesis) defined below.
MANDATORY — NO EXCEPTIONS: If NOT already in a workflow, MUST use
AskUserQuestionto ask user. Do NOT judge task complexity or decide "simple enough to skip" — user decides, not you:
- Activate
workflow-review-changesworkflow (Recommended) — run the canonical workflow from.claude/workflows.json; it sequences this skill, findings validation, parallel reviewers,code-simplifierself-review, fix-plan cycle, full re-review restart, docs, and handoff.- Execute
/review-changesdirectly — run this skill standalone
For each changed file, verify no import from forbidden layer:
docs/project-config.json → architectureRules.layerBoundariespaths glob patternscannotImportFrom, it is a violationarchitectureRules.excludePatterns"BLOCKED: {layer} layer file {filePath} imports from {forbiddenLayer} layer ({importStatement})"If architectureRules not present in project-config.json, skip silently.
Purpose: Validate own findings BEFORE any fix. Verify EVERY finding is correct, proof-backed (
file:line), reasonable, and convention-aligned. Catch false positives, inflated severity, and missed improvements before code/doc edits.
MANDATORY: REQUIRED todo task whenever findings exist. Register via
TaskCreateas[Review Phase 6] Why-review findings validation gate(already in Phase task list above). Do NOT fix, docs-update, commit, or hand off until this gate passes CLEAN or reaches an explicit blocked state.
Trigger: Any finding produced (Critical, High, Medium, OR Low). Skip ONLY when report verdict is unconditional PASS with literally zero findings.
UNCONDITIONAL INVOCATION: If even one finding exists, the
/why-reviewskill MUST be invoked via theSkilltool before any fix, docs-update, commit, or handoff. There is NO inline alternative — manually re-reading the citedfile:lines, re-tracing in your head, or declaring the findings "already validated" does NOT count. The only way to pass this gate is an actual/why-review --validate-findingsskill call that returns a verdict.
Parent workflow boundary: When this skill is invoked as step 1 inside $workflow-review-changes, do NOT run this Phase 6 locally. Stop after the review report and hand it to parent workflow step 2; the parent runs /why-review --validate-findings before any parallel reviewers or fixes.
Protocol (capped re-do loop):
plans/reports/{skill}-{date}-{slug}.md/why-review skill via the Skill tool (terminal --validate-findings mode — runs in the SAME main-agent session, never spawns a sub-agent, never recurses). "Same session" means the why-review skill executes in this conversation — it does NOT mean you may substitute your own inline re-reading for the skill call. The skill MUST actually run. Pass arg: --validate-findings plans/reports/{skill}-{date}-{slug}.md — for EACH finding verify (a) file:line proof exists and is accurate, (b) the finding is correct (re-trace the cited code), (c) severity is reasonable and not inflated, (d) it reflects project best practices/conventions; steel-man each rejected interpretation; and surface any MISSED finding or enhancement opportunity the review overlookedplans/reports/why-review-validate-{date}.md## Why-Review Validation line to own report ("All N findings re-validated against actual code; no changes."), gate PASSES; if N > 0, proceed immediately to Phase 7.## Why-Review Validation Notes section citing what changed and why./why-review --validate-findings on the UPDATED report (return to step 2) — re-validation is required ONLY because the report changed. Each pass is terminal (validate mode never recurses); the loop is owned and bounded HERE. Repeat until a why-review round comes back CLEAN, or max 2 re-do rounds (3 total validate passes) is reached.## Why-Review Validation — Unresolved and escalate to the user via AskUserQuestion instead of silently looping.Skip conditions (record explicit reason if skipping):
/why-review itself is the active skill context → do NOT recurse; why-review re-validates via its own terminal --validate-findings mode (see its Findings Validation Gate)Why this exists: AI reports can inherit confirmation bias, false positives, and severity inflation. Validation proves findings before edits; re-validation after report changes closes the gap where corrected findings are never checked again.
Purpose: Fixes change the review target. Next check MUST be a full new
/review-changesinvocation from Phase 0, not continuation from old review state.
Trigger: Phase 6 returns CLEAN and the validated report still contains one or more findings, weaknesses, stale-doc items, missing-test items, or required improvements.
Parent workflow boundary: When this skill is invoked as step 1 inside $workflow-review-changes, do NOT auto-fix or re-invoke /review-changes from here. Parent workflow steps 10-15 own /plan, /plan-review, /plan-validate, /why-review, /feature-implement, and the full restart gate.
Protocol:
/review-changes restart task./docs-update or edit canonical docs only after validation. Tests/specs: update canonical artifact before derived dashboards.## Fix Cycle {N} to the review report: findings fixed, files changed, verification commands/results, and unresolved items with reasons./review-changes in the SAME main-agent session on the full current review target:
/review-changes invocation produces unconditional PASS with zero findings and Phase 6 is skipped as "no findings to validate".Stop conditions:
Non-negotiable rules:
/why-review --validate-findings confirms the current finding set./review-changes protocol from Phase 0.Purpose: Guarantee no stale docs survive the change. Phases 5-7 fix only docs the review flagged as findings; this terminal gate runs
/docs-updateunconditionally so impacted docs the dimensional review never surfaced still get reconciled against the actual changes. A clean code-review verdict does NOT imply docs are current.
Trigger: The review has converged — one full /review-changes pass produced zero findings and all validated fixes are applied. This gate ALWAYS runs in standalone mode; it is NOT gated on a flagged staleness finding.
Parent workflow boundary: When this skill is invoked as step 1 inside $workflow-review-changes, do NOT run Phase 8 locally — the parent workflow's own /docs-update step (after /feature-implement and the restart gate) owns the final docs sync. Record Phase 8 deferred to parent workflow /docs-update step.
Protocol:
[Review Phase 8] task to in_progress./docs-update over the FULL changeset (the Phase 1 diff source plus any Phase 7 fixes). Let it detect impacted docs from the changes — feature docs, architecture references, READMEs, API docs, test specs, setup/getting-started guides.SYNC:spec-drift-adjudication) returned any SPEC-STALE verdict — the canonical Feature Spec no longer reflects the intended behavior (includes the post-bugfix case where the spec documents the bug as correct behavior) — run /spec [update] BEFORE /docs-update so the spec is corrected to intended behavior first. Never let /docs-update codify broken or superseded behavior. CODE-WRONG verdicts are NOT a spec edit — they were already fixed in the Phase 7 code-fix loop. Any SPEC-SILENT verdict — an invariant the code already enforces but no spec artifact states — is an ENRICHMENT: run /spec [update] (add the §4 BR/§3 AC) + /spec [mode=tests] (add the §8 TC) BEFORE /docs-update, then ensure a guarding test exists; never leave the discovered invariant unwritten.No impacted docs — verified N changed files against related docs) under ## Phase 8 Docs-Update in the review report.[Review Phase 8] task to completed.Termination guarantee: Distinguish two edit kinds in Phase 8. Docs PROSE edits (narrative/reference doc text, no new spec rule) do NOT re-trigger the loop (no code behavior changed); they ARE subject to the M1-M6 spec-drift check (Review Checklist §8) and a final read-back — termination preserved. SPEC-CONTENT edits — a newly WRITTEN spec rule (a SPEC-SILENT invariant promoted to §3/§4/§8, or a SPEC-STALE correction that changes documented intent) — trigger exactly ONE bounded, module-scoped re-review of the whole package (spec + tests + code for the affected module) against the enriched spec, to confirm the newly-written rule is actually enforced in code and guarded by a test, and to surface any further hidden rule. That single bounded pass terminates unless it itself produces a new validated finding (which then enters the normal loop). Termination stays guaranteed: the bounded pass is module-scoped and runs at most once per enrichment — not a full Phase-0 restart — and a clean bounded pass ends the skill. This converts enrichment from "fires once at the end, never rechecked" into "fires, then gets one convergence pass," instead of looping review↔docs forever.
MANDATORY: Never declare the review complete or hand off until Phase 8 has run (or been explicitly deferred to the parent workflow). A passing review with skipped docs-update is an INCOMPLETE review.
MANDATORY — NO EXCEPTIONS after completing this skill, MUST use AskUserQuestion to present options. Do NOT skip because task seems "simple" or "obvious" — user decides:
Completion ≠ Correctness. Before reporting ANY work done, prove it:
- Grep every removed name. Extraction/rename/delete touched N files? Grep confirms 0 dangling refs across ALL file types.
- Ask WHY before changing. Existing values are intentional until proven otherwise. No "fix" without traced rationale.
- Verify ALL outputs. One build passing ≠ all builds passing. Check every affected stack.
- Evaluate pattern fit. Copying nearby code? Verify preconditions match — same scope, lifetime, base class, constraints.
- New artifact = wired artifact. Created something? Prove it's registered, imported, reachable by all consumers.
| Skill | Relationship | When to Call |
|---|---|---|
/docs-update | Mandatory terminal gate (Phase 8) — final docs sync after the review/fix loop converges; also the primary fix path for flagged staleness | ALWAYS at Phase 8 once review is clean (standalone) — unconditional; AND during Phase 7 for validated staleness findings. Deferred to parent in $workflow-review-changes. |
/spec-index | Derived index — regenerates the bucket INDEX.md/ERD FROM the Feature Specs (never a source of truth) | After specs change, to refresh navigation aids — NOT for correcting specs |
/spec [update] | Canonical spec updater — corrects feature doc §1-8 (the single source of truth) | Called internally by docs-update; call directly for targeted update — and BEFORE docs-update if a spec-was-wrong scenario is detected |
/spec [mode=tests] [update] | Test spec updater — called when test cases may be stale | Called internally by docs-update; call directly for targeted test case update |
/integration-test-review | Mandatory coverage gate (Phase 3.7) — 7-gate test-quality audit + Gate 7 change-coverage mapping (every behavior change → covering test + spec TC) | ALWAYS at Phase 3.7 when behavior-bearing code changed (standalone); deferred to the parent's dedicated step in $workflow-review-changes. Skip only docs-only diffs |
/review-ui | UI/frontend quality gate — overflow, responsive flex, z-index, SCSS/BEM | Owned by this skill — invoked internally as the UI dimension (ui-ux-designer sub-agent) when the diff has frontend/UI files; NOT a separate workflow step |
/code-simplifier | Quality-optimization dimension — clarity/consistency/maintainability simplifications | Owned by this skill — invoked internally in Phase 3.5 (report mode) when the diff has code files; its findings flow through Phase 6 validation → Phase 7 fix |
/code-review | Code quality — deeper review of changed code | Always follows review-changes quality pass |
When called outside a workflow (i.e., user ran /review-changes directly):
review-changes (you are here)
│
├─ Phase 3.5: Code-simplifier optimization (INTERNAL — /code-simplifier over changed code files, report mode)
│ → Simplification findings feed Phase 6 validation → Phase 7 fix (skip docs-only diffs)
│
├─ Phase 3.7: Integration-test-review coverage gate (INTERNAL — /integration-test-review over the FULL diff, 7 gates)
/review-changes$workflow-review-changes/docs-update over the full changeset as the terminal step so no stale docs survive. This is unconditional (not gated on a flagged finding) — /docs-update independently detects impacted docs the review may not have surfaced. When inside $workflow-review-changes, the parent workflow's /docs-update step owns this; do not run it locally.