深度研究 · 场景 S2 · 落地手册

用 mattpocock/skills 给一个 73 万行的十年 Java 系统
装一条「能停下来的传送带」

目标是在一个 15 个 Maven 模块、3412 个 Java 文件、约 73 万行、持续开发逾十年的内部信息系统上,先落「项目计划管理」模块——投标基础信息、中标结果信息、项目经济评审、项目技术评审、基础信息维护五个子模块。本手册把 Matt Pocock 的技能包当成一套可编程的工程纪律来拆解,并给出每一步在这个具体代码库上的翻译。

零状态假设:仓库尚未配置任何 skill 30 个技能 · 2 类调用权 一手证据:METR RCT / DORA 2025 / GitClear 211M 行 2026-09-30

00摘要:十二条核心论断

这份手册不是技能说明书的中文版。它的论点是:在一个十年高龄的单体上,Matt Pocock 技能包的价值不在于"让 AI 写得更快",而在于"让每一次 AI 的产出都能被更便宜地验证"。下面是支撑该论点的十二条论断,后续每一章都服务于其中一条。

  1. 主瓶颈是反馈延迟,不是代码生成速度。73 万行 Maven 单体的全量构建与测试动辄数十分钟,而 TDD 技能的红-绿循环只有在"单次反馈 ≤ 分钟级"时才成立。先让某一个模块的单测能在 60 秒内跑完,再谈让智能体写功能——这是所有工作的第一步。
  2. 技能包的本体是一条「先压缩歧义、再动手」的流水线。它的五个修复目标(对齐、啰嗦、跑不起来、糊球赋值、导航慢)分别对应 grill → glossary → tdd → review → retro。跳过前面的阶段直接 implement,等于把下游的全部负担推给代码评审。
  3. 对这个系统最有杠杆的一个决策,是把"投标"和"项目"拆成两个概念。五个子模块横跨两个生命周期。旧系统最常见的熵源是用同一个实体承载中标前后,于是评审、作废、变更全部要靠 status 分支打补丁。这条分界线应当先落在 GLOSSARY.md 里,再落到包结构上。
  4. 在这个体量的代码库上,AI 大概率先让你变慢,而且你察觉不到。METR 的 RCT 选取的正是"平均 10 年历史、百万行级"的成熟仓库,结果是慢 19%,而参与者事后仍自认为快了 20%。感知与实测的缺口意味着:任何"我觉得快了"的证据等级为零。
  5. AI 是放大器,而 15 模块单体是紧耦合:这是最不利的组合。DORA 2025 的核心结论是"AI 放大既有强弱",并明确指出紧耦合架构 + 缓慢反馈循环的团队几乎拿不到收益。先降耦合,再谈加速。
  6. 默认工作模式下 AI 会把"整理"这件事挤掉。GitClear 对 2.11 亿行变更的纵向分析显示:被移动/重构的行从 24.8% 降到 9.5%,复制粘贴从 8.4% 升到 12.3%,重复代码块增长约 8 倍。对一个债已经很重的系统,这是负利滚利。
  7. 防腐的着力点不是"让 AI 少写",而是"让人工性的验证更便宜"。code-review 技能的双轴设计(Standards / Spec 并行子智能体)与 Fowler 十二种代码气味基线,本质是把验证环节的成本后者,而不是把闸门设在生成端。
  8. 在欠缺测试的老系统上,TDD 的第一步是写"表征测试",不是写新功能的测试。tdd 技能要求"只在事先约定的接缝处测试"。这个系统在建立特征锁之前没有可靠接缝,因此第一个 ticket 永远是给即将触碰的旧代码加表征测试(Michael Feathers 的做法)。
  9. 五个子模块不是五个同等规模的工作包,它们的"blast radius"相差一个数量级。新增子模块是垂直切片;而"基础信息维护"中改动一个被全系统引用的字典/枚举字段属于宽重构,必须按 expand–contract 三段走,不能塞进 tracer bullet。
  10. 上下文窗口装不下 3412 个文件,所以"上下文指针"是一等工程手段。implement-spec 明确要求子智能体之间通过指针而非复制内容通信,探索结果落在仓库之外的 Markdown 笔记里。这一点在你的单体上比其他项目重要得多。
  11. 这套技能要真正生效,必须先做一次仓库级配置。to-spec、to-tickets、code-review、wayfinder 全都以"问题跟踪器已经被告知"为前提,未配置就直接报错。第一步是 /setup-matt-pocock-skills,而且内网环境应当选本地 Markdown 跟踪器。
  12. 技能必须本地化,直接使用是半成品状态。作者的立场是"小而可组合、随便改"。对这个系统至少需要自研三个技能:快速反馈通道、Maven 模块边界守门、遗留代码安全网。它们决定了前九条能不能落地。
阅读建议

如果你只有十五分钟:读第 00 章的十二条论断、第 06 章的接缝设计、第 10 章的 90 天路线图。如果你要明天就动手:直接执行第 03 章末尾的「最小可用配置」与第 06 章的「第一张 ticket」。

01先给系统画像:它属于哪一类难题

在谈任何技能之前,必须先把这套十年单体的"难题类别"判定清楚。因为后续所有纪律的强度都由这个判定决定:新项目可以宽松,高默契 + 紧耦合 + 弱自动化验证的存量系统必须严格。

15个 Maven 模块

多模块单体。-pl 与 -am 的边界决定了反馈延迟。这是一切速度问题的物理上限。

3,412个 Java 文件

约 214 行/文件。经验上偏高的单文件行数通常指向已经长成的"上帝类"与复制粘贴式扩展。

~73 万行代码

与 METR 实验所选"平均百万行级"的成熟仓库处于同一量级,因此那组最悲观的实测数据适用于此。

1.1 三个特性,决定了纪律的强度

这套系统同时具备三个特性,而这三者的组合恰好是 AI 辅助开发收益最低的区域:

特性在本系统上的表现对智能体的直接后果
高 tacit knowledge
(暗中约定多)
十年演进、内部制度驱动、"某些字段必须在某个状态才能改"这类规则多半写在人脑或老员工的口头规范里,不在代码里。智能体缺少 隐性约束。它生成的代码会编译通过、跑得起来,但破坏一条没人告诉它的业务铁律。这正是 METR 观察到的"仓库年限拖累 AI 有用性"的机制。
紧耦合15 个模块共占一个 reactor,跨模块的 service 互相注入常见;"基础信息"类字典被全系统引用。任何"局部正确"的改动都可能跨模块漏出。DORA 2025 明确指出:紧耦合 + 慢反馈的团队几乎拿不到 AI 收益。
弱自动化验证十年老系统常见状态:测试覆盖极低或测试依赖数据库/容器,跑不动或跑得慢。红-绿循环没有"红"。没有红灯的智能体等于闭眼开车,而这恰恰是 tdd 技能唯一无法代你去做的部分。

1.2 五个子模块跨越了两个生命周期,不是一个

把用户列出的五个子模块按时序摆到业务时间轴上,会看到一个被很多遗留系统抹平的分界:中标前,处理的对象是"投标机会";中标后,处理的对象才是"项目"。这两件事的字段、状态机、权限、留痕要求都不同。旧系统最常见的熵源就是把它们塞进同一张主表和同一个"项目"名词里,于是所有差异只能靠 if (status == 6) 之类的分支去补。

业务时间轴(示意,非实测架构) 投标登记 投标评审 中标公示 项目立项 双评审 项目执行 中标前 中标后 概念分界线 投标上下文 bid-intake 项目上下文 project-delivery ① 投标基础信息 跨 3 个阶段 ② 中标结果 ③ 经济评审 ④ 技术评审 ⑤ 基础信息维护 全周期贯穿 · 被所有上下文依赖 典型熵源: 把"投标机会"与"项目"塞进同一主键实体,导致评审 / 作废 / 变更全靠 status 分支打补丁 建议先落: 两个上下文各自维护 GLOSSARY,先做概念分界,再谈包结构与模块边界
图 1 五个子模块在业务时间轴上的覆盖范围。注意垂直虚线:中标前与中标后是两个不同的上下文,概念分界之后才谈得上模块边界。示意该图依据用户给出的子模块清单绘制,不假定现有的表结构与包结构。
这一推论的使用前提

