双轴 diff 审查的口袋版。完整教学见 Lesson 0013; 原文见 SKILL.md、 docs 页(aihero.dev/skills-code-review)。
以你给的固定点为基准,把 HEAD 的 diff 交给两条轴各审一遍——
Standards(写得对吗:合不合仓库的标准)和 Spec
(做对事吗:有没有实现当初的需求)——并行子代理、并排报告、永不合并排名。
全程只读,产物只有对话里的报告。
implement 建完一个 Issue、commit 之前(它会自动跑,不用你喊)/code-review <固定点> 或说「review since X」tdd)、修 bug(→ diagnosing-bugs)、分拣 Issue(→ triage)、全库扫描(→ improve-codebase-architecture)git diff <点>...HEAD(三点 = 对比 merge-base)+ git log <点>..HEAD --oneline;先 git rev-parse 验证、确认 diff 非空——错了就地失败,别进子代理再炸docs/agents/issue-tracker.md 取)→ 用户传的路径 → docs//specs//.scratch/ 下匹配的 PRD → 问用户;没有就 Spec 轴跳过,注明 "no spec available"CODING_STANDARDS.md、CONTRIBUTING.md…)+ 固定携带的 Fowler 异味基线(12 条,见下)Agent 调用,都用 general-purpose;Standards 的 prompt 里照贴基线全文(它没有别的渠道拿到);两个任务书都限 400 词## Standards / ## Spec 两节原文照摆;结尾一行:逐轴总数 + 本轴最严重一条| 异味 | 是什么 | 怎么修 |
|---|---|---|
| Mysterious Name | 名字看不出它做什么、装了什么 | 改名;想不出诚实的名字 = 设计含糊 |
| Duplicated Code | 同一逻辑形状在多处 hunk / 文件重复 | 抽出公共形状,两处都调它 |
| Feature Envy | 方法读别人对象的数据多过自己的 | 把方法搬到它羡慕的数据上 |
| Data Clumps | 同样几个字段 / 参数总结伴出现 | 捆成一个类型,传这个类型 |
| Primitive Obsession | 基本类型顶替该有自己类型的领域概念 | 给概念一个小类型 |
| Repeated Switches | 对同一类型的同一串 switch/if 反复出现 | 多态,或抽一张共享映射表 |
| Shotgun Surgery | 一个逻辑改动逼你散开改很多文件 | 一起变的收进同一模块 |
| Divergent Change | 一个模块因多个无关原因被改 | 拆开,每个模块只为一个原因变 |
| Speculative Generality | 为 spec 没有的需求预建抽象 / 参数 / 钩子 | 删掉,内联回去等真实需求 |
| Message Chains | 长长的 a.b().c().d() 导航链 | 在第一个对象上藏一个方法 |
| Middle Man | 类 / 函数大部分只是往下转发 | 砍掉,直接调真目标 |
| Refused Bequest | 子类忽略 / 覆盖掉继承来的大部分 | 放弃继承,改用组合 |
setup-matt-pocock-skills(提供 docs/agents/issue-tracker.md,缺了先跑它);spec 上游是 to-spec / to-tickets(软依赖,缺席只让 Spec 轴跳过)implement——「Once done, use /code-review to review the work」,然后才 committo-spec 补 spec| 症状 | 改哪段 |
|---|---|
| 两轴被合并、给了总排名 | 「### 5. Aggregate」+「## Why two axes」 |
| 异味被当硬性违规报 | 「### 3…」的 "Always a judgement call" + 第 4 步 Standards 任务书 |
| 仓库认可的做法被基线挑刺 | 「### 3…」的 "The repo overrides." |
| 主干新提交混进审查范围 | 「### 1. Pin the fixed point」三点写法与 rev-parse |
| 没 spec 时子代理编需求 | 「### 2. Identify the spec source」第 4 条 |
| 报告又臭又长 | 第 4 步两个任务书的 "Under 400 words" |
| 说「review 一下」时 AI 不主动用 | frontmatter description 的 "Use when…" |