乐于分享
好东西不私藏

AI 编程时代,你的需求文档可能正在「制造幻觉」:Spec 必须可追溯!

AI 编程时代,你的需求文档可能正在「制造幻觉」:Spec 必须可追溯!

导读
当 coding agent 可以直接把需求文档编译成代码,spec 里每一条没有来源的断言,都可能变成系统里一个”看起来合理、实际上错误”的幻觉实现。一位开发者的观点在社区引发热议:spec 一半是意图工程,一半是考古——而考古结论必须能指回原始来源。GitHub、Anthropic、OpenAI 的最新实践,都在把 spec 推向同一个方向:可追溯。

一条帖子,把”需求文档”拉回聚光灯下

2026 年 5 月 8 日,开发者 David Boskovic 在 X 上发了一段话:

“specs are half ‘intent engineering’ (thanks @jonbell) and half archeology

specs should never state an archeological fact without you being able to instantly reference the source”

「spec 一半是意图工程,一半是考古。任何考古事实,都必须能立刻指回来源。」

▲ David Boskovic 的原帖:spec = intent engineering + archeology

这个说法刺中了 AI 编程时代一个被严重低估的问题——当 agent 能把自然语言直接变成代码,需求文档本身的质量就决定了代码的质量。

他在回复里进一步解释:

“90% of the value is forcing the agent to cite. the remaining value is you being able to sanity check it.”

「90% 的价值在于强制 agent 引用来源。剩下的价值在于你能做 sanity check。」

还有一个数据值得注意:他团队的分析显示,超过 50% 的 token 消耗被浪费在重复发现已知事实和修复本可避免的问题上。好的 spec 会前置研究成本,但能大幅减少下游错误。

“意图工程”:把人的目标变成 agent 能执行的输入

先拆第一半——intent engineering。

传统需求文档的读者是人。工程师看完 PRD,会追问 PM、读代码、查历史、开会对齐。模糊的地方,靠人脑补全。

但 coding agent 的工作方式完全不同。它拿到 spec,直接开始实现。模糊的需求到了 agent 手里,不会触发追问,只会触发猜测。

GitHub 在 2025 年 9 月发布了一篇博客和一个开源工具包 Spec Kit,把这个问题说得很透:

“That’s why we’re rethinking specifications — not as static documents, but as living, executable artifacts that evolve with the project. Specs become the shared source of truth.”

「我们正在重新定义 spec——它不再是静态文档,而是随项目演进的、可执行的活制品。Spec 成为共享的事实源。」

▲ GitHub Blog 文章:用 AI 做 Spec 驱动开发

GitHub 的核心判断是:vibe coding(描述目标→拿回代码)在原型阶段好用,但在严肃应用和既有代码库里靠不住。问题出在哪?我们把 agent 当搜索引擎用了,但它其实是一个”字面意义上的 pair programmer”——你说什么,它就照做。

所以 spec 必须从”给人看的文档”变成”给 agent 执行的合约”。GitHub Spec Kit 把这个流程拆成四步:

1.Specify:定义 what 和 why,用户旅程,成功标准 2.Plan:技术栈、架构选型、遗留约束、合规要求 3.Tasks:把 spec + plan 拆成可审查、可测试的小任务 4.Implement:agent 逐项实现,每步可回溯到 spec

▲ GitHub 开源的 Spec Kit 仓库,提供了从 specify 到 implement 的完整工作流

这套结构背后的逻辑是:intent engineering 要做的事情,是把”想做什么、为什么做、怎样算成功”表达成 agent 可以执行、人类可以验证的格式。减少模型猜测空间,就是在减少错误空间。

“考古”:旧系统里藏着的地雷,spec 不挖就会踩

再拆第二半——archeology。

每个有历史的代码库里,都埋着大量”只有老人才知道”的知识:

  • 为什么这个接口不能改?因为三年前一个大客户的集成依赖了它
  • 为什么这个字段叫 `legacy_flag`?因为当初数据库迁移时的临时方案变成了永久方案
  • 为什么这个 edge case 要特殊处理?因为某次生产事故后加的 hotfix

这些知识藏在代码注释、commit message、旧 issue、wiki 页面、Slack 历史、甚至某个已经离职的工程师的脑子里。

当人类写代码时,遇到不确定的历史问题会停下来问。当 agent 写代码时,遇到不确定的历史问题会——补全。

它会根据命名规律、代码模式、训练数据里的常见做法,生成一个”看起来合理”的实现。这就是 Boskovic 说的”考古事实脱离来源”的危险:agent 在没有真实来源的情况下,制造出令人信服的虚假实现。

一位叫 tang 的开发者在回复中提到了一个现实场景:

CLAUDE.md(Claude Code 的项目级上下文文件)写了”always use X because Y”,但过了半年,没人记得 Y 是什么了。这条规则变成了一个没有来源的教条,agent 会遵守它,但没有人能判断它是否还有效。

这就是 reason drift——决策理由随时间消散,只剩下结论在系统里游荡。

上下文有限,所以来源比堆料更重要

Anthropic 在 2025 年 9 月发布的《Effective context engineering for AI agents》解释了一个关键约束:

“context engineering… curating and maintaining the optimal set of tokens…”

「context engineering 是选择并维护最佳 token 集合的策略。」

▲ Anthropic 工程博客:有效的 AI agent 上下文工程

context window 变大了,但信息回忆的准确度会随之下降。上下文必须被视为有限资源,边际收益递减

这意味着什么?把旧需求、代码片段、会议纪要、设计稿全部塞进 spec,反而会让 agent 表现更差。

更好的做法是:把 spec 写成高信号索引。每条关键断言带出处,agent 需要时再去加载。

