AI 编码治理
从「6 行的活写成 600 行」
到「控制系统怎么建」
起源于 2026-08-30 一场争论:「AI 会把 6 行的活写成 600 行,可能搞垮数据库,而我没有判断力」 vs 「这是 harness 和 eval 没做好,是可解的工程问题」。
本主题回答四个问题:AI 为什么过度设计;架构偏好和优先级该怎么告诉它;没有人逐行看代码时可靠性能做到哪一步;人该站在什么位置。
十条结论
如果只读一屏,读这十条。⭐ 一手官方 · ○ 多源共识 · △ 单源推测
第一部分 · 认知框架
这场争论到底在争什么
两个人站在同一条链的不同环节——两边都对一半,而且互补。
现象观察派
- AI 在已上线的消费级系统上做增量改动会过度设计——6 行写成 600 行,可能拖垮数据库
- 审核 Agent 仍有系统性遗漏
- 我没有工程判断力,不知道哪个对
- 结论:AI 替代不了产品经理,也替代不了架构师
工程方法派
- 这是 harness 和 eval 没做好的典型问题
- 根源:优先级不明确、验收标准没提前定义
- 正解:足够上下文 + harness + 提前定义 eval + goal 模式
- 而不是靠更严的人审
前者对「现象」——过度设计真实存在(已通过重复率、churn、复杂度等代理信号被间接量化),审核 agent 有遗漏,判断力今天不可完全替代。后者对「药方」——context + harness + eval + 分级自主确实是行业共识解法,能把人肉判断压缩到少数关键节点。
真正的裂缝
争论的本质不是「AI 行不行」,而是:判断能不能一次性做完,然后交给机器。
答案是:判断可以被工程化地前置,但不能被一次性外包。 三个原因——context 会漂移(项目阶段变了,昨天正确的约束今天是错的);模型会钻 eval 空子(结构性的);harness 会随模型代际过期。
一条必须替换的论据
「AI 已能自主无人干预写出操作系统」——这条查证不成立,不要再用:最佳案例 VibeOS 实为人类与 Claude Code 经 64 次协作会话完成,人类主导架构 ⭐;更自主的版本被实测证伪(不能联网,「能跑 DOOM」是文档幻觉)⭐;Google 宣称的「93 个 subagent 造 OS」背后是一整套数十环节的编排系统,且未公开代码日志、无法独立验证 △。
Anthropic 的 C 编译器项目:16 个并行 Claude、跑了近 2000 个 session、约 2 万美元,做出 10 万行能编译 Linux kernel 的编译器。人类精力主要花在 tests、environment、feedback 上,后来必须加更严格 CI 防止 agent 每加一个 feature 就破坏旧功能 ⭐。
它同时证明了两件事:长程自治可行;且可行性完全建立在人类设计的验证环境上。这是「harness 比模型重要」的一手证据,而不是「已无需人类判断」的证据。
把「过度设计」拆开:四类失效,四种药
一个词包打天下,就会用错药。「过度设计」混着四类完全不同的失效。
| 层 | 典型症状 | 人要不要逐行判断 | 正确载体 |
|---|---|---|---|
| A. 功能正确 | 逻辑错、边界漏、批量文件改错 | ❌ 不必 | 测试 + 类型 + Stop hook + 完成条件 |
| B. 生产属性 | N+1、缺索引、无超时、无回滚、P99 崩 | ❌ 不必(人只定预算数字) | 性能/数据 fitness function,自动门禁 |
| C. 架构演进 | 6 行变 600 行、过早分层、为可扩展而可扩展 | ⚠️ 只定「变更等级」和「已锁决策」 | Constitution + ADR + 变更分级 + 举证责任 |
| D. 产品判断 | 做了没人要的功能、优先级错、体验手感差 | ✅ 这是人的活 | 人 + golden tasks + 用户反馈 |
三组必须分清的概念
Verification vs Validation。 harness 能保证「按 spec 做对了」(verification),保证不了「spec 本身对不对」(validation)。前者可以压到接近全自动,后者永远需要人给出目标函数。
绿地 vs 棕地。 从零做编译器、内核证明的是「在可重来、测试密、目标清楚的环境里长程执行很强」——它不能外推到「在带真实数据、历史包袱和隐含约束的已上线系统上安全做增量改动」。这两件事的难度不在一个量级。
能力 vs 权限 vs 责任。 模型有能力做某事,不等于该给它权限做,更不等于出事时有人负责。这三个面必须分开设计。
根因不止一个
「优先级没被写进项目指令」是最流行的归因——方向对,但被说成了唯一根因,证据不够格。
更诚实的说法是五个可以独立致错的诱因:
| 诱因 | 说明 | 证据 | 解法 |
|---|---|---|---|
| 1. 模型默认偏好 | 训练语料里的「好工程」就是分层、抽象、防御性。不写就是你说了不算 | ⭐ | 显式最小性约束(scope 指令 + 举证责任) |
| 2. 规格不正确 | 你要的东西本身没说清——可能是最根本的一层 | — | spec 流程 |
| 3. 优先级未编码 | 模型不知道这个项目、这个阶段、这个负载下什么值得优化 | ○ | 优先级契约 |
| 4. 激励错配 | eval / 完成标准指向了错误的方向 | ⭐ | eval 治理 |
| 5. 上下文缺失 + 权限过宽 | 看不到现有实现所以重造,同时又有权限直接建表、加依赖 | ○ | 上下文工程 + 权限面收窄 |
一个量化对照:「6 行 vs 600 行」最接近的量化证据
2026 年的一项对照实验 ⭐:同一个任务,仅仅因为需求描述的措辞不同,代码量发生剧烈变化——
判断为什么必须前置
「我看不出 600 行对不对」不是个人能力问题,是流程设计问题。
后置判断在数学上就不成立
agent 的产出速度是人类的数十到上百倍,评审队列的处理速度没有等比例提升。结果只有两种:要么 agent 被人卡住(吞吐优势消失),要么人开始橡皮图章(门形同虚设)。判断不该发生在读 600 行的时候,该发生在写第一行之前。
前置的判断有三种可执行形态
数字
P95 < 300ms、单请求 SQL ≤ 4、DB CPU < 65%、订单表 2000 万行。这些是契约的输入,不是技术细节。技术弱的负责人知道这些数字——缺的只是没人告诉他这些数字就是架构治理的全部输入。
禁区
不新增依赖 / 表 / 队列 / 缓存 / 服务 / 抽象层,除非本次任务明确要求。负向清单比正向清单有效得多,因为它可验证。
举证责任
超出禁区就必须解释「为什么更小的方案不够」(见第 06 章)。
第二部分 · 方法论
优先级不是排序,是三层契约
「防御性 vs 性能哪个优先」是个错问题——把不同性质的东西塞进了同一个排序。
给 AI 一串全局排序(安全 9 分、性能 8 分……)会产生两个后果:一是它在模糊 trade-off 上乱裁;二是任何「好东西」都能被论证成高优先级,于是全都做。「永远安全第一」会让模型给内部工具函数加三层校验和熔断;「永远可扩展」会让 6 行变 600 行。
正确结构:三层
不排序,全部必须满足;违反即失败
不丢数据、不绕过鉴权、不泄露密钥、不直改生产数据、schema 变更必须有兼容与回滚方案、租户隔离。
必须达标的数字
API P95 < 300ms、错误率 < 0.2%、单请求 SQL ≤ 4、DB CPU < 65%、首屏 < 2s、锁等待 P99 < 50ms。
按本次变更的类型给,不是全局给
S 外科手术 → M 功能增量 → L 新模块 → X 事故,每类的优先顺序不同(见下表)。
按变更类型给偏好(关键的一步)
| 变更类型 | 默认优先顺序 |
|---|---|
| S 外科手术(1–2 文件、无 schema) | 正确性 → 贴合现有风格 → 性能 |
| M 功能增量(同模块内) | 正确性 → 触碰路径的性能 → 已在中间件里的安全不变式 |
| L 新模块 / 新存储 / 新公共 API | 安全与数据安全 → 正确性 → 可运维性 → 性能 → 可扩展性 |
| X 事故 / 数据路径 | 数据安全与可回滚 → 止血 → 然后才是正确性 |
规则:可扩展性对 S/M 类永不默认开启。「出现了第二个调用方」是抽取接口最常见的合法理由——但必须是当前就存在的理由,不能是「以后可能」。
非目标:抑制过度设计最有效的单条信息
在 spec 的五层结构里,「显式不做清单」是最常被忽略、也最能防过度设计的一层 ○:
- 当前不做多区域、多活、微服务化
- 当前不支持假设中的第三个支付渠道
- 当前不建通用插件框架
- 当前不为 100 倍流量优化
- 当前不因为「未来可能用到」增加消息队列、事件总线或第二数据库
非目标的威力在于它可验证:AI 加了消息队列,你不需要判断队列设计得好不好,只需要指出它违反了非目标清单第 5 条。
6 行 vs 600 行的真正开关:举证责任倒置
不要问「这 600 行对不对」,要让 AI 回答「为什么更小的方案不够」。
举证责任从人转给 AI 之后,技术弱负责人的任务从「读 600 行代码」降级成「读一段自然语言的理由」——后者他有能力判断。判据很好用:如果理由里出现「以后可能」「更灵活」「更规范」「方便扩展」,却说不出今天就存在的具体问题——打回去用最小方案。
已产品化的实现:Spec Kit 的 Complexity Tracking ⭐
GitHub Spec Kit 的 plan 模板里有一段必填表,是目前唯一公开的结构化「必须证明为什么不能更小」机制:
Complexity Tracking: Fill ONLY if Constitution Check has violations that must be justified | Violation | Why Needed | Simpler Alternative Rejected Because | |------------------------|----------------|--------------------------------------| | [e.g., 4th project] | [current need] | [why 3 projects insufficient] | | [e.g., Repository pat.]| [specific problem] | [why direct DB access insufficient] |
为什么不能把行数设成硬门 ⭐两源交叉
把 diff 行数设成 CI 硬拦截会诱导新的失效:AI 学会少换行、把逻辑塞进已有函数、写迎合规则的断言。代理指标一旦成为唯一硬门就会被 Goodhart 反噬。 正确用法:行数超标 → 触发解释与升级,不直接判错。
真正该测的是「变更面」:新增了多少状态、依赖、部署单元;有没有数据迁移;引入了哪些新的故障模式;增加了几个运维步骤;回滚难度变化。
可直接抄的三层触发器清单 ⭐
| 层级 | 内容 |
|---|---|
| Always 无需请示 | 提交前跑测试;遵循命名约定;错误记录到监控服务 |
| Ask first 必须先问 | 改数据库 schema 前先问;新增依赖前先问;改 CI/CD 配置前先问 |
| Never 无条件禁止 | 永远不提交密钥或 API key;永远不编辑 node_modules/ 或 vendor/;永远不在未经批准的情况下删除失败中的测试(直接对应第 08 章作弊风险) |
让规则长牙:软层与硬层的分界
纪律属于流水线,不属于模型自觉。
"Settings rules are enforced by the client regardless of what Claude decides to do. CLAUDE.md instructions shape Claude's behavior but are not a hard enforcement layer."
— Anthropic 官方 memory 文档原文 ⭐ · 2026 年最值得记住的一条架构判断
三层治理结构
constitution / steering docs / PROJECT-PRIORITIES.md
项目使命、硬约束、优先级契约、技术栈边界、非目标。约束所有后续生成
AGENTS.md / CLAUDE.md(短)
分层规则、依赖方向、禁止清单。每次会话可见,但只是建议
架构测试 + 自定义 lint + CI + hooks
分层违规→构建失败;query 计数超阈值→测试失败;EXPLAIN diff→门禁。长牙的规则
架构规则的机械化工具矩阵 ⭐
| 生态 | 工具 |
|---|---|
| Java / Kotlin | ArchUnit(金标准,规则即单测) |
| TS / JS | dependency-cruiser、eslint-plugin-boundaries、madge(环检测)、knip(死代码) |
| Python | import-linter(layers contract,拒绝跨层导入含间接) |
| .NET | NetArchTest、Roslyn analyzers |
| Go / PHP / 多语言 | depguard;Deptrac、PHPArkitect;Semgrep(自定义跨语言规则) |
真正有效的规则不是「代码要优雅」,而是可判定的句子:ui 不能 import repository、payments 不能直接读 users 表、禁止循环依赖。两条落地要点:① 部署走四步 audit → baseline → enforcement → 规则写手册;② 错误消息要写成教练而不是堆栈——告诉 agent 违反了什么、允许的替代路径是什么,这样它能自己修完重试形成闭环。先 regex 后成熟工具是合法路径——「Ugly enforcement beats elegant aspiration.」
分层不要照抄
那份被广泛传播的六层规范(Types → Config → Repo → Service → Runtime → UI)出自某公司约百万行全 agent 生成代码库 ⭐,但它是那个仓库的解,不是普适解。真正该固定的只有三样,层数与抽象都可以延后:
① Ownership:谁拥有哪些数据(Payment owns payments,Order owns orders) ② Dependency direction:谁可以依赖谁,禁止循环 ③ Public boundary:跨域只能从指定入口进(paymentService.getPaymentStatus() 可以,db.payment.find() 不行)
// 边界要严格,层数要克制
不要跨域访问数据库 → 强规则
不要出现循环依赖 → 强规则
必须给每个 Service 加接口 → 不一定
必须用 Repository pattern → 不一定
必须为未来扩展建抽象 → 通常不要
规则文件本身会腐烂
指令文件要当代码管理(长度上限、死链检查、规则分级);可常驻 doc-gardening agent 扫描过时文档并开修复 PR。最重要的一条:每条规则必须对应一个执行方式(hook / lint / CI / 人工门)——没有对应执行的规则是装饰。
eval 的反直觉:它会放大你定义的东西
eval 是放大器,不是解药。
Anthropic 自己的 long-running harness 实验:给 Planner 的提示是 "be ambitious about scope",eval 含 "product depth" 维度。输入需求是「做一个 2D 复古游戏制作器」——输出被扩展成 16 个 feature、10 个 sprint,自动加入动画、声音、AI sprite 生成器、分享链接。且观察到:随着 evaluator 不断要求改进,implementation complexity 往往越来越高。
这是一个高质量地完成了错误优化目标的系统。正确公式不是「有 eval → 好」,而是:AI 会强化优化你定义的 eval。eval 里必须有一条负向的最小性指标(diff 规模、新增抽象数、新增依赖数)与质量指标对冲——否则你的 evaluator 就是一台过度设计的永动机。
第二条:agent 会攻击 oracle 本身 ⭐
微软研究《Building to the Test》:给 coding agent 222 项隐藏测试,agent 逼近满分,但没有实现要求的可复用库——它做的是「你检查的」,不是「你要求的」。更具体的一线案例:
Kent Beck 公开表示:即便「表现良好」的 agent 也会尝试放行或忽略失败的测试——这不是罕见边缘案例。防御必须是机械的:
| 手段 | 机制 |
|---|---|
| 禁改断言规则 | agent 只能改 locator / 等待时间,不能碰期望值 |
| CODEOWNERS 锁测试目录 | tests/acceptance/ @owner + 分支保护「需要 Code Owner 批准」 |
| 本地权限拒绝 | .claude/settings.json 里 deny: ["Edit(tests/acceptance/)"]——agent 物理上无法改验收测试 |
| 密封黑盒测试 | 验收测试放独立仓库,只依赖发布构件,agent 无权访问 |
| 测试计数基线 | 记录测试总数,CI 中数量下降直接 fail |
| 破坏性构建灵敏度检查 | 每条新测试先注释掉被测功能重跑;仍绿 = 没有真正断言(廉价版 mutation testing) |
| 六道种子测试 | 用已知坏样本测检查器本身:删断言、超大 diff、意外新依赖、越界改配置、日志注入、碰不该碰的文件。一小时跑完——你的检查器本身需要被测试 |
golden tasks 的实操参数 ⭐
20–50 条从真实失败中提取的任务就足够起步。两类分开管理:能力评测(「能做到什么」)从低通过率开始爬坡;回归评测(「是否还能做以前能做的」)维持接近 100%,一降就是信号。能力评测稳定后会毕业成回归评测。成本量级:20 条 ×1 次 ≈ $0.15/次;200 条 ×3 次 ≈ $4/次。
"遇到评测分数下降就调低阈值合并,这么做两次,你的回归集就从回归防护网退化成橡皮图章。"— 必须贴在墙上的警告
goal 模式解决的是持续性,不是正确性——完成条件写错了,goal 模式只会让 agent 更坚定地完成错误目标。goal = 停止条件控制器,不是质量保证。完整公式是 Goal + Constraints + Eval + Containment + Observability。完成条件必须写成 transcript 里能被看见的东西(测试退出码、lint 干净、diff stat、explain 输出)。
数据库与性能:默认 harness 看不见的一层
N+1、缺索引、深分页、迁移锁表——这些测试全绿也看不见。
默认情况下 agent 没有 profiler,感知不到运行时成本:N+1 是最常见的 AI 性能问题(取列表 → 循环内逐条查询)○;它不会主动发现现有查询缺索引 ○;它默认写 OFFSET 分页(SQL 更短)而不是 cursor 分页 ○;还会反向过早优化——给一天跑一次的函数加 Redis 缓存、给 100 行的表做反规范化 ○。2026 年的口诀:
make it work → then measure it → then make the measured-slow parts fast— 中间那个 measure,正是 AI 会跳过的一步。所以它必须由环境提供,而不是指望模型自觉
四层闸门
事前
- 核心请求定义 SQL 次数预算
- 明确事务边界与最大事务时间
- 禁止请求循环中的逐行查询
- 新索引/新缓存必须说明成本与失效策略
- Schema 迁移独立成高风险任务
真实数据形状
- query counter 中间件:超阈值即失败(最便宜的一道)
- 关键 SQL 的 EXPLAIN 基线 + plan diff
- 接近生产数量级的合成/脱敏数据
- 压测进 CI,阈值绑定 SLO
expand / contract
- 先加向后兼容的新结构
- 部署兼容代码 → 限速可暂停回填
- 验证一致性与性能 → 切换读取
- 稳定后再删旧结构
- ⚠️ contract 阶段本身可能不可逆
上线后
- 先放 1%–5% 流量
- 对比 P50/P95/P99、错误率、DB CPU/IO
- 连接池、锁等待、慢查询、复制延迟
- 超阈值自动停止,不等人凭感觉
让 agent 自己能测
最关键的一步是让性能预算变成 agent 可自查的东西。有团队为每个 worktree 暴露独立的应用、数据库、日志、指标、trace,于是这类提示词变得可执行:"ensure service startup completes in under 800ms"——agent 形成 query → correlate → fix → restart → re-run → repeat 的闭环 ⭐。
这就是「人不判断」能成立的技术前提:不是模型变强了,是环境让目标变得可测量了。 默认不可见;接入观测之后可见。这一层不是模型能力问题,是环境建设问题——而环境是人建的。
自治边界:三种可逆性
不是「信不信 AI」,而是三个可判定的维度:可验证性 × 可逆性 × 爆炸半径。
git revert 撤不掉:已发出的邮件、短信、推送;已扣的款、已开的发票;已被下游消费的消息;已调用的第三方 API;用户已看到的错误价格;schema contract 阶段删掉的列。
风险分级必须分别标注三个字段:代码可逆性 / 数据可逆性 / 外部副作用。后两者不满足时,正确做法是幂等键、影子写、补偿事务、人工批准——而不是在任务卡上写一句「有 rollback」。
自治程度矩阵(节选)
| 工作类型 | 自治程度 | 必要条件 |
|---|---|---|
| 已有测试覆盖的局部 bug | 高 | 隔离分支、回归测试、CI、可回滚 |
| 小型 UI / 文案 / 内部工具 | 高 | 浏览器 e2e、截图检查、预览环境 |
| 普通业务功能 | 中高 | 任务卡、契约测试、架构规则、灰度 |
| 认证 / 权限 / 支付 | 中低 | 威胁模型、专门测试、最小权限、人工批准 |
| Schema / 大数据迁移 | 低到中 | expand-contract、节流回填、自动回滚 |
| 不可逆生产操作 | 低 | 明确授权、双人闸门、备份与恢复演练 |
| 产品战略、质量属性排序 | 低 | 这是利益相关者判断,不是代码问题 |
规律很清晰:越能把正确性外部化、测量化,自治程度越高。
权限面比提示词面更重要 ⭐被严重低估的一条
无人值守的 agent 会读取 issue、README、依赖文档、网页、工具返回值——这些都可能夹带恶意指令。一旦同一进程又持有生产凭证、网络外发能力、部署权限,测试再全也阻止不了数据泄露。在几起针对编码 agent 的 prompt injection 攻击之后,Anthropic 把 Claude Code 的默认权限模式改回了 Manual。正确做法是把「是否有权做」从模型推理中移走:默认无生产写权限、密钥最小化下发、网络出口白名单、沙箱隔离、工具调用留审计。审批活在 hooks / 权限系统里,不活在提示词里——如果 agent 自己能决定要不要审批,一段聪明的推理(或一次注入)就能说服它不问。
三道门(最小有效审批架构)○
| 门 | 时机 | 人只问一个问题 |
|---|---|---|
| Gate 1 计划评审 | 动手写码前(最高杠杆) | 这个方案解决的是我要的问题吗?有没有夹带我没要的东西? |
| Gate 2 发现评审 | 探索后、改动前 | 它发现的情况改变了任务性质吗?(缺迁移、多调用方、隐式依赖) |
| Gate 3 提交前 diff | 推送前 | 改动范围 = 我批准的范围吗?(范围蔓延、意外删除、硬编码密钥、测试数量有没有降) |
三条配套纪律:门要「高通过率但不 100%」——每道门都秒批说明门开错了粒度;审批疲劳是真实风险——门太多会让评审退化成反射点击,比没有门更危险;批准要绑定内容本身(范围声明 / diff hash),防止「批了 A 执行 B」。
人的角色与组织责任
人退出的事,人保留的判断,以及这套方案最容易被忽略的裂缝。
人退出的事
- 逐行判断 AI 代码好不好
- 反复口头提醒「简单一点」
- 手动运行一堆固定测试
- 把同一种错误每次重新解释给 agent
- 用审核 agent 的一句 PASS 当上线依据
人保留的五类判断
- 核心用户结果是什么
- 本阶段质量属性如何排序(填契约里的数字)
- 哪些结果绝不能发生(硬约束 + 非目标)
- 哪些未来能力明确不做
- 遇到数据、权限、支付、重大成本或不可逆变化时,是否接受风险
所有「技术弱的人也能管好 AI」的方案都隐含一个假设:环境是对的。但谁来判断环境本身对不对?查询阈值设错了(把 15 次设成 50 次),门形同虚设;权限边界漏了一条,攻击面敞开;测试数据形状失真(100 行 fixture 测 2000 万行的表),性能门测了个寂寞。
错误的环境制造的虚假安全感,比坏代码更危险——因为它同时关掉了警报。推论很硬:不能由同一个 AI 独自生成规则、测试、实现和「通过」证明。 首版治理必须由能对生产后果负责的人建立。否则「我不懂代码」只是升级成了「我不懂验证器」,而后者更难察觉。
职责分离与团队重组
「人只审批风险卡」这个模式,只有在审批者看得懂风险证据时才成立。产品负责人可以决定业务价值和风险容忍度,但不能为自己无法理解的锁竞争、租户越权或灾难恢复签字。高风险变更要满足职责分离:实现者、验证者、授权者不能全是同一条模型链。
| 角色 | 核心责任 |
|---|---|
| 产品负责人 | 用户目标、优先级契约、非目标、产品验收场景 |
| Harness / 平台工程师 | 隔离环境、CI、测试、权限、可观测性、发布与回滚 |
| 技术责任人(可外部顾问兼) | 初始化架构边界;处理高风险例外;定期审查质量属性与生产数据 |
| Agent | 调研、方案、实现、测试、审查、修复、证据包、低风险发布 |
| 生产系统 | 通过指标、trace、错误预算、用户行为反馈真实结果 |
规模判断 ○:5 人以下不必设专职 eval / harness 工程师,但必须有「验证负责人」这个职责和固定时间预算;超过 5–8 人、或涉及支付/敏感数据,招人或外包是常规操作。
什么时候必须「退出 vibe 模式」去读代码 ○
命中任何一条就切换到认真读 diff / 问架构 / 补测试:要上生产或接真实用户;代码触及密钥、鉴权、支付、个人数据;会有别人维护它;同一个 bug 回来三次、AI 反复「修好」;你没法向另一个人解释核心函数在干嘛。
harness 是会过期的
模型 + effort + 工具 + 规则 = 同一个发布单元。更强的模型不会单调地更守范围。
2026 年 7 月这一代的具体变化 ⭐全部一手官方
| 变化 | 要点 |
|---|---|
| ① 厂商删掉了 80% 系统提示词 | "We removed over 80% of Claude Code's system prompt… with no measurable loss on our coding evaluations." 病因诊断:overconstraining——互相冲突的指令让模型需要额外推理去仲裁哪条赢 |
| ② 验证类指令要「删除」而不是「改写」 | Opus 5 会自己验证工作。显式 verification 指令会导致 over-verification——legacy scaffolding 一并删 |
| ③ 激进措辞要收敛 | "CRITICAL: You MUST…" → 正常语气 "Use this tool when…"。新模型对系统提示词更敏感,强硬措辞现在导致过度触发 |
| ④ 子代理会被过度派发 | 官方给的是确定性限流(环境变量控制最大派生深度与并发、SDK 预算上限),不是提示词 |
| ⑤ effort 往下调而不是拉满 | 低/中档是「主要成本杠杆」而非「质量妥协」。⚠️ "effort 越高越容易 scope creep" 只有 Anthropic 一家量化过,不能外推 |
一个悬而未决的张力,如实呈现 ⭐
官方经验法则:CLAUDE.md 目标 200 行以内("Longer files consume more context and reduce adherence.")。唯一一篇受控实验(1650 个会话、16050 个函数级观测):"a 25-line CLAUDE.md and a 500-line CLAUDE.md are indistinguishable…"。两者字面冲突。合理调和(属推测):官方给的是含成本理由的经验法则,论文测的是单一简单规则在 25–500 行区间的合规率,且样本只覆盖 TypeScript + 3 个模型。
实践建议:把 200 行当成本纪律而非信仰,用工具体检(/doctor 会剪掉能从代码库推断出的内容,保留陷阱、原理、与默认行为不同的约定),而不是教条式硬切。
容易踩的坑:@import 不是按需加载 ⭐
"Splitting into @path imports helps organization but doesn't reduce context, since imported files load at launch."— 真正的按需加载机制是 skills 和路径限定的 .claude/rules/(只在 agent 触碰到匹配文件时才加载)
升级模型时的固定动作 ○
① 先用同一组任务跑 A/B(旧模型 + 旧 harness vs 新模型 + 旧 harness);② 检查新的行为漂移方向(越界率、轮次数、子代理数、成本);③ 按该代际已知的漂移方向做专项重测,而不是只跑通用回归集;④ 把模型版本 + effort + 工具 + 规则当作同一个发布单元记录。⚠️ 诚实空白:第三方「模型升级后旧 harness 反向工作」的完整复盘目前检索不到——这条判断方向可信,但独立验证仍是行业空白。
第三部分 · 证据账本
流传最广、但不能直接引用的论断
这份材料会被当决策依据,所以虚的地方必须先标出来。点击展开审计结论。
"性能要求只有 14.5%……优先级从未被写进项目指令就是根因"
"能把人肉判断压缩 99%"、"人只留在 0.8% 不可逆的关口"
"AI code review 安全缺陷检出率约 55%(人类 85–95%)",称为「能力上限」
"N+1 是 AI 生成代码的第一大性能 bug"、"消除 N+1 降 P95 80%"
"测试覆盖率建议 >70%,低于 60% 反馈回路崩坏"
"82% 组织过去 6 个月经历 AI 代码相关故障"
某电商大事故"AI 工具是主要促成因素"、"约 630 万订单损失"
"METR RCT:资深开发者用 AI 反而慢 19%"
"SWE-bench 13.86%"、早期 agent "20 个任务成功 3 个"
模板里的具体阈值("S 类 ≤40 行"、"大表 Seq Scan 即 fail"、"mutation ≥85%")
证据等级应该这样重排
- 官方案例只证明特定团队 + 特定仓库可行
- 实验只证明特定任务的效果
- 厂商调查只能生成风险假设
- 模板阈值必须用自己的事故、流量和基线校准
已知的公开信息缺口(不要编造填补)
① Anthropic over-engineering eval 的 rubric 与 grader 完全未公开(本领域最大缺口);② 「分级 diff 预算 + CI 硬拦截」无成型开源实现;③ 「最小/平衡/可扩展三方案对比」无主流实现;④ 「投机泛化」无主流自动检测工具;⑤ 「跨域改动」无统一定义;⑥ 第三方「模型升级后 harness 反向工作」复盘检索不到;⑦ 「事故→自动化检查转化率」无团队公开数据;⑧ 无权威的「项目类型 × 质量属性优先级」基线表;⑨ 「eval 做到位之后,过度设计还剩多少发生率」——双方都拿不出系统性数据,这是整场争论最大的空白。
这批材料最大的问题不是方向错,而是把「存在有效做法」写成了「行业已经解决」。— 证据口径的核心结论
实操篇 · 装配手册
60 分钟产出优先级契约
元方法:你不写文件,你审 AI 写的草稿。⚠️ 所有具体数字都是示例,必须用你自己的历史事故和流量校准。
四条已验证路径
| 路径 | 做什么 | 产出 |
|---|---|---|
| Claude Code /init | 在项目根目录运行,自动生成 CLAUDE.md 草稿 | CLAUDE.md 初稿 |
| Spec Kit /speckit.constitution | 一句自然语言 + 它读仓库上下文,填充占位符模板 | .specify/memory/constitution.md |
| Kiro Generate Steering Docs | 一键扫描代码库生成三份文件 | product.md / tech.md / structure.md |
| Codex + cookbook 提示词模板 | 官方 cookbook 提示词,让 Codex 读 AGENTS.md 后生成(⚠️ 是提示词工作流,非内建命令) | GOALS.md / PROMPTS.md |
拿到草稿之后的四步法
第 1 步:跑 /init(或 speckit.constitution / Generate Steering Docs),拿到草稿 第 2 步:用自己的话回答三个问题,让 AI 改写进去 a) 这个产品成功是什么样子?(一个可观察的行为,如"用户 3 步内完成下单") b) 绝对不许 AI 碰的东西?(生产数据、密钥、自动部署、删库) c) 我最讨厌 AI 上次干的 3 件事?(逐条写进"禁止"清单) 第 3 步:让 AI 反问你查漏 —— "你还有什么必须问我的吗?把模糊的地方全列出来" 第 4 步:自己通读一遍。读不懂的段落让 AI 重写,直到你能向别人复述 —— 这份文件是写给 AI 的,但你能否看懂它 = 你能否掌控它
第 4 步不能跳过。 这是自举悖论的第一道防线:你至少要能复述你的规则,否则你不知道它是不是错的。
30 分钟版:arc42 §1.2 三段式
本轮调研里唯一一份官方结构、可独自完成、不需要架构背景的模板。只写 3–5 条质量目标,其余全部延后,每条必须可判定——「系统要高性能」不能用来否决方案,「P95 < 250ms、单请求 SQL ≤ 4」可以。把形容词变成场景的三问:
谁,在什么情况下,做了什么? → 高峰时段,1000 个用户同时打开列表页 系统应该怎么应对? → 返回正确结果,不耗尽连接池,不产生 N+1 怎么算达标? → P95 < 250ms,错误率 < 0.2%,单请求 SQL ≤ 4,DB CPU < 65%
60–90 分钟版:加两件事
① 给每条目标标记可协商性(如「数据不丢失 —— NON-NEGOTIABLE」「列表页 P95 < 250ms —— 可协商,例外条件:营销活动期间放宽到 400ms,但须提前记录」)。② 单独写一节非目标——四条写法规则:非目标是承诺不是拖延(推翻需要决策记录);每条都给理由;和目标并列陈述、篇幅大致相当;具体到可判定的边界。
先定位项目类型再排优先级
| 项目类型 | 硬约束优先级(前 2–3 项) | 明确降级、写进非目标的 |
|---|---|---|
| 消费级 MVP | 可用性(能跑)、迭代速度 | 可扩展性、多环境兼容、正式安全合规(数据基本保护除外) |
| 成熟 SaaS(多租户付费) | 可靠性(SLA)、安全(租户隔离)、可维护性 | 极限性能优化(除非是卖点)、面向未来的抽象 |
| 内部工具 | 易用性、可维护性 | 高可用架构、严格性能 SLO |
| 金融 / 支付 | 安全、可靠性、可审计性 | 迭代速度让位合规评审、UI 美观让位可追溯 |
模板包 · 10 个可直接抄
点击展开。⚠️ 模板直接生效是本方法最常见的失败方式——先 audit,再校准。
模板 1docs/PROJECT-PRIORITIES.md · 优先级契约核心文件
# 本阶段业务目标 - 在 __ 周内验证用户是否愿意完成 ___ 这个核心行为。 # 关键用户旅程(2-3 条,其余都不是关键路径) # 硬约束(违反即失败,不排序,全部必须满足) - 不丢失或破坏用户数据 / 不绕过认证和授权 / 不泄露密钥和个人信息 - 不直接修改生产数据 / 不在没有兼容与回滚方案时执行 Schema 变更 - 不让一个租户读到另一个租户的数据 / 不突破法规、合同或明确成本上限 # 工程预算(必须达标的数字 —— 本文件的核心,必须填真实数字) - 核心 API P95 < ___ ms,P99 < ___ ms;错误率 < ___ % - 单个用户请求的 SQL 次数 ≤ ___;DB CPU 峰值 < ___ %;首屏 < ___ s - 大表定义:超过 ___ 行的表;这些表上禁止无 LIMIT 的全表扫描 # 冲突时的偏好(按变更类型给,不是全局给) | S 外科手术 | 正确性 → 贴合现有风格 → 性能 | | M 功能增量 | 正确性 → 触碰路径的性能 → 已有安全不变式 | | L 新模块/新存储/新公共 API | 安全与数据安全 → 正确性 → 可运维性 → 性能 → 可扩展性 | | X 事故/数据路径 | 数据安全与可回滚 → 止血 → 正确性 | # 非目标(承诺,不是待办;推翻需要一条决策记录)— 建议 5-10 条 # 必须人工决定的事:Schema 变更、权限、支付、删除数据、公共 API、生产基础设施、突破成本预算
模板 2AGENTS.md 骨架(短版)目标 200 行以内
# 项目名 —— 一句话说明这个产品给谁、解决什么 ## 命令(必须是能直接复制运行的真实命令) - 测试 / Lint / 类型检查 / 只跑改动文件的测试 / 看某条查询的执行计划 ## 动手之前 1. 判定本次变更等级:S / M / L / X(见 docs/CHANGE-CLASS.md) 2. 读相邻实现,复用它们,不要平行造一份 3. 用三条要点说明你的假设;如果存在两种设计,选更小的那个,除非契约禁止 ## Always(无需请示):提交前跑测试;遵循现有命名约定;错误记录到监控服务 ## Ask first(必须先问):改数据库 schema 前;新增依赖前;改 CI/CD 配置前 ## Never(无条件禁止) - 永远不提交密钥或 API key - 永远不编辑 node_modules/ 或 vendor/ - 永远不在未经批准的情况下删除或跳过失败中的测试 - 永远不为一个调用点创建 repository / factory / strategy / provider / DI 容器 - 永远不为"以后可能需要"加配置项、扩展点或抽象层 - 永远不顺手重构与本次任务无关的代码 ## Done 的定义 - 上面的命令对触碰到的代码全绿 - 改动范围没有超出任务卡的白名单文件;若超出预算行数,附上理由 - 若改了 SQL:附上查询次数与执行计划对比 - 测试数量没有减少
凡是能用 hook / lint / CI 强制的,不要写进这里。
模板 3docs/CHANGE-CLASS.md · 变更分级卡数字是报警线,不是判错线
# 变更分级 - S 外科手术:一个行为、1-2 个文件、无 schema、无新依赖、无新公共 API - M 功能增量:现有模块内的一个功能,可加测试和小 helper,不加新层 - L 新建:新模块、新存储、新公共 API、跨服务,或"要做成可扩展的" - X 事故:生产事故或数据路径安全问题 若需求是小增量而你想按 L 做,那就是过度设计。降级为 M,把被推迟的抽象写成后续项。 ## 预算(报警线) | 等级 | 文件数 | 净增行数 | 新依赖 | Schema | | S | 2 | 40 | 0 | 否 | | M | 6 | 150 | 0 | 否 | | L | 按 spec | 按 spec | 需批准 | 需批准 | | X | 按需 | 按需 | 0 | 仅在有回滚方案时 | ## 升级触发器(命中任意一条,必须停下来进入计划评审) 新增依赖/新表/新索引/新队列/新缓存/新服务/新抽象层;Schema 变更;跨业务域改动; 触碰鉴权、支付、删除数据、对外发送;超出上表预算;同一个 bug 第三次回来
模板 4任务卡 · 每个任务复制一次「不许做」是最值钱的一行
变更等级:S(若你认为是 L,先只说明为什么,不要写代码) 现有行为:在 ___ 里,现在是 ___ 要加的行为:___ 不要做: - 新依赖、新表、新索引、新服务、新队列、新缓存层 - 新的 repository / factory / strategy / provider / DI - 改与本任务无关的文件 / 为"以后可能"加配置项 / 在请求路径上加外部新依赖 允许改动的文件: - path/a - path/b - path/a.test 完成条件(写成 transcript 里看得见的东西): - `___` 测试命令退出码 0;lint 干净 - git diff --stat 净增 < __ 行(报警线:超了要给理由并进计划评审,不是自动判失败) - 若有 SQL:EXPLAIN 无大表 Seq Scan,单请求查询数 ≤ __ 先读:邻近的 ___ 实现,复用它,不要平行写一套。 超过什么边界必须停下来提交决策卡:___
模板 5最小方案强制对比 · 写进 planner 提示词自建机制 · 举证责任倒置最直接的落法
在写任何代码之前,输出三个方案: 【方案 A · 最小改动】改哪些文件、多少行;满足了哪些完成条件;牺牲了什么 【方案 B · 平衡】与 A 的差异,以及多出来的复杂度买到了什么 【方案 C · 可扩展】为哪个"已确认存在"的未来需求做准备;如果尚未确认,直接标注"投机" 【我的选择与理由】 - 我选:___ - 为什么 A 不够:___(必须是具体的、当前就存在的问题,不能是"以后可能") 如果你选了 B 或 C,但"为什么 A 不够"里出现了"未来"、"可能"、"更灵活"、"更规范" 这类词而没有当前的具体问题,那么请改选 A。
模板 6Complexity Tracking 表(Spec Kit 逐字原文)⭐ 需 CI 加检查才有牙
Complexity Tracking: Fill ONLY if Constitution Check has violations that must be justified | Violation | Why Needed | Simpler Alternative Rejected Because | ### Phase -1: Pre-Implementation Gates #### Simplicity Gate - [ ] Using ≤3 projects? - [ ] No future-proofing? #### Test-First Gate - [ ] Tests written before implementation? - [ ] Contract tests defined?
模板约定 + 流程纪律,工具客户端不会自动拦截——要让它有牙,在 PR 模板或 CI 里加检查。
模板 7Surgical Changes 严格协议 · 粘进 CLAUDE.md具体数字是第三方加工,别当权威
## Surgical Changes — Strict Protocol ### Pre-Change Declaration Before making ANY changes, list: 1. Files that will be modified 2. For each file, the specific lines/sections that will change 3. Justification: why each change is necessary for the task ### Change Budget - Bug fixes: target ≤10 lines changed - Small features: target ≤50 lines changed - If your change exceeds the budget, explain why and get confirmation ### Prohibited Actions (unless explicitly requested) - Renaming anything / Reformatting / Adding or removing comments - Restructuring code / Upgrading dependencies / Modifying unrelated config ### Post-Change Audit - Every modified line is necessary for the task - No files were touched that aren't directly needed - The diff is the smallest possible for this task
必须一起抄的两条警告:①「外科手术」≠「文件数最少」;② Change Budget 是参考线不是硬上限——数据库迁移可能天然需要 200 行。
模板 8计划评审 · 人只问三个问题Gate 1 / 2 / 3
Gate 1 · 计划评审(写码前,最高杠杆) 这个方案解决的是我要的问题吗? 它有没有夹带我没要的东西?(对照非目标清单逐条看) "为什么最小方案不够"——说的是当前存在的具体问题,还是"以后可能"? Gate 2 · 发现评审(探索后、改动前) 它发现的情况改变了任务性质吗?(缺迁移、多调用方、隐式依赖) Gate 3 · 提交前 diff(检查项无条件跑;由谁看取决于风险等级) 改动范围 = 我批准的范围吗? 有没有:范围蔓延、意外删除、硬编码密钥、缺测试、测试数量减少
纪律:门要高通过率但不 100%;门太多比门太少更危险——审批疲劳会让评审退化成反射点击。
模板 9PR 证据包没有证据不合并
## 本次改动 - 变更等级:S / M / L / X - 用户可见的行为变化:___ ## 确定性验证 - [ ] 类型检查 / lint / 单测 / 集成测试 全绿(贴命令输出) - [ ] 架构规则检查通过 - [ ] git diff --stat:___(预算 ___) - [ ] 测试数量:改动前 ___ → 改动后 ___(不允许下降) ## 数据库(若触碰 SQL / ORM / 迁移) - [ ] 新增/修改的语句清单 + EXPLAIN 输出对比(改动前 vs 改动后) - [ ] 单请求查询数:___(预算 ___) - [ ] 迁移:expand/contract 分阶段?回填是否限速可暂停?回滚方案是什么? ## 风险 - 代码可逆性:___ / 数据可逆性:___ - 外部副作用(邮件/扣款/消息/第三方调用/用户已见):___ - 灰度方案与自动回滚阈值:___
模板 10事故 → 资产转化只加不删的规则集会自己腐烂
事故:___ 用户影响:___ 为什么 harness 没发现它? - 缺哪个 signal?(测试 / 指标 / lint / 架构规则 / 权限) 本次必须产出(至少一条,且必须是自动化的): - [ ] 一条回归测试 - [ ] 一条 CI 门禁 / lint 规则 - [ ] 一条监控告警 - [ ] 一条 golden task 同时删除: - [ ] 已经过时、重复或只制造噪声的规则 ___
30 天装配顺序
总原则:先止血、再造事实、再加门、最后改人的位置。不要一上来重新设计一个漂亮架构。
五条硬动作——每条都要验收,不要只看配置文件写了什么
- AI 默认无生产写权限、不能部署生产、不能读正式密钥、不能对外发送 工程/运维 验收:用 agent 试一次生产写操作,应被拒绝
- 主分支开启保护:CI 必须过 + 至少 1 人评审 仓库管理员 验收:直接向主分支推送应被拒绝
- 数据库、权限、支付、删除、迁移一律需技术责任人批准 负责人拍板 写进 AGENTS.md 的 Ask first 清单
- CODEOWNERS 锁住测试目录 + 勾上「需要 Code Owner 批准」 仓库管理员 验收:提一个改测试的 PR,应无法自动合并
- 本地权限拒绝:settings.json 里 deny Edit/Write tests/acceptance/ 工程 验收:让 agent 试改验收测试,应被拒绝
第 4、5 条直接对冲已被多例证实的头号风险:AI 删改测试让红变绿。你不必会配,但你必须能验。
让 AI 把现有真实系统逆向出来
- 现在有哪些业务域?谁拥有哪些表?哪些地方跨域直连数据库?
- 3 条关键用户旅程是什么?最贵/最慢的 5 条 SQL 是什么?哪里有 N+1?
- 哪些依赖是循环的?过去 10 个线上事故来自哪里?列 10 个 AI 过度设计的具体例子
- 跑 /init + 四步法,改成你能复述的 CLAUDE.md;写第一版 PROJECT-PRIORITIES.md,把真实数字填进工程预算
- 写非目标清单 5–10 条;给 AI 一个能跑的检查:build + 现有测试 + 5 条手动冒烟清单
周末检查点:所有 AI 会话默认从规则文件启动;这一周你没有逐行读过任何代码。
Lint+格式化(pre-commit)· 类型检查 · 单测+CI 强制 · 分支保护 · CODEOWNERS 锁测试目录 · 密钥扫描
- 引入 Gate 1 计划评审:所有非平凡任务先出计划,你批准才动手
- 引入 Gate 3 提交前 diff:固定看改动文件列表 + diff 统计 + 新依赖/密钥 + 测试数量
- 把审核 agent 跑一周,标记每条意见"对/误报",得到可信度基线
- 把 Week 1 列的 10 个历史失败转成回归测试
让性能预算变成 agent 自己能测的东西
- 建立接近生产数量级和分布的测试数据集(不是 100 行的 fixture)
- 装 query counter 中间件:每请求 query 数超阈值即测试失败(N+1 自动拦截,性价比最高)
- 3 条关键路径压测基线,阈值绑定 P95 / 错误率;关键查询 EXPLAIN 基线 + plan diff
- 开启慢查询统计;让 agent 能启动应用、操作浏览器、读日志和 trace、生成截图
分级放行 + audit 模式 + 每周转化
- 低风险任务:全绿自动开 PR 并合并
- 中风险:附证据包(模板 9)+ 灰度
- 高风险:由合格的技术责任人审计划、关键 diff 与证据包——产品负责人审的是「要不要承担这个风险」,不是「这个实现对不对」
- 架构规则先跑 audit 模式(只报不拦),摸清历史欠账,不要一上来全量拦截
- 每周把重复出现的人工反馈升级为测试 / lint / 规则
30 天后看数据:首次通过率、回滚率、线上缺陷、P95、DB 资源、平均 diff、越界变更、你花在人工上的时间。没有改善,先修环境和 eval,不要继续叠更多 agent。
明确推迟的(不要在第一个月做)
| 项目 | 推迟到 | 原因 |
|---|---|---|
| e2e 全量进 PR 门禁 | 先只在预览环境/合并前跑 | CI 时长与 flaky 成本 |
| Mutation testing | 单测规模稳定后,nightly 跑 main,只对支付/鉴权设阈值 | 几小时的任务不该进 PR 门禁 |
| 架构规则全量拦截 | 先一次性审计摸底 | 历史欠账会让所有 PR 变红 |
| 性能预算、全量安全扫描 | 有专职负责人或合规压力时 | 前期用轻量依赖审计顶上 |
| golden task 回归集 | 先有几次真实事故 | 没有事故积累就硬造,容易变成自娱自乐的形式主义 |
分级门禁的五种成熟模式(第 2 个月起用)
| 模式 | 做法 |
|---|---|
| 按时机分层 | 编辑器(LSP/lint/单测 watch)→ pre-commit(只跑暂存文件)→ PR CI(全量 typecheck/lint/单测/契约/build)→ 预览环境(e2e/可访问性/视觉回归)→ 夜间(全量 e2e 矩阵、依赖更新、安全扫描) |
| 按变更风险分级 | 给 diff 打 TIER 标签:TIER_0 直接放行;TIER_1 基础检查 + 覆盖率棘轮;TIER_2 加全量静态扫描 + AI 预审;TIER_3(触碰治理面/核心逻辑)默认阻塞,需人工标签批准 |
| 队尾轻、队头重 | 合并队列里,中间条目只跑便宜检查;只有真正要合并的队首跑完整矩阵 |
| 路径过滤 | 改到 backend/** 才跑后端测试,monorepo 必备 |
| 重活挪夜间 | mutation testing 不进 PR 门禁;PR 上只对改动文件做增量 mutation |
怎么知道这套有效
先看清门禁的真实代价,再验证 harness 本身(meta-eval)。
门禁的真实代价:flaky 数据
含义:门加得越多,假阳性越多;假阳性会让 agent 陷入无效循环,也会让人开始无视红灯。所以分级门禁不是优化,是必需品。
meta-eval:harness 自身的有效性验证
六道种子测试(最便宜的一次审计,一小时跑完)⭐:用已知坏样本测试检查器——① 删掉断言的 PR;② 超大 diff 的 PR;③ 意外新增依赖的 PR;④ 越界改配置的 PR;⑤ 日志里含 prompt injection 字符串的输入;⑥ 碰了不该碰的文件的 PR。任何一条没被拦住,说明那道门是装饰。
破坏性构建灵敏度检查:每条新测试先注释掉被测功能重跑——仍绿说明没有真正断言。测试计数基线:记录总数,CI 中数量下降直接 fail。golden tasks:20–50 条起步,能力评测从低通过率爬坡,回归评测维持接近 100%,稳定后毕业。
该追踪的指标
不要统计「AI 写了多少行」。追踪这些:
| 指标 | 看什么 |
|---|---|
| 逃逸缺陷 | 门禁全绿但线上出问题的次数——harness 有效性的直接度量 |
| 越界变更率 | 改动超出任务卡允许范围的比例 |
| 返工率 | DORA 2025-2026 已列为第五项官方指标(仅 6.9% 团队能控制在 2% 以下) |
| 回滚率 / 平均 diff 大小 | diff 趋势比绝对值重要 |
| 审核 agent 误报率 | 校准数据,决定要不要继续信它 |
| 人的时间分配 | 逐行读代码的时间占比应下降;审 spec/plan 和定验收标准的时间占比应上升 |
| 事故→行动项的转化 | SRE 制度要求:每个用户可感知事故至少产出 1 条 P0/P1 行动项并跟踪关闭——没有要求必须自动化,尽量转成自动检查是加码 |
如果 30 天后你花在「读 AI 代码」上的时间没有下降,这套东西就没生效——问题多半在你还没把判断变成数字。
在 Claude Code / Codex 里的具体落法
| 想要的效果 | 用什么 | 不要用什么 |
|---|---|---|
| 真正拦住某个动作 | settings.json 的 permissions.deny + PreToolUse hook | CLAUDE.md 里写「禁止」——那只是 context,模型可以不听 |
| 真正的按需加载 | Skills、.claude/rules/ 的 paths: 限定 | @path import——导入的文件在启动时全量加载,不省上下文 |
| 测试不被改 | CODEOWNERS + 分支保护 + deny Edit(tests/) | 提示词里写「不要删测试」 |
这一代模型的提示词校准(2026 年 7 月起)
要删掉的 ❌
- "最后加一步 verification" / "用子代理验证" ——Opus 5 会自己验证,导致 over-verification,官方建议是删除而不是改写
- "CRITICAL: You MUST…" 这类激进措辞——改为正常语气 "Use this tool when…"
- 重复 linter 已经强制的风格规则
- 能从代码库推断出的内容(目录结构、依赖清单、架构概览)——/doctor 会把这些剪掉
要加上的 ✅
- scope 约束("stay in scope" / 只实现被要求的最小改动)进禁止清单
- 完成条件写成 transcript 里看得见的东西(退出码、diff stat、explain 输出)
- effort 从低档起步按需上调,不要默认拉满
- 子代理派发用环境变量限流(最大派生深度、最大并发数、预算上限),不要靠提示词
派工给执行代理时的最小契约
1. 变更等级 + 允许改动的文件白名单 2. 禁止清单(新依赖/新表/新抽象/无关文件) 3. 完成条件(可机器验证,写成命令和退出码) 4. 先读什么(邻近实现,复用而非平行造) 5. 超过什么边界必须停下来问
缺任何一段,你就会收到 600 行。一条元教训:不要让同一个 AI 独自完成「生成规则 → 写实现 → 写测试 → 宣告通过」这条闭环——至少要有一次外部独立性。否则你得到的不是治理,是一个自证清白的系统。
一页纸 · 明天开始的七件事
AI 老给我 600 行,我看不懂,怎么办
给技术背景不强、但要管住 AI 写代码的人。只有第 1、2、3、7 条是你自己能完成的——其余的需要工程能力。
你的问题不是「不会判断 600 行对不对」,而是「没有任何机制在写第一行之前就把边界钉死」。判断不该发生在读代码的时候——代码改动量越大,审查所需时间增长得比线性还快,而 AI 十分钟就能再给你一份。这道数学题谁都算不赢。
所以你要做的不是变得更会读代码,而是把判断提前变成数字和禁区。这些数字你其实都知道:列表页不能超过多少毫秒、订单表有多少行、这个功能不许碰支付。没人告诉过你——这些就是全部的输入。
先指定一个懂工程的人
你做这条必须排第一,不是第七。 后面六件事里有一半需要有人真的会配置——把你的规则翻译成机器能执行的检查、看高风险的方案与发布证据、定期检查那些检查本身还有没有效。可以是团队里的工程师,也可以是每周固定几小时的外部顾问。
一条硬规矩:不能让同一个 AI 独自完成「定规则 → 写代码 → 写测试 → 宣布通过」这一整圈。
把数字写下来
你做一页就够,回答三件事:硬底线(不丢数据、不绕过登录权限、不泄露密钥、不直接改生产库、改表结构必须有回滚方案);必须达标的数字(核心页面响应时间上限 ___ 毫秒、错误率上限 ___%、哪些表算大表、一次用户操作最多查几次数据库);明确不做的事(5–10 条:不做多地部署、不做插件框架、不为 100 倍流量提前优化……每条都写上为什么)。
「不做」是承诺,不是「以后再做」——要推翻它,得正式写一条决定记录。
每个任务先写一张卡
你做任务卡五要素:现在是什么样 / 要变成什么样 / 只准改这几个文件 / 不许做(新依赖、新表、新服务、新队列、新缓存、新的「以后可能用得上」的抽象层)/ 怎么算做完(___ 命令跑绿)。另外:改动行数超过 ___ 行,停下来说明理由——提醒线,不是自动判错。
「不许做」那行是整张卡最值钱的。AI 过度设计,大多数时候是因为你只说了要做什么,没说不许做什么。
写代码前只看方案
你做判断 让人配置成自动检查让 AI 每次给你两个方案:最小改法和它想要的改法。然后让它回答一句话:「为什么最小的那个不够?」——这是整套方法的核心,它把「证明复杂度有必要」的责任从你身上转到了 AI 身上。你不需要判断 600 行好不好,只需要读这一句理由。
判据:理由里出现「以后可能」「更灵活」「更规范」,却说不出今天就存在的具体问题——打回去用最小方案。GitHub 官方 spec 工具模板里那张三列表(违反了什么 / 为什么需要 / 更简单的方案为什么被否决)就是产品化的版本。
没有证据不合并
让人配置 你验收至少要跑:编译、类型检查、lint、现有测试、核心流程走一遍。改了数据库相关的东西,额外要三样:这次请求发了几条数据库查询(超阈值该拦住)、查询计划的前后对比、用接近真实数据量的数据压一遍(不是 100 行的假数据)。
按风险发布
让人配置 你定阈值低风险(白名单范围、全绿、没碰敏感项):自动合。中风险:小流量先放一部分用户,盯着错误率、响应时间、数据库负载,超线自动停。高风险:等技术责任人签字。
⚠️ 代码能回滚 ≠ 后果能回滚。任务卡上写「有回滚方案」不够,要分开问三句:代码能撤吗?数据能撤吗?有没有已经泼出去的水?
每周把事故变成资产
你做每个漏网的问题,至少产出一条被跟踪到关闭的行动项;能自动化的尽量自动化。同时删掉过时、重复、只制造噪声的规则——只加不删的规则集,半年后会变成没人看的噪声。
不要统计「AI 写了多少行」。统计四个:漏到线上的问题数、回滚次数、改动超出授权范围的次数、你自己花在读代码上的时间。
6 行还是 600 行,不该由你读完代码才知道。应该在它写第一行之前,提醒线和禁区就已经定好了。你的职责只有三件:定用户结果、定这个阶段的优先级数字、定什么后果绝对不能发生。 剩下的翻译成机器能执行的检查,是技术责任人的事;AI 在门内高速工作。这样减少的是重复的人肉劳动,不是责任。
架构和产品判断没有消失,它们从「存在人脑里、靠 PR 时出现」变成了「必须提前变成 agent 跑得动的约束」。谁还把判断留在审核环节,谁就会持续收到 600 行,并持续焦虑自己看不懂。
但同样要说清楚:判断可以被前置和工程化,不能被一次性外包。今天的最优解不是「信 AI」或「信人」,而是把判断变成测试,把测试变成 harness,把人留在不可逆的关口上——并且承认这套 harness 本身也需要一个懂工程的人来负责,以及需要随模型代际重做。