本手册没有访问你的代码库,因此图 1 是按子模块语义推导的定位图,不是现状架构。落地第一步必须是第 3.3 节的探测清单——用五条命令把"到底是共用一张表,还是已经有拆分"问出来。不要用图 1 直接当作现状。

1.3 派生出一个数量级:这笔债值多少钱

按 Sonar 公开的 2023 年基准——每百万行代码每年约产生 30.6 万美元技术债敞口、约 5,500 开发小时用于修复——线性折算到 73 万行,约 22 万美元 / 4,000 小时 / 年,折算约 2 个人年。

建模值,不是实测值

上面这串数字是按单一第三方基准线性外推的建模结果,用途是给"值不值得投入"一个数量级锚点,不能写进立项预算。真正可辩护的做法是用第 09 章的度量方法,在你自己的仓库上跑两周拿到实测基线。Sonar 基准本身也不区分语言与业务密度。

02为什么是这套技能,而不是别的

市面上"接管整个流程"的框架(GSD、BMAD、Spec-Kit)与这套技能的分野,不在于谁更全,而在于出了问题时你能不能定位到具体某一句话。这是选择它的第一性理由,对一个无法承受流程黑箱的存量系统尤其重要。

2.1 作者的自我定位:小、可改、可组合

仓库 README 的开场自述是"My agent skills that I use every day to do real engineering - not vibe coding",并明确与 GSD / BMAD / Spec-Kit 划清界限:

"像 GSD、BMAD 和 Spec-Kit 这类方案试图接管整个流程来解决问题。但这样做同时夺走了你的控制权,并且让流程里的 bug 难以修复。"

"这些技能被设计成小而易改、可组合,与任何模型无关……随便 hack,改成你自己的。"

这段话直接决定了本手册第 10 章的立场:不要原样使用,要在第二个 Sprint 开始本地化改造。第 10.4 节给出三个针对本系统的自研技能草案。

2.2 它的组织原理:一条轴、两种调用权

技能包只有一个真正的分类轴——谁能调用它:

User-invoked(编排层 · 16 个)

只能由人敲名字触发。在 Claude Code 里靠 frontmatter 的 disable-model-invocation: true 实现。职责是编排,例如 grill-with-docs、to-tickets、implement-spec、retro。

描述写给人看:去掉"当用户说..."这类触发器措辞,改成一句话摘要。

Model-invoked(能力层 · 11 个)

可以被智能体自主取用。描述写给模型看,保留丰富的触发措辞。职责是可复用纪律,例如 tdd、codebase-design、code-review、diagnosing-bugs。

判定法:模型能否有用地自主取出它?能,就保留在这层。

一条硬约束(.agents/invocation.md):用户可调技能可以调用模型可调技能,但永远不能调用另一个用户可调技能。这就是为什么 to-spec 里写着"如果用户没跑过 setup,就告诉用户去跑 /setup-matt-pocock-skills",而不是自己调用它——它不是调用不到,而是被设计性地禁止。这条约束保证了任何一次长流程都由人掌着方向盘。

2.3 它修复的四个失效模式,恰好对应你的四个痛点

失效模式症状(会在你系统上这样出现)修复技能机制
#1 智能体没做我要它做的事做完了才发现它把"评审通过"理解成了一个布尔而非带意见状态的结论;投标与项目混为一谈。grill-with-docs
grilling
把歧义在设计树上一次问干净;前提是先把协商好的术语写进 GLOSSARY.md。
#2 智能体太啰嗦 / 术语漂移同一个"标段"在代码里出现 3 种叫法,检索与复用全部失效。domain-modeling术语一冲突立即指出并落盘;模糊词当场 sharpen。
#3 代码跑不起来Maven 编译过了,一跑 MyBatis 或者事务就炸;或者改动悄悄覆盖了别人的字段。tdd
diagnosing-bugs
红-绿循环 + 阶段化诊断(含人工介入循环脚本模板)。
#4 写成了泥球五个子模块各自有独立的 XXService + XXDao + XXController 三件套,逻辑却几乎重复。codebase-design
improve-codebase-architecture
用"深模块 / 接缝 / 局部性"词汇找加深候选,产出可视化 HTML 报告后逐个 grill。
最重要的一句自我限定

README 对 improve-codebase-architecture 的说明值得单独抄出来:它是"一次勘察,不是一次救援"——"on a genuinely old codebase it will find real candidates, but it won't untangle the mud for you"。对一个十年的系统,这句话应当写进团队的操作规程:不要指望跑一次这个技能就把泥球解开,它只负责给你候选清单。

03技能地图与最小可用配置

这一章给出可直接执行的安装、配置与路由规则。目标状态:明天早上团队里任何一个人都能正确启动一次完整的实现流程,不需要记住 27 个技能。

3.1 安装:两条路,不要两条都走

官方文档给了两种安装哲学,并且明确警告二者只能选一:同时安装会让每个技能在你机器上都出现两次。

路线 A · Claude Code 插件(订阅式)

托管只读包,作者更新你会自动收到。适合先把流程跑顺的前 4—6 周。

claude plugins install mattpocock-skills

或在会话内直接 /plugin install mattpocock-skills。

路线 B · skills.sh(Fork 式,推荐最终形态)

把技能以普通文件形式写进你的仓库,归你所有、随你改。适合第 5 周开始本地化。

npx skills@latest add mattpocock/skills

安装时务必勾上 setup-matt-pocock-skills;后续用 npx skills update 同步上游。

针对内网的建议

路线 B 依赖 npm 拉取;如果开发机不通外网,采用路线 A 的托管包同样会被墙。稳妥做法是:在一台能联网的机器上用 npx skills@latest add 拉下技能目录,把产出的 Markdown 文件直接提交到你的内网仓库里(作者许 MIT),从此就是普通文件,不依赖任何外网。这也是本手册第 10.4 节"本地化改造"的前提。注意:这样做之后,你的 CLAUDE.md 会跳过 npx 那一层,属于手动安装形态。

3.2 一次完整的流程长什么样

下图是这套技能在"实现一个新模块"场景下的标准编排。上层六个方块是人敲命令触发的编排层,下层十一个胶囊是被它们自动取用的能力层。箭头方向即推荐顺序。

编排层(人显式调用) 阶段 1 · 对齐 grill-with-docs 追问到设计树 每个分支都落地 产出 GLOSSARY 与 ADR 阶段 2 · 成文 to-spec 当前会话合成 规格:问题 / 方案 用户故事 / 测试决策 不做二次访谈 阶段 3 · 拆解 to-tickets 追踪弹式垂直切片 每张票声明 blocked by 宽重构改走 expand–contract 阶段 4 · 实现 implement 单票:走 tdd 全规格:implement-spec 子智能体各自 worktree 前沿并发 阶段 5 · 闸门 code-review 双轴并行子智能体 Standards:编码规范 + Fowler 12 气味 Spec:是否忠于规格 阶段 6 · 沉淀 retro 改的是环境不是人 导航 / 自动检查 编码标准 / 工具经济 按严重度排序 retro 的发现回写「编码标准与导航指针」 能力层(可被上方自动取用) grilling 被 grill / wayfinder 取用 domain-modeling 术语淬炼 / ADR 落盘 codebase-design 深模块 / 接缝词汇表 tdd 红绿循环 / 反同义反复 code-review implement 收尾调用 diagnosing-bugs 难 bug 阶段化诊断 research wayfinder 研究票 prototype 单文件 HTML 原型 pr 合并危险度判断 writing-for-agents retro / 写技能时 wizard 只能人做的步骤 扶手型技能(跨阶段):ask-matt 路由 · wayfinder 超大工作量地图 · triage · improve-codebase-architecture · handoff · teach · wait-what 硬约束:编排层可以调用能力层,但编排层不能调用另一个编排层 —— 每次长流程的方向盘始终在人手里
图 2 技能编排流水线。上层 6 个阶段是人显式触发的编排层,下层 11 个胶囊是可被自动取用的能力层。虚线回环是全过程中最容易被跳过、但对你这个系统最值钱的一步:retro 把发现回写为标准与检查。

