Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Review the changes since a fixed point (commit, branch, tag, or merge-base) along two axes — Standards (does the code follow this repo's documented coding standards?) and Spec (does the code match what the originating issue/PRD asked for?). Runs both reviews in parallel sub-agents and reports them side by side. Use when the user wants to review a branch, a PR, work-in-progress changes, or asks to "review since X".
.claude/skills/asymmetric-al-code-review/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-09 | ✓→✗ | ▼ Worse | 354% | 0% |
Two-axis review of the diff between HEAD and a fixed point the user supplies:
Both axes run as parallel sub-agents so they don't pollute each other's context, then this skill aggregates their findings.
The issue tracker should have been provided to you — run /setup-matt-pocock-skills if docs/agents/issue-tracker.md is missing.
Whatever the user said is the fixed point — a commit SHA, branch name, tag, main, HEAD~5, etc. If they didn't specify one, ask for it.
Capture the diff command once: git diff <fixed-point>...HEAD (three-dot, so the comparison is against the merge-base). Also note the list of commits via git log <fixed-point>..HEAD --oneline.
Before going further, confirm the fixed point resolves (git rev-parse <fixed-point>) and the diff is non-empty. A bad ref or empty diff should fail here — not inside two parallel sub-agents.
Look for the originating spec, in this order:
#123, Closes #45, GitLab !67, etc.) — fetch via the workflow in docs/agents/issue-tracker.md.docs/, specs/, or .scratch/ matching the branch name or feature.Anything in the repo that documents how code should be written, such as CODING_STANDARDS.md or CONTRIBUTING.md.
On top of whatever the repo documents, the Standards axis always carries the smell baseline below — a fixed set of Fowler code smells (_Refactoring_, ch.3) that applies even when a repo documents nothing. Two rules bind it:
Each smell reads _what it is_ → _how to fix_; match it against the diff:
switch/if-cascade on the same type recurs across the change. → replace with polymorphism, or one map both sites share.a.b().c().d() navigation the caller shouldn't depend on. → hide the walk behind one method on the first object.Send a single message with two Agent tool calls. Use the general-purpose subagent for both.
Standards sub-agent prompt — include:
Spec sub-agent prompt — include:
If the spec is missing, skip the Spec sub-agent and note this in the final report.
Present the two reports under ## Standards and ## Spec headings, verbatim or lightly cleaned. Do not merge or rerank findings — the two axes are deliberately separate (see _Why two axes_).
End with a one-line summary: total findings per axis, and the worst issue _within each axis_ (if any). Don't pick a single winner across axes — that's the reranking the separation exists to prevent.
A change can pass one axis and fail the other:
Reporting them separately stops one axis from masking the other.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-09 | pass→fail | 2,901 | 5,354 | +85% | 1 | 1 | 0% | 394 | 1,790 | +354% | 0 | 0 | — |
case-01 | fail→fail | 7,105 | 5,849 | -18% | 1 | 1 | 0% | 1,007 | 1,841 | +83% | 0 | 0 | — |
case-02 | fail→fail | 12,233 | 6,441 | -47% | 1 | 1 | 0% | 388 | 1,897 | +389% | 0 | 0 | — |
case-03 | fail→fail | 8,085 | 5,409 | -33% | 1 | 1 | 0% | 1,228 | 1,781 | +45% | 0 | 0 | — |
case-04 | pass→pass | 4,467 | 2,382 | -47% | 1 | 1 | 0% | 644 | 1,860 | +189% | 0 | 0 | — |
case-05 | fail→fail | 8,200 | 4,446 | -46% | 1 | 1 | 0% | 1,512 | 1,782 | +18% | 0 | 0 | — |
case-06 | pass→fail | 6,355 | 9,305 | +46% | 1 | 1 | 0% | 965 | 1,841 | +91% | 0 | 0 | — |
case-07 | fail→fail | 4,577 | 34,580 | +656% | 1 | 1 | 0% | 704 | 1,820 | +159% | 0 | 0 | — |
case-08 | fail→fail | 10,764 | 17,176 | +60% | 1 | 1 | 0% | 1,757 | 1,838 | +5% | 0 | 0 | — |
case-10 | pass→pass | 9,153 | 3,326 | -64% | 1 | 1 | 0% | 1,401 | 2,011 | +44% | 0 | 0 | — |
case-11 | fail→pass | 10,992 | 4,061 | -63% | 1 | 1 | 0% | 1,694 | 2,143 | +27% | 0 | 0 | — |
case-12 | fail→pass | 9,695 | 7,762 | -20% | 1 | 1 | 0% | 1,650 | 2,618 | +59% | 0 | 0 | — |
case-13 | fail→pass | 11,093 | 1,407 | -87% | 1 | 1 | 0% | 1,651 | 1,688 | +2% | 0 | 0 | — |
case-14 | fail→fail | 14,879 | 5,328 | -64% | 1 | 1 | 0% | 2,319 | 2,397 | +3% | 0 | 0 | — |
case-15 | fail→pass | 8,396 | 3,397 | -60% | 1 | 1 | 0% | 1,252 | 1,994 | +59% | 0 | 0 | — |
case-16 | fail→fail | 12,124 | 2,683 | -78% | 1 | 1 | 0% | 1,910 | 1,913 | +0% | 0 | 0 | — |
case-17 | pass→pass | 4,729 | 2,027 | -57% | 1 | 1 | 0% | 731 | 1,803 | +147% | 0 | 0 | — |
case-18 | pass→pass | 7,080 | 1,576 | -78% | 1 | 1 | 0% | 973 | 1,697 | +74% | 0 | 0 | — |
case-19 | pass→pass | 13,319 | 7,882 | -41% | 1 | 1 | 0% | 2,074 | 2,691 | +30% | 0 | 0 | — |
case-20 | pass→pass | 8,569 | 12,117 | +41% | 1 | 1 | 0% | 1,364 | 3,404 | +150% | 0 | 0 | — |
case-21 | pass→fail | 3,868 | 6,163 | +59% | 1 | 1 | 0% | 673 | 1,793 | +166% | 0 | 0 | — |
case-22 | pass→pass | 7,133 | 9,412 | +32% | 1 | 1 | 0% | 1,134 | 2,903 | +156% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 13 counted toward the lift figure. The other 9 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +5 percentage points is the difference between those two pass rates over the 13 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.