第二课:可执行规格
把"想要的效果"写成 agent 啃得动的东西

≈15 分钟 · AI 时代战略型工程师 · 课程 0002 · 2026-06-13
前置:第一课·委派阶梯 · 参考:术语表 · 能力速查表

先批改:你的三份审计

任务你的判断我的纠正真正的瓶颈
① 文档写作
讨论大纲→AI 初稿→逐章调整
实际①,理论②实际①✓,理论是③:规格冻结后各章无依赖,可并行委派不是委派形态,是规格缺口——"生成的和想要的差距大"说明 agent 在拿默认值填你没说清的空间
② 测试修复 skill 开发
给目标→执行→跑 skill 验证→vibe 改→重复
实际②,理论③都对,但上③有前置条件:先把"验证链路长"砍短。没有自动验证 harness 就并行,等于把你的阅读量乘以 N验证成本——验证不自动化,并行舰队只会更快地堆积待你验收的产物
③ 12h Goal Mode UI 测试
截图对比,想要 trace
实际②,理论⑤执行已经在⑤(Goal Mode 12 小时就是自治系统),但验证/观测在①——所以体感才是②。层级 = 执行 + 验证闭环,取两者较低值可观测性——你提的 trace 方向完全正确,这是第三课主题
共同病灶:三个任务的卡点都不在"会不会用更高级的工具",而在闭环的两端——规格(事前定义什么叫对)和验证(事后廉价地检查对不对)。本课解决前者,用任务①做手术台;下一课解决后者(任务②③)。

知识:为什么生成的和想要的差距大

你的文档流程是:讨论大纲 → agent 读代码/旧文档/补充信息 → 出全稿 → 逐章人工调整。问题出在三个具体环节:

1. 大纲不是规格。大纲只约束了"写什么",没约束"写成什么样"。读者是谁、一章多长、概念怎么展开、示例占多大比重、什么语气、什么禁区——这些你都没说,agent 就只能用它的默认值(训练语料里"文档"的平均样子)填进去。这正是 Ousterhout 说的战术龙卷风行为:LLM 不会停下来问你要设计决策,它直接编一个最顺手的。差距大不是模型笨,是欠规格的空间全被默认值占领了

2. 修正没有回流。你逐章调整时,每一次修改其实都是一条珍贵的规格信息("这样写不对,应该那样")。但它们消费完就丢了——下一章 agent 犯的还是同款错误。所以"整体耗时比较久":你在为同一条没写下来的规则反复付费。

3. 验收没有标准,所以无法委派。"我看了感觉不对"没法交给 verifier agent 执行。不能委派验收,你就只能停在①级逐字看——这就是你被锁在第一级的真正原因。

关键洞察:"规格成为 source of truth,代码(和文档)服务于规格。" — GitHub Spec Kit 方法论。工作流:Spec → Plan → Tasks → Implement,每一步都是显式产物。

知识:可执行规格的五个组件

对任何要委派的任务(文档、代码、调研皆同),规格 = 以下五件东西。按杠杆率排序:

1
黄金样本 杠杆最高
杠杆率
一段你亲手改到满意的产出范例。Few-shot 比任何形容词都管用——"专业但不啰嗦"是噪音,500 字的满意样章是信号
挑你逐章调整中改得最满意的一节,作为 golden-sample.md
2
验收标准
杠杆率
每个单元的可检查条款。测试是"能不能跑",文档是"逐条核对能不能过"
"每章 ≤1200 字;每个概念必须配一个来自真实代码库的示例(标注文件路径);术语与术语表一致;不出现未在前文定义的缩写"
3
反例清单
杠杆率
过去失败的具体样子 + 为什么错。从你已经做过的"vibe 修改"里直接提炼
"❌ 不要罗列 API 签名(读者会看源码);❌ 不要用'显然/简单地';❌ 上次第 3 章把内部模块名当读者已知概念用了"
4
读者与目的
杠杆率
为谁、读完能做什么。决定取舍深浅
"读者:刚接手项目的安卓工程师;读完能独立跑通修复流程,不需要再问人"
5
素材清单
杠杆率
显式列出 source of truth:哪些代码路径、哪些旧文档、哪些只能问你
"代码以 src/core/ 为准;旧文档 docs/v1/ 仅参考结构不参考内容;发布流程问我"
注意第 3 项:反例是你独有的资产。Osmani 在 The 70% Problem 里说最后 30% 靠工程判断——反例清单就是把你的判断从脑子里搬进规格,让 agent 第一次就避开,而不是你第 N 次手工修。

知识:你的文档流程,重构后的样子

原流程(①级,全程在场)
讨论大纲 出全稿 逐章人工调整 × N 章 × M 轮

↑ 你的时间随章节数线性烧


新流程(①级只花在刀刃上,之后上③级)
规格冻结
①级同步结对,值得花 1-2 小时
  1. 和 Claude Code 讨论大纲(你已经在做 ✓)
  2. 让它先写 1 节,你亲手改到满意 → 存为 golden-sample.md
  3. 把你修改的每一处,让 agent 反向提炼成规则:
    "对比我改前改后的版本,把差异总结成可执行的写作规则和反例"
    → 生成 SPEC.md(五组件齐全)
  4. 冻结。之后只有你能改 SPEC.md(你的 PLAN.md 协作 harness 同款纪律)
并行生产
③级,每章一个独立单元
  1. 每章 = 一个 subagent 任务,输入固定三件套:
    SPEC.md + golden-sample.md + 该章素材清单
    Claude Code 里直接说:
    "按 SPEC.md 和 golden-sample.md 并行写第 2、3、4 章,每章一个 subagent,互不依赖"
    (章节多、要隔离时用 ultracode / worktree)