比如,不要在 spec 里粘贴三屏的 CSV 导入逻辑代码,而是写:

❌ “必须保留老用户 CSV 导入的兼容路径”(没有来源,agent 猜着实现)

✅ “必须保留老用户 CSV 导入兼容路径。来源:PR #1847、客户工单 SUPPORT-3291、导入日志样本见 /docs/csv-migration-2023.md”(agent 可以去读具体材料再实现)

Anthropic 关于 just-in-time context 的段落很贴合考古场景:agent 可以维护轻量级标识(文件路径、查询、链接等),运行时再动态加载相关数据。可追溯 spec 不需要把所有考古材料复制进来,它只需要让 agent 和人类在需要时能立刻找到源材料

Agent 已经在读你的 spec 了——它读到了什么?

OpenAI 在《Building an AI-Native Engineering Team》中描述了 coding agent 在整个软件开发生命周期中的角色扩展:

“read a feature specification, cross-reference it against the codebase, and then flag ambiguities, break the work into subcomponents, or estimate difficulty.”

「读取 feature specification,与代码库交叉引用,暴露 ambiguity,拆分子任务,估算难度。」

▲ OpenAI 开发者指南:构建 AI 原生工程团队

这段话的含义很明确:agent 会拿你的 spec 去和代码库做交叉验证。

如果 spec 里写了”这个字段有历史原因不能删”,但没有指向具体的 PR、issue 或事故报告,agent 面对的就是一条不可验证的断言。它不知道自己应该验证事实、实现需求,还是沿着一条过期的 spec 继续构造错误。

Claude Code 的最佳实践文档也给出了操作层面的建议:

“Point to sources. Direct Claude to the source that can answer a question.”

「指向来源。把 Claude 引导到能回答问题的源头。」

具体包括:

  • 给 agent 验证方式
    :测试、截图、预期输出——没有明确的 success criteria,模型可能产出”看起来对但跑不通”的结果
  • 先探索、再计划、再编码
    :把 research 和 implementation 分离
  • 指向具体文件、约束和模式
    :不要让 agent 盲搜

强制 agent 引用来源,改变的是整个工作流:先从指定来源探索,形成计划,再实现并验证。Spec 的价值在于约束 agent 的搜索路径、事实来源和验收方式。

当心”幻觉链接”:LLM 做追溯也会出错

这里必须加一个警告。

有人可能会想:既然 agent 能读代码库、能做交叉引用,那让 AI 自动建立追溯链不就行了?

一篇 2025 年的 arXiv 预印本(2506.16440)专门评估了 LLM 做 documentation-to-code traceability 的能力。结果是:

  • 最佳模型的 F1 值达到 79.4%–80.4%
  • 但 relationship explanation 的完全正确率只有 42.9%–71.1%
  • 错误类型包括:naming-based assumptions(因命名相似而误连)、phantom links(幻觉链接)、overgeneralization(架构模式过度泛化)
“false positives stem from naming-based assumptions, phantom links, or overgeneralization of architectural patterns.”

「误报来自基于命名的假设、幻觉链接或架构模式的过度泛化。」

什么是 phantom link?模型看到文档里提到”用户认证模块”,代码里有个文件叫 `auth_handler.py`,就自信地说”这里有追溯关系”——但实际上文档说的是 OAuth 授权流程,代码里的是内部 API 鉴权,两者毫无关系。

AI 可以辅助发现追溯链接,但不能完全自动化。追溯链本身也会被模型幻觉污染。所以 spec 的追溯链应该尽量绑定原始材料和可检查标识——靠 agent 自行推断,靠不住。

可执行清单:一份可追溯 spec 应该包含什么

回到实践层面。综合上面所有来源,一份面向 AI 编程时代的 spec 至少应该覆盖这几个维度:

Intent(意图层)

  • 用户/业务目标
  • 非目标(明确排除什么)
  • 成功标准和可观察验收方式

Archaeology facts(考古层)

  • 为什么保留某旧行为
  • 某接口/字段/流程不能改的原因
  • 历史异常的上下文

Sources(来源层)

  • 文件路径 + 行号
  • Commit / PR / Issue 链接
  • 工单、设计稿、客户反馈
  • 法规条款、日志样本、监控指标

Verification(验证层)

  • 测试用例
  • 预期输出 / 截图
  • 性能指标
  • 人工审查点

Drift control(漂移控制)

  • 每条来源的时间戳
  • “这个结论是否仍然有效”的检查入口
  • 过期标记机制

回复区里一位叫 BLANPLAN 的开发者提到,他们团队已经在实践一种做法:每条 spec 断言都带 file:line citation。这不是行业标准,但方向和 Boskovic 的观点高度一致。

另一位开发者 Shreyas Shinde 提出了一个有价值的补充:”Don’t cite code though.”(不要只引代码。)很多需求的来源可能是用户研究、产品决策、设计系统或法规——可追溯应该指向恰当的来源类型,而不只是代码。

最后看回这件事

AI 编程正在重新定义”需求文档”的角色。

过去,spec 写得模糊,最坏的结果是工程师多问几轮、多开几次会。现在,模糊的 spec 会被 agent 直接编译成代码——错误进入系统的速度,比任何人类工程师都快。

GitHub 说 spec 要成为 source of truth。但 source of truth 如果自身没有来源,它就只是把未知的历史改写成了新的权威幻觉。

Boskovic 那条帖子的真正价值在于一个简单的要求:你写在 spec 里的每个”因为”,都应该能指回一个具体的”在哪里”。

意图工程决定 agent 往哪走。考古决定 agent 不踩哪些雷。可追溯决定这两者是否可信。

三个维度,缺一个,agent 就在猜。


— END —

— END —