skills/review-campaign/SKILL.md
Long-running systematic codebase review with a persistent ledger in reviews/. Use to plan review areas, continue the next review pass, check campaign status, triage findings with the user, or apply auto-tier fixes. Modes: plan, continue, status, triage, fix (default continue).
npx skillsauth add sjunepark/custom-skills review-campaignInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Stateful engine for reviewing a whole repo in small, resumable sessions. The skill is stateless and repo-agnostic; all campaign state lives in reviews/ (the ledger) at the target repo's root, on the campaign branch named in the repo profile. If it is not in the ledger, it did not happen — never rely on session memory.
structure or one detail dimension. Each pass has a rubric in references/.auto (fix without discussion) or triage (needs the user).reviews/
REVIEW.md dashboard: repo profile, phases, next-up pointer, area config table, matrix
areas/<id>.md per-area: Map / Findings / Pass log
decisions.md append-only triage log (accept/reject + reason)
Matrix cell states: · pending | ✓ <sha7> done at that commit | ~ <sha7> stale (area changed since) | — not applicable.
REVIEW.md opens with the repo profile — the per-repo facts every session reads instead of assuming: campaign branch and merge policy, export convention for accepted findings (TODO files, issue tracker, ...), verification commands (typecheck/lint/test, targeted file lint/format, markdown checks), stack notes per area, agent-instruction rules to honor, and anchors (existing review docs to fold in, recorded keep-as-is verdicts, growth domains).
Area file template:
# <id> — review notes
paths: <from REVIEW.md config>
## Map
<structure pass writes this: responsibilities, dependency direction, public surface,
keep-as-is verdicts. Detail passes read it and do not re-litigate verdicts.>
## Findings
### <PREFIX>-001 · major · triage · open — <title>
- pass: structure @ <sha7>
- where: path:line[, path:line]
- problem: <what is wrong and why it matters>
- action: <concrete change>
## Pass log
- <date> · structure @ <sha7> · 2 findings (1 major, 1 nit)
- <date> · tests @ <sha7> · clean
Finding fields:
<PREFIX>-<NNN> from the area's prefix in REVIEW.md, sequential, never reused.blocker (correctness, security, data loss) | major (will cost real time or quality) | minor (worth fixing opportunistically) | nit (mention once, never argue).triage by default; auto only per the eligibility rules below, with a one-line why auto: justification.open → accepted | rejected | fixed | obsolete. Auto tier may go open → fixed directly. Accepting exports the item per the profile's export convention with its id; the exported entry becomes the work item and the campaign is done with it.Invoked as /review-campaign <mode>; no argument means continue.
small flag (small areas batch all their passes into one session).✓ cell run git diff --stat <sha>..HEAD -- <paths>; mark changed cells ~.reviews/ files that are missing. Confirm row changes with the user when present; otherwise only apply splits already recorded by structure passes.reviews/REVIEW.md only (not the whole ledger).~) cells in the current phase first, then by phase order and area priority. Within detail phases, finish one area's columns (left to right) before moving to the next area.git diff <sha>..HEAD -- <paths> plus existing findings: mark obsolete where the code is gone, then review the delta.✓ <HEAD sha7>, update the next-up pointer.review(<area>): <pass> pass notes. Notes commits touch only reviews/; rubric sharpenings belong in the skill's source repo, not the target repo.Print the matrix, open-finding counts by severity and tier, and a staleness sweep (diff each ✓ cell, report without restamping). Suggest triage when open triage findings exceed ~15 or a column just completed; suggest a milestone merge when a phase completes.
Everything else reaches code through triage → the profile's export target → normal dev flow. Fix mode handles only auto + open findings:
small areas).fix(<area>): <summary> (campaign <ids>).triage and reverted, not pushed through.Fixes ride the campaign branch, so run fix sessions near milestones and keep clusters small — merge per the profile's branch model promptly after.
Walk triage + open findings, blockers first, batched by area. Outcomes per finding: accept (export per the profile with id, mark accepted), reject (one-line reason to decisions.md, mark rejected), or retier to auto (user says it's obvious). Close by appending all decisions to decisions.md, and when a phase column is complete, propose the milestone merge per the profile's branch model.
structure — every area, by priority. Completes before any detail pass starts, so detail reviews see the post-refactor shape.security — trust-boundary areas only.tests → errors → logging → effect → naming → diet → docs.small areas may batch all their passes.decisions.md. Never resurface a rejected finding unless the code changed since the rejection.Default is triage. Mark auto only when all hold:
Goal prompt: Run /review-campaign repeatedly until it reports the matrix complete or a blocker finding. Stop and surface blockers immediately.
Cadence: review sessions run unattended; triage runs only with the user; merge the campaign branch at milestones (phase complete or after a triage batch), which also carries exported work items and auto fixes.
development
Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, empty states, UX review, visual hierarchy, information architecture, accessibility, performance, responsive behavior, theming, typography, spacing, layout, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, design systems, tokens, live browser iteration, and ambitious visual effects. Not for backend-only or non-UI tasks.
development
Manually integrate Git branch work without blind mechanical merges. Use when merging, transplanting, or refactoring branch work; resolving conflicts; preserving source-branch intent in a clean current-branch structure; or auditing that source additions, removals, tests, and docs landed intentionally.
testing
Prepare, audit, set up, and guide Release Please releases. Use when releasing, preparing or reviewing a release PR, adding Release Please, classifying SemVer impact or breaking changes, writing Release Please-compatible Conventional Commit guidance, or documenting release criteria. Release work requires existing Release Please config; setup requires an explicit setup request.
development
Teach how code, a subsystem, architecture area, feature flow, module, API/data boundary, or relevant technical concept works for reviewers and maintainers. Use when the user asks to understand code or concepts; focus on design, responsibilities, contracts, data flow, invariants, tradeoffs, and maintenance implications, not syntax or line-by-line execution. Use `change-explainer` for diffs, commits, or patches.