机器先审,你只看报告
验收委派
  1. verifier agent 拿验收标准逐条核对每章,输出核对表:
    "按 SPEC.md 的验收标准逐条检查 ch02.md,输出表格:条款 | 通过/不通过 | 证据(引用原文行)"
  2. 你只读核对表 + 抽查不通过项 + 品味抽查一章
你的时间分布从"均匀地撒在每一章"变成"集中在规格冻结 + 终审"——这正是 Ousterhout 的战略投资曲线:前期慢 10-20%,从第 3 章开始反超,章节越多赚得越多。

活文档规则(防止规格腐烂)

唯一需要长期遵守的纪律:任何一次人工修正,都问一句"这条该不该回写进 SPEC.md"。该回写不回写,下一章同样的错误你再付一次费;全部回写又会让规格膨胀成没人读的法典。判据:这个错误是模式(会再犯)还是个案(仅此处语境)。模式回写,个案就地改完拉倒。

技能:给你正在写的文档建 SPEC.md

实操任务 · 约 40 分钟 · 用真实文档,不用玩具

拿你审计里那个文档任务(或当前在写的任何一篇),完成阶段一:

# SPEC.md 模板(直接复制开填)
## 读者与目的
读者:…(具体到岗位和上下文)
读完能:…(一个可观察的行为)

## 黄金样本
见 golden-sample.md(亲手改到满意的一节,500 字以上)

## 验收标准(verifier 逐条核对用,每条必须可检查)
- [ ] 每章 ≤ … 字
- [ ] 每个概念配 ≥1 个真实代码示例,标注文件路径
- [ ] 术语与 … 一致
- [ ] …(至少 5 条)

## 反例(从你过去的修改中提炼,含原因)
- ❌ …:因为 …
- ❌ …:因为 …(至少 3 条——翻你上次逐章调整的记录)

## 素材清单
- 以 … 为准;… 仅参考;… 问我

提示:第 2、3 步不用手写——让 Claude Code 干粗活:
"对比 draft-v1.md 和我改完的 final-v1.md,把所有差异提炼成写作规则和反例,按上面模板生成 SPEC.md 草稿",你只做裁决。

然后做对照实验:用 SPEC.md + 黄金样章重新生成一章,和当初无规格的初稿比。把两个结果发回给我——差距收窄了多少,是检验本课是否成立的证据。

自测(先回忆,再点选)

1. 生成结果与想要效果差距大,最常见的根因是?

agent 不会停下来要设计决策,它用训练语料的"平均默认值"填满你没说清的每一处。先补规格,再怀疑模型。

2. 规格五组件里杠杆率最高的是哪个?

Few-shot 范例传递的信息密度远超形容词描述——"专业但不啰嗦"是噪音,一段你改到满意的 500 字是信号。大纲甚至不在五组件里:它只约束"写什么",不约束"写成什么样"。

3. 逐章调整时人工修正了一处问题,正确的下一步是?

修正不回流,下一章为同一条规则再付一次费——这就是你"整体耗时较久"的机制。判据:模式回写,个案放过。

任务③的 trace 问题:方向预告

你问 12 小时长任务"想记录 trace 来定位哪一步出问题、不知道往哪个方向优化"——方向就是可观测性三件套,下一课展开,先给你结论免得等:

1
确定性 trace(不靠 prompt)

Claude Code 用 PostToolUse hook 把每次工具调用追加写入 JSONL(时间戳、工具、输入摘要、结果摘要)——hook 是确定性执行的,agent 想忘都忘不掉。Codex 侧用 codex exec --json 拿结构化事件流。

2
结构化 run journal(靠协议)

在 goal prompt 里钉一条不变量——每个步骤完成后必须向 RUN_LOG.md 追加一行:步骤号 | 意图 | 动作 | 观察 | 判定,截图文件名带步骤号,让图和 trace 能对上。这就是你自己那份 subagent-invariant-anchoring 规范的直接应用。

3
trace 的消费也委派

跑完别自己读 12 小时的日志——丢给一个分析 agent:"读 RUN_LOG.md + hook trace,定位首个判定与截图证据矛盾的步骤"。

引用文献

🧠背诵区

点卡片翻面。记的是能用的判断核心,不是定义。

闪卡 1 / 根因
生成结果和想要的差距大,最常见的根因是什么?
翻面
欠规格的空间被默认值占领——agent 不会停下来要设计决策,用训练语料的平均默认值填满你没说清的每一处。先补规格,再怀疑模型。
闪卡 2 / 杠杆排序
规格五组件里杠杆率最高的是哪个?为什么?
翻面
黄金样本——一段你亲手改到满意的范例。Few-shot 的信息密度远超形容词,"专业但不啰嗦"是噪音,一段满意样本是信号。
闪卡 3 / 反馈环
逐章人工修正了一处问题,正确的下一步是什么?
翻面
判断是模式就回写进规格,是个案就放过。修正不回流=为同一条规则反复付费,这正是"整体耗时久"的机制。
⏱ 间隔复习:明天扫一遍,3 天后再来。交织:顺手翻一张第一课「委派阶梯」的旧卡——规格质量正是上推委派的门票,两课是一回事。
🗣复述区

能讲清楚,才是真懂——比能回忆高一层。

复述任务
用一段话讲清楚:为什么"反例清单"是你独有、agent 给不了的资产,它在规格里起什么作用?
参考表述
反例是你过去失败的具体样子加上为什么错——它来自你在这个项目、这类产出上踩过的坑,训练语料里没有、agent 推不出来。把反例写进规格,等于把你脑子里的工程判断(Osmani 说的最后 30%)前置搬进规格,让 agent 第一次就避开,而不是你第 N 次手工修。所以反例清单是把"个人品味"转成"可委派规格"的关键一环。

讲不顺的地方就是还没真懂的地方 —— 发给我,我帮你补上。