3.3 最小可用配置:三条必须一次答对的问题

to-spec、to-tickets、code-review、wayfinder 四个技能的前提都是"仓库已经告诉过我它的跟踪器在哪"。没跑过 setup 就直接调用,它们不会替你猜,只会报错让你回去跑 setup。因此这是真正的第 0 步。

Setup 会问本系统的推荐回答为什么这么选
问题跟踪器内网环境:本地 Markdown(.scratch/<feature>/issues/)。有 GitHub / GitLab:选对应项(分别走 gh / glab CLI)。技能原生支持四种形态。选你实际跟踪工作的地方,而不是理想的地方——否则 ticket 会写到一个没人看的目录里。
triage 标签词汇接受默认的五个:needs-triage / needs-info / ready-for-agent / ready-for-human / wontfix。只有装了 triage 才会问这题。ready-for-agent 是关键:它是"这张票已经 grill 到可以被智能体安全接走"的唯一信号。不要自定义这套名字,除非你的跟踪器已有同义标签。
领域文档布局两个上下文都用,就选 multi-context(根 GLOSSARY-MAP.md + 各上下文自己一份)。否则默认单上下文。按第 01 章图 1 的判断,"投标"与"项目"是两个上下文,应当选多上下文布局——这正是 GLOSSARY-MAP.md 存在的理由:一个 map 指向两份术语表,并写清两者之间的关系。

写完之后,仓库根部的 CLAUDE.md(若不存在则 AGENTS.md)会增加一段「Agent skills」区块,它只包含三行导航指针,指向 docs/agents/issue-tracker.md 等文件。这个设计值得照抄到你的项目:CLAUDE.md 应当极为克制,只放指针,不放内容(见第 11 章反模式 #9)。

3.4 当前现状探测:动手前先问出五件事

因为你要在别人的十年代码上动刀,图 1 只是假设。先把下面五条命令跑一遍,把答案写进 GLOSSARY.md 的备注与规格草稿:

# 1. 模块边界:本次改动实际会跨越哪几个 Maven 模块
mvn -q -o dependency:tree -Dincludes=com.yourorg | head -60

# 2. 有没有 Conway 式共用实体:搜 Project / 实体名在哪些 module 出现
rg -l "class Project|PO\b|ProjectEntity" --glob "*.java" | xargs -I{} dirname {} | sort | uniq -c

# 3. 状态机是否散落:数一下 status== 的分支密度
rg -c "status\s*==|getStatus\(\)\s*==" --glob "*.java" | sort -t: -k2 -rn | head -20

# 4. 反馈延迟基线:单模块跑一次测试的墙上时间
time mvn -q -pl <目标模块> -am -DskipITs test

# 5. 现有 seams:有没有能直接作为表征测试入口的 Service 接口
rg -l "@Service|@Repository" --glob "*.java" | wc -l
第 4 条是整个前期最重要的一次测量

其余四条可以边做边补,但"单模块 mvn test 的墙上时间"必须现在就测,因为它决定了第 06 章所有设计的可行性。经验阈值:≤ 60 秒,TDD 循环成立;3—10 分钟,必须做测试切片与模块隔离优化;> 15 分钟,任何"AI 提效"都是先把这一项降下来再说。

04理论根基:每条理论都必须能推出一个具体动作

这一章只收录能推出工程动作的理论。凡是只能当比喻用、推不出具体该改哪条命令或哪个文件的,一律不收。每条给出:理论 → 推导 → 在你这个 15 模块系统上的具体动作。

理论表述(含来源)推导本系统上的动作
T1 反馈速率是速度上限 "反馈的速率就是你的速度上限。永远不要承担过大的任务。"
《程序员修炼之道》
智能体的产出速率可以很高,但验证速率被构建与测试时间绑死。系统的实际速度是两者的较小值。提升智能体的产出而不同步提升验证,只是把工作量堆到下游。 把 mvn -pl <mod> -am test 的墙上时间作为一号度量,先降到 60 秒内。这是第 06 章全部设计的可行性前提。
T2 深模块(接口小而实现深) "最好的模块是深的:通过简单接口访问大量功能。"
Ousterhout《软件设计的哲学》
注意 技能明确拒绝 Ousterhout 的"行数比值"定义(那会奖励注水),改用 depth-as-leverage。
模块的接口宽度决定调用方与测试需要理解多少。三个各 5 个方法的 Service,不如一个 5 方法、把三者都收进去的深模块。 对五个子模块逐个做 deletion test:设想删掉它——复杂度是消失了,还是重回到 N 个调用方?是后者才值得存在(详见第 07 章表格)。
T3 一个适配器=假接缝;两个=真接缝 技能内部的接缝纪律。 只有一个实现的 port 是纯间接层,它不承载任何信息,只增加导航成本。引入 port 的合理理由是"至少有生产 + 测试两个适配器"。 禁止"未来可能换数据源"式的提前抽象。但如果 DAO 层已经有第二个实现(如内存版用于测试),那接缝才是真的,应在 GLOSSARY 里给它命名。
T4 接口就是测试面 调用方与测试穿过同一个接缝。想测到接口之外,说明模块形状错了。
codebase-design 技能
如果为了测一个业务规则必须启动 Spring 容器 + 连库,说明接缝位置放错了,而不是"只能写集成测试"。 把评审规则、评审结论状态机抽成不依赖 Spring 的纯 Java,接缝压在这条活塞上;集成测试只留少数几条确认路径。
T5 AI 是放大器,不是修正器 "AI 放大的是组织的既有强弱,而非均匀地雨露均沾。"
DORA 2025,n≈5,000
并明确指出:紧耦合 + 慢反馈的团队收益最小。
在验证能力弱的系统上加装 AI,等于放大泄漏率。因此顺序不可颠倒:先建控制系,再加动力。 第 10 章路线图的前 30 天不允许任何 AI 生成业务代码,只能复制狄做测试和 CI 集成的全部未XP 工作。
T6 验证要比生产便宜 反格言版的"让验证更便宜,而不是让评审更慢"。
由 T1 + DORA 的稳定性结论推导
把精力投进"评审更严"收益是线性的;投进"跑一次更便宜"是乘性的,因为它提高了单位时间内可尝试的次数。 投资顺序:单测秒回 > 静态检查 > 人工评审。新增的每一条人工评审规则,都要先问"能不能写成 ArchUnit / Checkstyle 规则"。
T7 改环境优于改指令 retro 的归类:导航 / 自动检查 / 编码标准 / 工具经济。 给智能体的每条散文指令都有"是否被遵守"的不确定性;而一条 CI 检查要么过要么不过。机械性问题应当先机械化。 retro 产出的每一项,先问能否变成 ArchUnit/Checkstyle 规则;只有真正的裁量判断(跨文件一致性、风格)才写进 CODING_STANDARDS.md。
T4 的一个直接推论(对这个系统最值钱)

技能里这句"the interface is the test surface",配上 Feathers 的接缝思想,可以推出一条具体的 ticket 切割规则:凡是含有业务规则的代码,不得与 Spring / MyBatis / HTTP 在同一个类里。理由不是美学,而是——只有这样才能在不启动容器的前提下用毫秒级代价画出红灯。这条规则可以直接写成 ArchUnit 检查,属于可靠刻度。

05第一优先级:把「项目计划管理」的术语砸实

作者的论证很直接:智能体被丢进一个项目里被迫边做边猜术语,于是它用二十个词表达本来一个词就够了。统一语言的价值不止于省 token——它让变量、函数、文件的命名自动一致,从而让检索变得更准。

5.1 grilling 的机制:前沿、轮次、必须给推荐答案

grilling 是整个技能包复用次数最多的原语。它的协议有四条硬规则:

  1. 把对手表示为设计树——每个决策分叉出挂在它下面的决策。
  2. 按"前沿"问,而不是按顺号问题清单问。frontier = 所有前提已经尘埃落定的决策,也就是"现在问不会猜错"的那批。
  3. 一轮问完整个前沿,每个问题编号,并必须给出你的推荐答案(➡️)。
  4. 找事实是你(智能体)的活,不是人的活。前沿里需要事实(文件系统、命令行)的,派子智能体去查,别问人;别因为等待而阻塞——只把依赖该事实的问题推到下一轮。

会话结束的条件是"前沿为空":设计树的每个分支都走过一遍,没有剩下的隐含假设。而且在你确认双方达到共识之前,不许动手。

一次 Round 1 示范(针对本项目,推荐答案已给出)

❓ Q1 — 投标与项目是否共用同一个实体?
现有表里,"一个还没投标的对象"和一个"已经中标开始交付的对象",是同一行记录还是两行?这决定了后续所有状态机、权限、留痕的形状。
➡️ 推荐:拆成 BidOpportunity 与 Project 两个概念,由 AwardNotice 事件触发 Project 创建。

❓ Q2 — 评审结论是布尔还是枚举?
"通过/不通过"之外,实务里几乎必然存在"有条件通过""退回修改"。如果现在是 int status,后续每加一种结论都要改所有分支。
➡️ 推荐:定义 ReviewVerdict 枚举:待审 / 审核通过 / 附条件通过 / 退回修改 / 否决。禁止布尔与魔法数字。

❓ Q3 — 「基础信息」变更是否需要留痕与追溯?
被全系统引用的字典项一旦改了,历史单据算新值还是旧值?
➡️ 推荐:单据快照当时的字典值;字典项本身的变更走 expand–contract(详见 7.2),不直接改名。

这三题的答案会分别落成 ADR-0001 / ADR-0002 / ADR-0003,见 5.3。

5.2 可直接抄用的术语表草案

下面是按卢文件格式写好的种子,条目内容需要根据你们实际的申请表字段校准——但结构与"Be opinionated / 给 Avoid 列"这个做法是照抄的。核心规则:定义一到两句、只定义"它是什么"而非"它做什么"、只收录本项目特有的概念(超时、通用错误码这类不收)。

# 投标上下文 bid-intake

我方从识别招标信息到递交投标文件这一段的信息对象。此上下文内的东西都还不是"项目"。

## Language

**Bid Opportunity(投标机会)**:
我方识别出的一条可参与的外部招标线索及其跟踪状态。
_Avoid_: 项目前期、招标、业务机会

**Invitation to Tender(招标)**:
甲方发出的招标行为与招标文件本身。方向是甲方→我方。
_Avoid_: 投标(混淆方向)、标讯

**Bid(投标)**:
我方对一次招标的响应行为与其提交的整套文件。方向是我方→甲方。
_Avoid_: 标书(既指文件又指行为)、报价

**Package(标段)**:
一份招标文件拆成的可独立投标、可独立中标的最小单元。
_Avoid_: 包、标段包、标包

**Bid Opening(开标)**:
甲方公开拆封投标人提交的文件的时点与过程。
_Avoid_: 开标(与"开始评标"混用)

**Award Notice(中标通知书)**:
甲方向我方正式发出的中标确认文件。是本上下文唯一能触发下一个上下文的事件。
_Avoid_: 中标结果(太宽,含落标)、成交通知

**Award Outcome(中标结果)**:
一次投标的最终结局,取值:中标 / 未中标 / 主动弃标。含结果日期与原因。
_Avoid_: 结果(任何含糊说法)
# 项目上下文 project-delivery

中标后进入内部交付与评审阶段的信息对象。仅由 Award Notice 触发创建。

## Language

**Project(项目)**:
中标通知书生效后,公司正式启动的一次内部交付活动。是本上下文的根实体。
_Avoid_: 工程、订单、标的

**Project Initiation(立项)**:
把已中标的投标机会登记为公司内部项目的动作。此前不得存在 Project。
_Avoid_: 建项、立项申请(与审批动作混用)

**Economic Review(经济评审)**:
对项目的成本、预算、付款与保证金等经济条款的独立评审。
_Avoid_: 财务评审、成本审核、商务评审

**Technical Review(技术评审)**:
对项目的技术方案、工期、资源与实施可行性的独立评审。
_Avoid_: 方案评审、技术审核

**Review Verdict(评审结论)**:
一次评审给出的正式结论。取值:待审 / 审核通过 / 附条件通过 / 退回修改 / 否决。
_Avoid_: 评审状态、审核标志、isPassed

**Review Comment(评审意见)**:
评审人针对某一具体条款提出的可追溯书面意见,含提出人与处理状态。
_Avoid_: 备注、说明
跨上下文的一条关键词:字典项

Dictionary Entry(字典项)/ Qualification(资质)/ Counterparty(合作方)属于被两个上下文共享的基础信息。它们必须放在各自的 GLOSSARY 之外单独成章,并在 GLOSSARY-MAP.md 的 Relationships 段写清依赖方向:两个上下文都依赖它,它不依赖任何上下文。这条写完之后,第 07 章的"宽重构"判定才能有依据。

5.3 三条候选 ADR 的判断

技能对 ADR 的把门极严——必须同时满足三条:难以逆转 / 缺了上下文会让人困惑 / 是真实权衡的结果。缺任一条就不写 ADR。按此筛:

候选 ADR难逆转?缺上下文会困惑?真实权衡?结论
ADR-0001 BidOpportunity 与 Project 分离是。一旦拆开,历史数据与所有引用都要迁移。是。后人会问"为什么中标是两张表"。是。代价是 JOIN 与数据迁移;收益是状态机不再分叉。写 ADR
ADR-0002 评审结论用枚举不用布尔是。扩散到全系统后要改无数分支。是。后人会想加第 6 种是否被允许。是。枚举不够灵活,换来的是穷尽性。写 ADR
ADR-0003 字典项只能 expand–contract 变更是。定了之后不能给字典项改名。是。后人会问"为什么不能直接改名"。是。牺牲便利换取可回滚。写 ADR
反例 用 MyBatis 而不是 JPA是。但……——否。多半是路径依赖而非权衡。不写

对照:还会触发 ADR 的情形之一是"用户在 grill 中以一个站得住的理由否决了某个候选"——此时应主动提议:"要不要把你这个理由记成 ADR,免得以后的架构复查又推荐一遍?"

06接缝:整个方案的地基在哪里

tdd 技能有一条极硬的规则:"只在事先约定好的接缝处写测试。没有确认过的接缝,一个测试都不许写。"对一个没有测试的十年系统,这条规则会立刻暴露真正的问题——你现在根本没有可用的接缝。

6.1 第一张 ticket 永远是表征测试,不是新功能

这里要引入技能包之外的一个必要补充:Michael Feathers 的表征测试(characterization test)。技能作者自己强调他关心的是"care about the design of the code",但没写如何处理零测试遗产,而 Feathers 的做法正好补上缺口:

1
先把当前行为冻住
对你即将要改的那段旧代码,写一批测试,断言它现在实际做了什么(哪怕那是 bug)。目的不是验证正确性,而是锁定"改完之后行为有没有意外变化"。
2
再用红-绿循环加新能力
安全网织好之后,才开始 tdd 真正的循环:先写失败的测试,再写最少的代码让它通过,一个垂直切片一个循环。
3
旧的单测该删就删
DEEPENING 里的策略叫 replace, don't layer:一旦在深模块接口上有了新测试,旧的浅模块单测是净负担,删掉,不要叠加。
对照 Java 生态

表征测试在 Java 里通常有两种载体,选哪种取决于"输出是否是结构化清单":

  • Approval / Golden Master 风格:把一个复杂对象(报价单、评审结论聚合)整体序列化成文本作为基线快照。适合"输出是一张大清单且你不敢保证自己算得对"的场景。注意:基线第一次必须由人逐字段验收一次,否则演变成"把现有 bug 刻成石碑"。
  • 普通 JUnit 断言:适合单一返回值、明确的计算。优先用它,因为它的失败信息可读。

6.2 这个系统的四层接缝地图

把 73 万行按"测试它需要付出多少"重新分层,会得到下面这张图。深浅不是艺术效果,而是单位时间能得到多少次反馈。

层(上=离数据库近,下=离规则近) 反馈成本 推荐测试密度 Controller / View 参数绑定、权限校验、视图渲染 典型形态:和事务注解、拦截器纠缠在一起 分钟级 需启动容器 不写单测 仅少量端到端冒烟 Application Service(@Service) 编排、事务边界、跨模块调用 五个子模块最容易在这里长成宽度接口 秒至十秒级 可用切片 + 替身 中等 集成 + 契约测试 Domain / 规则核心(纯 Java) 资金与报价计算、评审结论状态机、有效性校验 不依赖 Spring、不碰数据库、不做远程调用 毫秒级 无需任何基础设施 主力 绝大多数测试写在这 Persistence / 外部系统 MyBatis Mapper、外部 HTTP 接口、文件与报表导出 属于 DEEPENING 分类里的 external 依赖 分钟级 库、容器、三方服务 少量 仅测 SQL 与字段映射 目标接缝:压在 Domain 与 Service 之间 判定法:若测一条业务规则必须启动容器,说明接缝位置放错了 —— 是模块形状的问题,不是"只能写集成测试"
图 3 四层接缝地图。绿色范围(L3)应承载绝大多数测试。绿线是目标接缝位置:把业务规则从 Spring 与持久层里剥离出来,是让 TDD 循环在这个系统上成立的最小必要的那个动作。

6.3 依赖四象限:决定每个接缝要不要加 port

技能给出一张判断表,用来决定"这个接缝值不值得抽象出一个接口"。核心纪律是 T3:只有一个适配器的接缝是假的,别加。

依赖类别在你系统里的实例接缝条件处理方式
1. 进程内
纯计算、无 I/O
报价计算、税率、评审结论流转永远可以加深直接合并进深模块,通过接口测。不需要 port。
2. 可本地替换
有本地替身
数据库(H2 / Testcontainers)、文件系统替身存在即可加深接缝在模块内部,不出现在外部接口上。
3. 远程但自有
自己的其他服务
公司内部的其他 Maven 模块、内部网关需定义 port在接缝处定义 port,生产用 HTTP 适配器、测试用内存适配器。
4. 真正的外部
三方服务
外部招标信息源、短信/开票网关注入 + mock把外部依赖作为注入的 port,测试提供 mock 适配器。

来源:skills/engineering/codebase-design/DEEPENING.md。原词为 In-process / Local-substitutable / Remote but owned / True external。

6.4 三条反模式:技能自己点名的坏测试

反模式在这个系统上会长什么样识别 / 修正
同义反复式断言assertEquals(add(a,b), a+b);或者直接把被测代码的返回值手抄成期望值。期望值必须来自独立的事实来源:已知的标答、手算的算例、规格里的条款。这种测试结构上不可能失败。
横切式测试先把五个子模块的所有测试写完,再统一写实现。批量测试验证的是想象中的行为,而且会在理解实现之前就锁定测试结构。改用垂直切片:一个测试 → 一个实现 → 再下一个。
为测而抽却丢掉局部性把一段又长的 Service 里的某个方法抽成 static 纯函数去测,但真正的 bug 都在怎么调用它的地方。improve-codebase-architecture 特意点了这一条:抽出来的纯函数好测了,但复杂性只是搬了家。修正方向是加深模块,而不是抽出纯函数。
一条容易被忽略的规则

tdd 明确写着:"重构不属于循环的一部分"。红 → 绿这段时间里只做一件事:写最少的代码让测试通过。重构属于评审阶段(交给 code-review)。这条规则对"看到老代码就想顺手改"的工程师尤其难遵守,但它是 implement-spec 里"每个子智能体一个 worktree、互不污染"能成立的前提。

07拆票:五个子模块的任务图与那个"宽重构"陷阱

to-tickets 把工作拆成追踪弹式的垂直切片,每张票声明它阻塞谁。它同时有一条极其重要的例外规则,而这条例外恰好命中你的"基础信息维护"。

7.1 垂直切片的三条硬规则

每条票在发布前必须亲自问过人三个问题:颗粒度合适吗?阻塞边对吗(每张票只依赖真正门控它的票)?有没有该合并或该再拆的?迭代到人认可为止。

7.2 那个例外:什么叫"宽重构",为什么要排除出垂直切片

技能原文的定义

宽重构 = 一个机械性改动(改一个列名、改一个共享符号的类型),其爆炸半径横跨整个代码库,单次改动会同时打断上千个调用点,因此没有任何垂直切片能保持绿色。

处理方式不是硬塞进追踪弹,而是排成 expand–contract 三段:

  1. Expand(扩展):把新形态加在旧形态旁边,什么都不会坏。
  2. Migrate(迁移):按爆炸半径分批搬运调用点(每包一批、每目录一批),每批一张票,都阻塞于 expand。因为旧形态还在,所以每批之间 CI 都是绿的。
  3. Contract(收缩):确认无人调用后删掉旧形态,这张票阻塞于所有迁移批次。

技能还给出最后一道保险:如果连批次都无法各自保持绿色,就让它们共用一个集成分支,全部阻塞在一个"集成并验证"票上,此时"绿"只在这一处承诺。

在你的五个子模块里,属于宽重构的典型情形是:

情形判定为什么跳过垂直切片
给"评审结论"从 int 换成枚举宽重构所有读 status 的地方一起断。必须先加枚举列并双写(expand),再分批迁移读取点。
改一个被全系统引用的字典项字段名宽重构引用点可能上百。且需按第 5.3 节 ADR-0003 走。
调整"基础信息维护"的审批流垂直切片若只影响维护入口本身,可以纵向切。
新增"投标基础信息"子模块垂直切片全新代码,天然纵向。
把 BidOpportunity 从 Project 表里拆出来宽重构这是最典型的:一张表两个概念。必须同时保持两形态共存。

7.3 五个子模块的任务图

下图给出一组推荐的任务图。"前沿(frontier)"是所有前置都已完成、可以立刻开工的票的集合——这个概念在 to-tickets、grilling、implement-spec、wayfinder 四个技能里反复出现,是这套方法论的核心概念之一。

任务图 · 箭头即 blocked by · 同一列可并发 T1 前置 表征测试 锁住旧行为 T2 前置 秒级反馈 mvn -pl 切片 T3 宽重构 概念分离 expand 阶段 T4 投标基础信息 垂直切片 T9 宽重构 基础信息改造 expand–contract T5 中标结果 含落标与弃标 T6 项目立项 通知书触发 T7 经济评审 枚举结论 T8 技术评审 共用引擎 初始前沿 = {T1, T2} 两张票无前置、互不依赖,可以立刻并发推进;T3 之后每次分裂都重算前沿 T9 是宽重构,不是垂直切片 它内部再拆成 expand / migrate×N / contract 若干票 T7 与 T8 应共用评审引擎 两者的差异是评审项定义,不是流程本身 发布形态:本地 Markdown 追踪器时,票写在 .scratch/project-planning/issues/NN-slug.md;GitHub / GitLab 时用平台原生 blocking 关系。 票的正文禁止写文件路径与代码片段 —— 它们会飞快过期。例外:原型产出的精简片段(状态机、表结构)可以内联。
图 4 推荐任务图。注意 T1 / T2 两张前置票本身不交付任何业务功能——它们买的是"后面每一张票都能安全推进"的权利。跳过它们,后面每一张票都要额外付一次返工成本。

7.4 对照:怎样才算切得好

✓ 好的切片

  • 一张票能在一个全新上下文窗口里做完。
  • 完成后单独可演示:如"能在列表页看到一条含三个标段的投标基础信息"。
  • 穿过所有层:表、服务、接口、测试全都动了。
  • 只依赖真正门控它的票。

✗ 坏的切片

  • "先把五个子模块的 Entity 和 Mapper 都写完"——横向切片。
  • "重构评审模块"——没有完成定义,也装不进一个窗口。
  • "统一改字典字段"——宽重构伪装成切片。
  • 所有票线性串联——没有可并发的前沿,等于放弃 implement-spec 的主要收益。

08证据全景:正反同列,并标注证据强度

这一章把支持与反对的证据放在同一张表里。任何只引一边的结论都不可信——尤其当一个 25 万+ 星的技能包正处在舆论的顺风上时。每条都标注来源、年份与证据强度:RCT > 受控实验 > 大样本观察 > 自报调查 > 单一案例 > 建模。

8.1 主证据:为什么在这个系统上,"先用起来"大概率是错的

支持/反证据来源 · 年份强度内容对本系统的适用度
支持 AI 在成熟大仓库上让资深开发者变慢 METR RCT · 2025-07 RCT(最高) 16 名资深开发者、246 个真实任务,仓库平均超过 100 万行、平均 10 年历史。随机分组后,允许用 AI 的一组完成时间增加 19%。更关键的是:参与者事前预测会快 24%,事后仍认为快了 20%。接受率低于 44%,约 9% 的任务时间花在审阅 AI 输出上。 高——画像几乎完全吻合:规模同量级、年限吻合、开发者熟悉度高。这是本报告最重要的一条证据。
支持 AI 是放大器,紧耦合系统收益最小 Google Cloud DORA · 2025 大样本调查
n≈5,000
"AI 放大既有强弱而非均匀普适"。AI 采纳与交付吞吐量首次转为正相关,但与交付不稳定性仍正相关。明确指出:紧耦合架构 + 缓慢反馈循环的团队几乎看不到收益。个体效能的正向效应在全部指标中最大。 高——15 个模块共享 reactor 正是"紧耦合"的定义场景。
支持 默认工作模式会挤掉"整理" GitClear 纵向研究 · 2025 大样本观察
2.11 亿行变更
2020—2024 年间:被移动/重构成行占比 24.8% → 9.5%;复制粘贴行 8.4% → 12.3%;含 5 行以上重复块的提交增长约 8 倍;变更流失率 3.3% → 5.7%。2024 年是数据集中第一次出现"复制 > 重构"。 高——这直接预测了你们仓库若不做防护会变成什么样。
反证据 Copilot 组任务完成数 +26% MIT / Princeton / UPenn · 2024 受控 + 观察
4,800 名开发者
覆盖 Microsoft、Accenture 与一家财富 100 强。使用 Copilot 的开发者平均多完成 26% 的任务。 中——场景差异巨大:多为隔离、规模较小的任务,不是十年单体上的功能改造。
反证据 受控实验中快 55.8% GitHub 官方实验 受控实验 另一个经常被引用的数字:持 Copilot 的开发者完成同一任务快 55.8%;并报告可读性 +3.62%、可维护性 +2.47% 等小幅正向。 低——任务是孤立的、无历史的,与"在三百万行上下文里加一个受限于业务铁律的功能"不可比。
反证据 质量并非必然下降 Qodo 数据
(厂商来源)
厂商数据
强度最低
AI 工具结合 AI 代码评审时,团队报告质量改善者达 81%,而只用 AI 工具不做自动评审的为 55%。 中——强度低,但它指向的结论与本报告一致:差别在于评审这一个变量。
背景 维护成本是常态而非意外 Stripe Developer Coefficient · 2018 自报调查
n=1,000+ 开发者 / 1,000+ 高管
开发者每周 17.3 小时用于技术债与坏代码(13.5 + 3.8),占 41.1 小时工作周的 42%;并外推出约 3,000 亿美元的全球产出损失。 中低——自报且数据已过多年,只能当背景锚点,不能当预算依据。
背景 信任赤字真实存在 Stack Overflow 开发者调查 · 2025 调查
(经 DORA 综述引用)
对 AI 输出不信任度 46%、信任 33%;另有 66% 表示修复"差一点就对"的 AI 代码比自己写更花时间。 中——二手转述自综述报道,原始问卷未直接核验;但与 METR 的"审阅开销"互相印证。

8.2 J 曲线:这笔学费要交多久

DORA 团队把 AI 采纳早期的稳定性下滑明确称为"expected J-Curve (or tuition cost)"——并给出了压平曲线的处方:投资平台工程 + 强版本控制实践 + 小批量size。这条处方与本手册第 06、07 章的建议是同一件事的两种说法。

净交付速度相对基线(基线 = 100) 80 90 100 基线 110 120 130 学费期 88 100 回本 118 130 第 0 周 第 2 周 第 6 周 第 12 周 第 24 周 谷底成因:织表征测试、改 CI 切片、建术语表 —— 三件都不产出业务功能 压平方式(DORA 处方):投资平台能力 + 强版本控制实践 + 小批量提交
图 5 J 曲线示意。建模值曲线的形状有文献依据(DORA 明确描述了先降后升的学费期),但具体的百分比与时间坐标是本文的建模假设,不是某个实测样本。正确使用姿势:用它来对齐"前六周会变慢"的预期,不要在立项会上当承诺。
三条反向校验

① METR 作者自己列了一张"我们不提供证据的主张"清单,明确没有主张"大多数开发者的多数场景"或"未来不会变快",甚至明说"显然存在能取得正收益的使用方式"。引这条数据时不能过度外推。

② GitClear 反映的是相关性而非因果:它的 diff 分类无法区分"团队有意识地少重构"与"AI 导致的复制"。但它与 METR 的"接受率不足 44% + 大改后再提交"描述了同一个现象。

③ 正反证据没有被隐藏:隔离任务上的确显著更快。真实结论因此是条件的——收益取决于任务是否与庞大的隐含上下文耦合,而这恰好是你这类系统的定义特征。

09度量:怎么知道它到底有没有用

METR 那 19% 与开发者自认为快 20% 之间的缺口,直接推出一条度量原则:主观感受不能参与度量,只能作为线索。下面是三层指标与四条防作弊原则。

9.1 三层指标

层指标怎么测为什么是它
L1 输入
(采纳广度)
被标记为 ready-for-agent 的票占比跟踪器里的标签计数。它衡量的不是"用了多少 AI",而是有多少工作被 grill 到了能安全交给智能体的程度。
L2 过程
(效率)
单模块构建-测试墙钟时间(P50 / P90)定时跑 mvn -pl <mod> -am test 并上报。一号指标。它是反馈速率的直接代理,也是 T1 那条理论的可观测量。
单票周期 P50 / P90票创建到关闭的时间戳差。比"工时估计"客观,而且能暴露被卡在哪一层。
L3 结果
(质量)
变更失败率 / 回滚率发布后 7 天内需要热修或回滚的变更占比(DORA 四指标的变形)。这是唯一能证伪" AI 让我更快"这件事的指标——速度可以自欺,回滚不能。
重复块增量 / 重构行数占比本地跑一次 GitClear 式的 diff 分类(或用 SonarQube 的重复行指标)。直接监测第 6 章的 prediction:若 重构占比在下降而重复在上升,说明 AI 正在给这座仓库加债。

9.2 四条反 Goodhart 原则

  1. 绝不把"AI 生成的行数"当产量。它同时是分子也是分母的一部分——GitClear 的重合数据已经证明这条会导致什么。
  2. 每个速度指标配一个质量指标成对看。单票周期 P50 下降而回滚率上升,结论是"变快了她——但没有用",不能只报前者。
  3. 优先采用不可人为修饰的客观指标。构建墙钟时间、回滚率、CI 红灯数都不由填报者决定;自评量表最容易漂移(这正是 METR 那 39 个百分点的缺口)。
  4. 基线必须先测两周。没有基线的任何百分比改善都是无从验证的主张。建议把 T1 / T2 两张前置票的周期当作天然基线段。
一个便宜但是有效的起点

不要一上来做看板。抓起三个数字就足够启动:① 单模块测试墙钟时间(每天自动跑一次);② 回滚/热修率(每周一次);③ ready-for-agent 票占比(每周一次)。等到这三条曲线稳定两周、有了真实基线,再考虑加指标。度量体系本身也应该遵循"小批量"。

1090 天落地路线图

这份路线图有一个反常识的安排:前三十天禁止让智能体生成任何业务代码。理由是第 08 章的证据——在紧耦合、慢反馈、高默契约定的系统里,先把前置的安全网与快速反馈建好,是唯一能把 J 曲线压平的做法。

10.1 成熟度阶梯:先判断自己在哪一级

成熟度阶梯 · 每级必须先满足左侧全部条件才允许进入右侧用法 L0 裸奔 直接让智能体改代码 无术语表、无测试 CI 只有编译这一关 L1 有语言 建立了 GLOSSARY 关键决策写成 ADR 会话前必做 grill 允许:解释旧代码 写文档、生成测试用例 禁止:改动业务逻辑 L2 有安全网 改动处已表征测试 测试能独立跑通 失败时能看出改了啥 允许:单张切片票 一次一个垂直切片 必须走红绿循环 禁止:跨模块改动 禁止:顺手重构 L3 有快速反馈 单模块测试进 60 秒 自动检查已接入 CI 规则由 ArchUnit 承载 允许:多前沿并发 子智能体各占 worktree 双轴代码评审 宽重构走三段式 此时 implement-spec 的并发收益才真正 能够兑现 L4 有度量 三条基线跑满两周 回填率与墙钟时间 进入趋势图 retro 已常态化 允许:自行调配 哪些工作交给智能体 基于自家数据决定 标志: 可以回答"我们到底 有没有变快",而且 答案不是靠感觉 而是靠那三条曲线 起步判定:你的系统目前大概率在 L0,目标是在第 90 天稳住 L3,并在第 4 个月达到 L4。
图 6 五级成熟度阶梯。每一级都同时规定"允许"与"禁止"——这是有意的:只写"允许"的规范会被解释成"没禁止就行"。

10.2 90 天安排

90 天路线图 · 前 30 天不产出业务功能 W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 术语与 ADR 基线 grill 两轮 表征测试安全网 只覆盖即将触碰的代码 秒级反馈与静态检查 一号指标上线 T3 概念分离 expand 新旧两形态共存 T4 投标基础信息 第一个真切片 T5 中标结果信息 含落标弃标 T6 项目立项衔接 通知书触发 T7 / T8 双评审 共用引擎 T9 基础信息宽重构 migrate 分批 · 每批 CI 必须绿 retro 双周复盘 虚线框 = 宽重构批次;每批都必须单独保持 CI 绿色,最后由一张 contract 票统一收尾。 前四周的时间原则上不交付任何业务功能:建文档语言、织安全网、把反馈拉进一分钟。
图 7 90 天甘特示意。周数为相对节奏而非承诺日历。两条硬约束:前三行的三条前置任务不能压缩;真正能压缩的是后面业务票的并行度。

10.3 投资配比建议

投入方向建议配比理由
反馈通道(测试速度、CI 切片、静态检查)40%这是唯一对后续所有工作产生乘数效应的投入。对应 T1、T6 与第 9.1 节的二号指标。
术语与规格(grill、GLOSSARY、ADR、票)25%决定返工率。在一个误解成本极高的系统里,这部分最容易被砍,也最不该被砍。
业务功能实现25%看起来偏低,但在前置就绪后,这一块的实际速度会被抬起来。
度量与复盘10%三条曲线 + 双周 retro。没有它,你无法证伪,也就无法知道该停还是该加。

10.4 本地化:至少自研这三个技能

作者的原话是"Hack around with them. Make them your own."。下面是针对本系统最值得自己写的三个技能,都遵循同一套格式约定:YAML frontmatter + 极短的正文 + 按需引用的附属文件。

草案 A · 快速反馈通道(建议命名 legacy-fast-feedback,模型可调)

---
name: legacy-fast-feedback
description: Use when running or changing tests in this Maven reactor, or when a
  test command is needed. Knows which modules are cheap to test alone and which
  fan out through -am.
---

先跑 docs/agents/feedback-baseline.md 里记录的最快命令。
对目标模块优先尝试:mvn -o -q -pl <mod> -am -DskipITs test
不得使用全量 reactor 构建来验证单个模块。
若某模块 -am 会拖入超过 4 个模块,先查阅上述文档里的替代切片。

禁止为了"能跑起来"而跳过测试(-DskipTests / -Dmaven.test.skip=true)。

草案 B · 模块边界守门(建议 maven-boundary-guard,模型可调)

---
name: maven-boundary-guard
description: Use when adding imports across Maven modules, adding a dependency to
  pom.xml, or placing a new class. Classifies each dependency into the four
  DEEPENING categories.
---

跨 import 或新增 pom 依赖前,先回答三个问题:
1. 这次依赖属于 in-process / local-substitutable / remote-owned / true-external 哪一类?
2. 若为 remote-owned,接缝处是否需要 port?是否已有两个及以上适配器?
   只有一个适配器的接缝是假接缝,不要引入。
3. 新增的类不得同时承担业务规则与 I/O。业务规则必须独立于 Spring 容器可实例化。

违反第 3 条时,先在 target seam 处剥离规则,而不是写集成测试绕开。

草案 C · 遗留代码安全网(建议 legacy-safety-net,用户可调)

---
name: legacy-safety-net
description: Weave characterization tests around a piece of old code before any
  change is allowed to touch it.
disable-model-invocation: true
---

改动任何十年以上、无测试的旧代码之前:

1. 找出即将被触碰的最小行为集合(一个服务方法的输入/输出,或一张表的写入结果)。
2. 用 JUnit 或 Approval 风格把"它现在实际做什么"冻结下来。允许对现有 bug
   做记录性断言,并在测试名里标注 @Characterization 与日期。
3. 基线第一次必须由一个人逐字段过一遍并签字(写在票的评论里)。
4. 测试必须能在 60 秒内单独跑完,否则先处理第 3.3 节的第 4 条测量。

红线:不得在没做完第 2 步的情况下让任何智能体改动该段代码。
写作这些技能时要遵守的格式约定

① 用户可调技能的 description 写给人看,去掉"当用户说..."式触发措辞;模型可调技能反过来,要保留丰富的触发措辞。
② 技能之间互相调用时写 Call the Skill tool with "技能名",不要用相对路径跨目录引用;一次调用只能带一个技能名。
③ 不能让一个技能去调用另一个用户可调技能——需要人做的,就写成"告诉用户去跑 /xxx"。

11反模式清单

每条给症状与修正。症状一律写成"在这类系统上的具体样子"——因为泛泛而谈的反模式,在人们恰好犯了它的时候也认不出来。

11.1 战略层

反模式在你这个系统上的症状修正
把 AI 当成求援信号工期紧了就"让智能体先写一版",跳过术语与测试;理由是"先出东西再说"。承认这是借高利贷。唯一合规的提速是 Ticket 颗粒度变小,不是跳过前置阶段。
用"感觉快了"做立项论据汇报里写"效率提升明显",但没有任何一条第 09 章的曲线。METR 那 39 个百分点的感知缺口是这个问题的直接证据。没基线不算证据。
指望一次 improve-codebase-architecture 解开十年泥球跑完拿到一堆候选,团队很兴奋,然后发现没有一条能直接落地。它只产出候选,然后针对你选中的那一个继续 grill。价值在"持续缩小脂肪",不在"一次换血"。
同时安装两套安装形态插件版与 skills.sh 版共存,每个技能出现两次,改了不生效。文档明确要求二选一。最终形态应为本地化后的 skills.sh 版本。

11.2 工程层

反模式症状修正
横向切片"先把五个子模块的 Entity 和 Mapper 全部生成出来",看起来进展神速。批量产出验证的是想象中的行为。改垂直切片:一条能演示的窄路径走完全部层次。
宽重构伪装成切片一张"评审结论改为枚举"的票改了一百多个文件,最后必须集成分支才能编译。改走 expand → 分批 migrate → contract,每批一张票,每批 CI 绿。
把 Port 当勋章为"将来可能换数据库"给每个 DAO 加了接口,只有一个实现。一个适配器 = 假接缝。等出现第二个真正的适配器时再抽。
为可测性抽出纯函数抽出 static 方法测过了,但真正的 bug 藏在调用它的那几个分支里。这是 locality 缺失。修正方向是加深模块,不是抽函数。
在红绿循环里顺手重构改一个投标字段时顺手"优化"了旁边的命名与结构,diff 涨了三倍。技能写得很清楚:重构属于评审阶段,不属于循环。它是并行实现能成立的前提。
让 AI 写像素复制的代码而不做整合五个子模块各有各的 XxxHelper,逻辑重复但未察觉。code-review 的 Duplicated Code 基线会抓到它;更好的是事前用自动化重复块检查拦住。

11.3 治理层

反模式症状修正
把 CLAUDE.md 写成百科全书根目录的转向文件越长越好几千行,每条都会被推进上下文,而且谁也没验证过是否被遵守。它只放导航指针。具体内容应当由 CODING_STANDARDS.md 与自动检查承担。
用散文规则约束机械性问题"新增类不要跨模块依赖"写进规范,但没人记得住。机械性问题默认做成 ArchUnit / Checkstyle 规则;只有真正的裁量判断才写规范。
ADR 通货膨胀每个技术选型都写一篇,三个月后没人读,真需要时找不到。严格执行三道门槛:难逆转 / 缺上下文会困惑 / 是真实权衡。缺一即不写。
GLOSSARY 里塞实现细节术语表出现了表名、字段名、REST 路径。它只收本上下文特有的概念,且定义"是什么"而非"做什么"。通用编程概念不入册。
跳过 retro项目做完了没任何沉淀,下一个模块重复踩同一个坑。每次办双周 retro,产出按严重度排序的环境改动,且优先落到自动化检查。

12结论与判断

共识(有实测证据支撑)

① 在与你画像吻合的系统上(成熟、大、高默契),现有 AI 编码工具大概率先降低交付速度(METR RCT)。② AI 采纳会提高交付不稳定性,而紧耦合 + 慢反馈的组织收益最小(DORA 2025)。③ 默认工作模式下,代码库的整合类活动占比在下降(GitClear 2.11 亿行)。④ 因此,先建验证能力,再加生成能力这一顺序,是目前证据唯一支持的稳妥解。

本文的判断(这是观点,不是共识)

① 「投标」与「项目」的概念分离,是这五个子模块里回报最高的一件事,高于任何单个功能的交付。这不是证据直接给出的结论,而是依据"降低隐式耦合"的一般原理推导出的判断——需要在 grill 阶段被你们自己的业务专家证伪。
② 前 30 天禁止生成业务代码的安排是可辩护的,但对工期紧的团队可能政治上门槛太高。若必须压缩,至少保留 T1 表征测试这一张票。
③ mattpocock/skills 的真正价值是它把"什么时候该停下来问清楚"写成了可执行的协议,而不是它提供的任何一个写代码的技巧。后者会随模型换代过期,前者不会。

明天早上可以做的一件事

不需要任何审批、不需要装插件:在仓库里新建一个 GLOSSARY.md,只写第 5.2 节里那十几个术语,然后找一个业务同事核对一轮。这件事的成本是半天,收益是——从此你们讨论"项目"这个词时,指的是同一个东西,而且这份共识可以直接被任何智能体读取。

三条最重要的提醒:本手册未访问你的代码库,因此图 1 的架构判断与 5.2 节的术语内容均为待校验的假设;图 5 的 J 曲线是建模值而非实测值;第 1.3 节的成本折算是线性外推的建模结果,不可用于预算。

13参考来源

按证据类型分组。核心部分全部回溯到一手来源——技能的原始 Markdown、研究报告原文、官方博客。

一手来源:技能包本身

  1. mattpocock/skills 仓库 README(我去用作应该注意的 Installing 与 Why These Skills Exist 两节):https://github.com/mattpocock/skills(MIT)
  2. skills/productivity/grilling/SKILL.md — 设计树、前沿、轮次协议,"找事实是你的活"
  3. skills/engineering/grill-with-docs/SKILL.md — 两行:调用 grilling + domain-modeling
  4. skills/engineering/to-spec/SKILL.md — 规格模板、接缝数量、"不超过一个"原则
  5. skills/engineering/to-tickets/SKILL.md — 垂直切片三条规则、宽重构的 expand–contract 定义
  6. skills/engineering/implement/SKILL.md 与 implement-spec/SKILL.md — 上下文指针、前沿并发、worktree
  7. skills/engineering/tdd/SKILL.md — 只测约定接缝、三条反模式、重构不属于循环
  8. skills/engineering/codebase-design/SKILL.md 与 DEEPENING.md — 深模块词汇表、依赖四象限、replace-don't-layer
  9. skills/engineering/code-review/SKILL.md — 双轴并行、Fowler 十二种气味基线
  10. skills/engineering/domain-modeling/SKILL.md 与 GLOSSARY-FORMAT.md — ADR 三门槛、术语表格式
  11. skills/engineering/setup-matt-pocock-skills/SKILL.md — 三 Section、五种 triage 标签、CLAUDE.md 区块
  12. skills/engineering/improve-codebase-architecture/SKILL.md — 五个摩擦探测点、"勘察不是救援"
  13. skills/engineering/retro/SKILL.md — 六个改进类别、机械性问题优先机械化
  14. .agents/invocation.md — 两类调用权的定义与"不得跨调用"的硬约束

一手实证

  1. METR(2025-07):Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity。RCT,16 名开发者、246 个任务,仓库平均百万行级、约十年历史。+19% 耗时,预测 -24%,事后自评 -20%。原文含"我们不提供证据的主张"清单。
  2. Google Cloud DORA(2025):State of AI-assisted Software Development,n≈5,000。AI 是放大器;AI 采纳与交付不稳定性正相关;紧耦合 + 慢反馈团队收益最小。另有 DORA The ROI of AI-assisted Software Development(2026)给出标准化效应量与J 曲线(学费成本)表述。
  3. DORA(2024):n=39,000+。AI 采纳每提高 25%,交付速度下降 1.5%、稳定性下降 7.2%该组数字来自二手报道转述,正式引用前请回到报告原文核对。
  4. GitClear(2025):AI Copilot Code Quality,2.11 亿行变更(2020—2024)。move/refactor 24.8% → 9.5%;copy/paste 8.4% → 12.3%;重复块约 8 倍;churn 3.3% → 5.7%。
  5. Stripe(2018):The Developer Coefficient,与 Harris Poll 合作,1,000+ 开发者与 1,000+ 高管,美英法德新。每周 17.3 小时 / 42% 用于债与坏代码。自报调查,且年份较早
  6. Stack Overflow 开发者调查(2025):不信任 46% / 信任 33%。经 DORA 综述引用,原始问卷建议回溯核对。
  7. Sonar(2023):每百万行代码每年约 30.6 万美元债敞口、约 5,500 修复小时。厂商基准,本文仅用于数量级外推

反证据(有意保留)

  1. MIT / Princeton / UPenn:4,800 名开发者数据,Copilot 组任务完成数 +26%。
  2. GitHub 官方实验:同一任务快 55.8%;可读性 +3.62%、可维护性 +2.47% 等小幅正向。
  3. Qodo(厂商数据):AI 工具配 AI 代码评审时质量改善报告率 81% vs 55%。强度最低,但结论方向与本文一致

方法论补充

  1. Michael Feathers,《修改代码的艺术》:表征测试与接缝的概念来源。技能包本身未覆盖零测试遗产的处理,这里是必要补充。
  2. John Ousterhout,《软件设计的哲学》:深模块原创表述。注意技能包明确拒绝其"行数比值"定义,改用 depth-as-leverage。
  3. David Thomas & Andrew Hunt,《程序员修炼之道》:"反馈的速率就是你的速度上限"。被 README 引用两次。
  4. Eric Evans,《领域驱动设计》:统一语言。被 README 引用来论证 GLOSSARY 的价值。
  5. Martin Fowler,《重构》第 3 章:十二种代码气味,作为 code-review 的默认基线。