如何通过 Spec Coding 构建自己的 AI Coding Harness

0 阅读26分钟

一、从一个案例说起:什么是 Harness

2025 年,OpenAI内部一个 3 人团队用 AI Agent 在 5 个月内完成了 100 万行代码的项目。人工手写代码量:0 行。合并了约 1500 个 PR,人均每天 3.5 个。

听起来像魔法,但关键不在 AI 有多强,而在于他们给 AI 搭了一套完整的约束、反馈与控制系统——他们称之为 Harness。

Harness 的原意是"马具"。 LLM 是一匹动力十足的烈马,Harness 就是让它全速奔跑、又不偏离轨道的那套缰绳。

  • 目前典型的落地 case:
公司 / 项目规模Harness 关键设计
Stripe Minions每周 merge 1300+ PR,零人类手写代码五层 Pipeline(Slack 消息 → 生产级 PR);每个 Minion 跑在隔离 devbox(完整 shell 权限,不能碰生产系统);Agent harness 基于 Block/Goose 深度 fork,针对无人值守场景大量改造;连接 Toolshed(集中式 MCP Server,~500 个工具,不同 Agent 按需请求子集)
OpenAI Codex3 人 · 5 个月 · 100 万行代码 · 0 行手写AGENTS.md 不能当百科全书——大文件挤占 context、腐烂得很快、没法机械化验证。缩至约 100 行当“目录”用,真正知识库放在结构化 docs/ 目录按需加载
Anthropic16 个 Agent 从零写出可编译 Linux 内核的 C 编译器(10 万行 Rust,$20K API)GAN 式架构:Generator 写代码,Evaluator 用 Playwright 实际操作应用打分;两者分离解决了“Agent 给自己作品打高分”的问题;组件随模型进化主动拆除
LangChain DeepAgents纯 Harness 优化(不换模型),Terminal Bench 2.0: 52.8% → 66.5%,排名 30+ → 前 5系统化的 prompt 工程 + 工具编排 + 执行策略优化,不更换底层模型
  • 总结下来:一个完整的 Harness 大概需要以下组件:
组件做什么
Context Engineering告诉AI你的工作环境、你拥有什么技能、你应该在这个环境下怎么工作? OpenAI 的做法是三级架构:全局 AGENTS.md(永远加载、极短、当目录用)→ 目录级 rule file(按 agent 工作位置自动加载)→ skill/docs/(按需 lazy load)
TDD + 静态分析让 agent 的每次修改都能被机械化验证。
架构约束告诉ai什么能做,什么不能做; 用目录级 rule file,agent 遍历文件系统时按目录自动加载对应 context
执行隔离Sandbox,这是所有其他层的物理保障。没有它,上面的约束都是"君子协定"。
Entropy 治理Agent 生成的代码会以不同方式积累技术债,需要定期跑 GC Agent 扫描文档 drift、命名漂移、死代码堆积

从个人视角看 Harness:通用 Agent + 个性化上下文

Harness 不只是团队级基础设施,个人开发者同样可以构建自己的 Harness。其核心公式:

个人 Agent = 通用 Agent + 个性化上下文&流程约束

通用 Agent(如 Claude Code)是底座模型加工具调用能力,每个用户拿到的一样。

上下文——你的偏好、工作流、项目结构、踩过的坑——完全由你定义,也是你的 Agent 区别于所有其他人的关键。上下文分为两层:

  • 第一层:行为规则(AGENT.md)——定义 Agent 怎么思考,每次启动全量加载
  • 第二层:能力模块(Skills)——Agent 的技能、经验

这两层合在一起就是你的个人 Harness。行为教训写入规则,能力经验提炼为 Skill

通用的模型harness只是模型能力缺口的临时解法,它随着模型变强,最终会被一点点拆掉。

但是个性化的上下文不会,你用它越久,上下文越丰富,Agent 表现越好——这不是模型变聪明了,而是 Harness 变厚了,模型越来越懂你了。而SpecCoding是用来积累项目个性上下文比较好的方式


二、Vibe Coding vs Spec Coding

维度Vibe CodingSpec Coding
工作方式Prompt → AI 猜测 → 反复修改先写规格 → AI 按规格生成
AI 角色决策者 + 执行者纯执行者 / 高速打字员
人类角色反复纠错的 debugger架构师 + Spec 设计者
适用场景快速原型、探索性实验生产项目、复杂系统
可控性低——同一 Prompt 每次结果不同高——规格即契约,输出确定性强
可维护性好——Spec 本身就是活文档

一个比喻:

Vibe Coding 像是对马喊话,希望它听懂;Spec Coding 像是给马铺好轨道,它只能沿轨道跑。

简单来说,Vibe Coding对于复杂系统,没有规格,反复修改折磨人;做完了也没有做到复利工程,沉淀知识文档。

为什么需要 Spec Coding

1. 消除歧义,让 AI 不再猜

规格说明成为契约,AI 无需猜测。数据库 schema、API 限流、合规规则在写代码前就锁定;每个 task 有明确的验收标准,测试可靠执行。

2. 维护增量迭代的项目知识文档

这是很多人忽略的一点。在没有 Spec 的情况下,项目的「知识」分散在三个地方:

  • 代码本身(但 AI 不一定能读懂历史决策)
  • 开发者的脑子里(换人就丢)
  • 零散的飞书文档、聊天记录、PR 描述里(没人维护,很快过时)

Spec Coding 把这些知识沉淀成跟代码一起进 Git 的 Markdown 文件。每次做需求都会产生 proposal、design、tasks,完成后归档到 specs/。这意味着:

  • 新人接手时,读 specs/ 目录就能了解每个模块「是什么、为什么这样做」
  • AI 接手时,直接加载对应的 spec.md 就能获得完整上下文,不用每次重新「学习」整个仓库
  • 改需求时,归档记录就是变更历史,能回溯「当时为什么这样设计」

本质上,Spec 文件就是项目的增量知识库:每做一个需求自动积累一份文档,而不是另外花时间写。


三、OpenSpec:一个轻量级的 Spec Coding 框架

它是什么

OpenSpec 不是 IDE 插件,不是 SaaS 平台,而是一个纯 CLI 工具(Node.js),核心产物就是一堆 .md 文件。这些文件同时服务两个读者:人类AI Agent

属性说明
定位轻量级 Spec-Driven Development 框架
核心理念"Agree before you build"——先对齐规格,再写代码
擅长场景Brownfield(已有项目迭代 1→n),不只是 0→1
底层存储纯 Markdown + 文件系统,跟代码一起进 Git
兼容性支持CoCo(Trae Cli) / Claude Code / Cursor / Copilot / Windsurf 等 20+ 工具

为什么选 OpenSpec

市面上的 Spec Coding 工具很多

Spec Kit(GitHub)——功能全面但体积庞大。它有严格的阶段门控、大量的 Markdown 代码以及 Python 配置。OpenSpec 更轻量级,允许你自由迭代。

Kiro(AWS)相比——功能强大,但你只能使用他们的 IDE。

OpenSpec 可以与你已使用的工具兼容。

与没有规范的情况相比——没有规范的AI编码意味着模糊的提示和不可预测的结果。OpenSpec无需繁琐的流程即可带来可预测性。

选 OpenSpec 的三个理由:

1. 足够精简,上手成本低,更好落地

落地难不难,很多时候取决于团队愿不愿意每天都用它

OpenSpec 核心只有 3 个命令:proposeapplyarchive——它把 specify + plan + tasks 合并到 propose 一步生成,少了不必要的中间态,减少了使用者使用负担。

2. 流程可插拔,适合往自己的工作流里塞东西

OpenSpec 的规范就是一堆 Markdown 文件,不需要特殊格式、不强绑定特定平台。想在 proposal 和 design 之间加一步「架构评审」?直接在 changes/ 文件夹里加个 review.md 就行。调 Linter、跑测试、接 CI——这些都是你自己往流程里加的,框架不会拦你也不会替你做。

3. 真正适合从 1→n 的项目

Spec Kit、Kiro的流程更偏向从 0 开始建项目:先写 PRD、再做架构、再拆 Story。但现实中大多数场景是已有项目加功能——你不需要重新写 PRD,你需要的是「这次改什么、怎么改、改完归档」。OpenSpec 的 changes/ 机制天然就是为这个场景设计的:每个需求一个独立文件夹,多需求并行不打架,完成后 spec 自动合并回主目录。

它怎么做上下文工程

OpenSpec 用文件系统充当 AI 的"外部长期记忆"init 后只生成 以下文件,极其轻量:

暂时无法在飞书文档外展示此内容

1. AGENTS.md ——给机器人看的 README

内含 <openspec-instructions> 标记块,告诉 AI:遇到 "plan""proposal""spec" 等关键词时,必须先读此文件。它定义了 AI 的行为准则、读取顺序和 Workflow 阶段约束。

暂时无法在飞书文档外展示此内容

无论 AI 工具是否原生支持 OpenSpec,只要读了这个文件就会被强制纳入 Workflow。这是 Harness 的"缰绳入口"。

2. project.md ——全局上下文锚点

AI 理解项目的"世界观"。需要填写技术栈及版本、架构约束、编码规范、业务领域术语。把项目级约束固化为文件,AI 每次工作时读取,减少幻觉和风格漂移。

3. specs/ ——Source of Truth(随项目积累)

按功能模块组织的 Spec 文件,描述系统当前行为。使用 GIVEN/WHEN/THEN 格式:

暂时无法在飞书文档外展示此内容

AI 改某个模块时,只加载该模块的 spec.md——按需加载,Token 高效

4. changes/ ——变更工作区(按需创建)

每个需求一个独立文件夹,物理隔离:

暂时无法在飞书文档外展示此内容

三层上下文控制机制:

层级文件作用
全局层project.md技术栈版本、架构模式、编码规范——AI 的"世界观"
指令层AGENTS.md行为准则、读取顺序——强制 AI 进入 Workflow
任务层specs/ + changes/当前系统增量变更 + 本次变更的精确范围——按需读取

它怎么做 Workflow

OpenSpec 用一个四阶段状态机约束 AI 的行为顺序:

暂时无法在飞书文档外展示此内容

阶段命令AI 做什么产出物
Propose/opsx:propose读上下文 → 生成提案 + 任务拆解 + 技术方案proposal.md tasks.md design.md
Defineopenspec validate写 Spec 增量,通过校验specs/ 增量文件
Apply/opsx:apply按 tasks.md 逐条实现,严格参照 spec源代码变更
Archive/opsx:archive增量 spec 合并回主 specs/,清理 changes/更新后的 Source of Truth

核心约束:

  • 写代码前不准动手——Phase 1-2 全部是规划和定义,0 行代码产出

  • AI 只管 How,不决定 What——Apply 阶段认知负载大幅降低

  • 变更隔离——每个需求在 changes/ 下有独立文件夹,类似 Git Branch 的物理隔离

  • 文档永不滞后——Archive 时 spec 自动合并,代码和文档始终同步

什么时候应该使用

OpenSpec足够轻量,所以几乎没有使用成本,大部分场景都应该使用上,不让文档滞后。

适合用 SDD不适合用 SDD
生命周期长、需持续迭代的模块一次性脚本 / 临时工具
AI 参与主流程编码几行代码的 hotfix

四、实践 Tips

一、存量知识对齐

Tip 1:系统存量知识应该如何产出

接入新项目时,用“先学后问”替代“直接整理”

把 AI 接入一个新项目时,很多人的第一反应是“帮我整理一下项目结构”。AI 会老老实实地跑一遍代码,产出一份看起来像样的总结——但这份总结往往停留在文件名和目录结构层面,缺乏业务语义、历史决策背景和团队黑话的理解。

正确做法:先学习(提供核心的技术方案、产品文档),再提问,最后整理。 分三步走:

步骤AI 做什么你做什么
1. 自主学习阅读代码、配置、文档、测试,形成初步理解不干预,让它先自己消化
2. 结构化提问基于学习结果,主动向你提 20 个问题逐一回答,把随口说的黑话和背景交代清楚
3. 输出知识文档基于完整理解,输出结构化的项目知识文档Review + 纠偏

为什么“20 次提问”是关键环节: AI 读代码能知道 what,但不知道 why。业务黑话、历史包袱、设计取舍只有团队成员知道。通过 AI 主动提问,倒逼它暴露自己的认知盲区。而 20 个精准问题的信息密度,远超一份自动生成的总结。

直接整理先学后问
AI 认知深度文件结构 + 代码表面业务语义 + 设计决策 + 团队共识
产出质量看起来完整,但缺关键信息真正对齐团队认知
人工投入低(但后续反复纠偏)中(一次性投入,后续省心)
典型失败“这个模块是干什么的?”——AI 只能复述代码注释AI 能回答“为什么用这个方案而不是 X”

AI 提问应该覆盖的维度:

  • 业务概念与黑话:代码里的变量名/模块名对应的业务含义是什么?

  • 核心模块的设计决策:为什么这样做,不那样做?考虑过哪些替代方案?

  • 历史包袱与已知技术债:哪些代码是“知道不好但暂时没改”的?

  • 团队约定:命名规范、分支策略、发布流程、Code Review 规则

  • 跨模块依赖与数据流:谁调谁、数据怎么流转、边界在哪

  • “看代码看不出来”的隐性规则:线上配置、环境差异

二 、需求澄清阶段


Tip 2:目标模糊时,用结构化 Brainstorm 替代直接提案

很多时候启动一个需求时,脑子里只有一个粗略方向,并不清楚最终要做成什么样。如果这时直接让 AI 生成 proposal,得到的往往是一个“看起来合理但不是你想要的”方案,然后陷入反复修改的循环——本质上又退回了 Vibe Coding。

Superpowers 框架提出了一个前置环节:强制 Brainstorm

核心思想是设一个硬性门控——在设计被人类批准之前,AI 不允许做任何实现动作,无论项目看起来多简单

步骤AI 做什么关键规则
1. 探索项目上下文检查现有文件、文档、最近 commits先了解现状再提问
2. 评估范围如果涉及多个独立子系统,先拆分每个子系统走独立流程
3. 逐个澄清一次只问一个问题,优先用多选题聚焦目的、约束、成功标准
4. 提出方案2-3 个不同方案 + 权衡分析 + 推荐不要只给一个“最佳方案”
5. 分段呈现设计简单部分几句话,复杂部分详细展开每段确认后再继续下一段
6. 写入文档保存为 brainstorm.md作为 proposal 的正式输入
7. 自动审查检查完整性、一致性、清晰度、YAGNI最多迭代 3 次,超出则人工介入

在 OpenSpec 中集成 Brainstorm:openspec/changes/ 的变更目录中增加 brainstorm.md 作为 proposal 的前置制品

什么时候用 Brainstorm,什么时候直接 Propose:

场景建议
目标清晰,知道要做什么、做成什么样直接 /opsx:propose
方向模糊,只有粗略想法先 brainstorm,再 propose
技术方案不确定,有多种可行路径先 brainstorm 比较方案
需求来自他人,你对背景不完全了解先 brainstorm 梳理上下文

Tip 3:如何保障提案阶段的完整性?

  • Human-in-the-Loop 提案法——别一次性说清,让 AI 问你

不推荐直接给 AI 一个文档或一次性说清所有诉求(如果是特别大的迭代,那最好先搞一版技术文档~)。更好的做法是让 AI 通过提问来 逼出 你脑子里的隐性需求。三步走:

步骤你做什么AI 做什么
1. 抛出意图我想给调度封装一层调度层,可以配置定时调度的实例数、参数基于已有记忆做初步梳理
2. 接受提问逐一回答反问 10-20 个问题(背景、边界、实现细节、异常处理等)
3. 生成方案Review + 纠偏输出完整的 proposal + design + tasks

为什么这样做:

  • 需求完整度:AI 的提问帮你查漏补缺,比你一次性想全要靠谱
  • 隐性知识显性化:很多你以为 说了 但 AI 没理解的东西,通过 Q&A 被明确表达出来
  • 方案质量:AI 在充分理解后生成的方案,一次成型的概率远高于反复修改Prompt 模板参考:

暂时无法在飞书文档外展示此内容

  • 每次提案完成之后,AI应该需要知道的内容

Tip 4:让 AI 质疑你,而非谄媚你

大多数 Agent 有明显的谄媚倾向——你说什么它都同意,即使方案有漏洞也直接执行。谄媚的根因往往在 Prompt 本身。当我们把观点当事实陈述时,AI 收到的信号是 执行 而非 思考 :

Prompt 写法AI 行为
X 比 Y 好,请用 X 重写被动执行,不质疑
我在 Y 上遇到了 A、B、C 问题,有哪些选项?主动分析,给出多方案

Claude Code 在这方面有明显的质疑倾向,但不能只依赖模型默认行为。需要在 System Prompt 中显式强化。

三、需求实现阶段


Tip 5:任务清单拆到足够细,Task by Task 实现

Propose 阶段把任务拆到原子级,Apply 阶段逐个 Task 实现,每个 Task 完成后自己 Review 或启一个 Review Agent。和 一把梭 的区别:

一把梭Task by Task
幻觉概率高——上下文膨胀,AI 容易丢失前文低——每个 Task 上下文聚焦
实现降级高——Agent 判断完不成时,主动降级为极简版本低——单个 Task 粒度小,AI 有能力完成
可控性差——出问题不知道哪一步引入的好——每步可审、可暂停、可纠偏
回滚成本大——牵一发动全身小——只需回滚出问题的单个 Task

实现降级现象: 当一次性任务过于复杂时,Agent 判断自己无法完整实现,会自动降级为一个极其简陋的版本。表面上 完成了 ,实际交付的是残缺功能,开发者可能到集成阶段才发现。Task 拆分的粒度标准:每个 Task 能独立实现并独立测试;一个 Task 的实现不应超出 AI 单次对话的上下文能力;

  • 在AGENT.md中进行约束

Tip 6:让 AI 在实现时埋好"可追踪日志"——把排查成本前置为实现成本

代码写完能跑只是第一步,线上出问题能快速定位才是工程成熟度的体现。大多数人的做法是:出了问题 → 手动翻日志 → 一条条拼 logID → 跨 PSM 追链路,一次排查动辄半小时。

更好的做法:让 AI 在写代码的时候,就把结构化可追踪日志埋进去。

核心原则:

  • 关键函数入口/出口必须打日志,包含业务标识(如实例编码 instanceCode、批次号 batchId
  • 耗时操作(RPC 调用、DB 查询、外部接口)打印耗时 + 入参摘要 + 返回状态
  • 日志格式结构化,确保字段可被日志平台检索,而非随意拼接字符串
  • 业务链路贯穿,同一条业务操作的所有日志共享统一的业务 ID,而非只靠 traceID

在 AGENTS.md 或 specs 中加一段日志规范约束,让 AI 每次写代码自动遵守:

暂时无法在飞书文档外展示此内容

这样做的真正回报:排查时你不甚至不需要 logID,只要给 AI 一个业务关键信息(比如一次核算的实例编码),AI 就能通过 bytedcli 等工具自己查日志,跨 logID、跨 PSM 串起整条链路,定位到问题根因。

传统模式:人肉翻日志 → 找 logID → 跨服务拼调用链 → 30 min

ai查日志模式:丢给它关键的业务标识和动作,异步排查,后续自己再看排查结果~

本质上是把"排查成本"前置为"实现成本"——写代码时多花 5 分钟埋日志,上线后每次排查省 30 分钟。而且这 5 分钟的活 AI 自己就能干,你只需要在规范里约束它。


四、测试验证阶段

Tip 7:Propose 阶段融合 TDD——先写测试,再写代码(可选)

AI 写代码的速度已经不是瓶颈,质量才是。TDD(测试驱动开发)的核心逻辑是:先写测试 → 再写代码 → 再重构,用测试驱动代码设计,而不是写完代码再补测试。具体是一个三步循环:

阶段做什么目标
🔴 Red先写一个会失败的测试用例,此时功能还没实现,测试必然跑红明确「我要实现什么功能」
🟢 Green只写最少、最简单的代码,让测试变绿,不追求完美先跑通,让测试通过
🔁 Refactor在测试保持绿色的前提下,优化代码结构和命名代码变干净,不改功能只改质量

为什么要先写UT?

TDD 派的核心论点是:如果让 agent 同时写代码和测试,它会写出 tautological test——测试只验证"代码做了什么",而不是"代码该做什么"。测试先于实现,就切断了这条作弊路径。

先写 UT(TDD 方式)后写 UT(反模式)
测试立场基于 Spec 定义的期望行为基于已实现的代码逻辑
AI 行为必须理解 做成什么样算好的面向结果编写,总能写出 100% pass 的单测
测试价值真正验证逻辑正确性只是给现有代码补一层 绿色外壳

关键逻辑链:

Spec(期望行为)→ UT(可执行验证)→ 代码实现(让测试变绿) 如果基于已实现的代码写单测

AI 总是能写出 100% 通过的单测——因为它是 面向结果编写 ,而非 面向预期编写 。这类单测本质上是对现状的复述,不具备发现缺陷的能力。

如何在 OpenSpec 中落地 TDD:

  • 让TDD成为铁律(Iron Law),在 AGENTS.md 中注入 TDD 约束:

暂时无法在飞书文档外展示此内容

没有失败测试,就不准写生产代码。如果在测试之前写了代码——删除它,从头开始。不要保留作“参考”,不要“改编”它。删除就是删除。

在 tasks.md 中嵌入 TDD 步骤结构: 把每个 Task 从简单的 checkbox 升级为内建 RED-GREEN-REFACTOR 循环的结构化步骤:


Tip 8:生成与评估分离——用不同 Agent 写代码和 Review 代码

为什么单 Agent 自我 Review 没用? 一个 Agent 写完代码后评价自己的产出,永远觉得「还不错」。这不是模型能力问题,而是结构性缺陷:

  • 自我评价失真:agent 评价自己的作品时会自信地给高分,即使质量明显一般
  • 上下文污染:写代码过程中的探索、试错、中间态全在窗口里,影响 Review 时的判断
  • 角色冲突:同一个上下文中既当运动员又当裁判,无法客观借鉴 GAN 的思路:Generator-Evaluator 分离核心思想:让「生成」和「评估」分离到不同 Agent,各自有独立的上下文窗口,互不污染。
角色职责为什么要独立
Generator Agent按 tasks.md 写代码专注实现,不被 Review 反馈干扰上下文
Evaluator Agent拿到代码后对照 spec 做 Review没写过这段代码,没有沉没成本,只看结果说问题

Evaluator 只关心一件事:这段代码是否符合 spec 的定义? 它不知道代码是怎么写出来的,不在乎作者的意图,只在乎结果是否达标。

怎么落地? 最简单的方式:在 tasks.md 的每个 Task 完成后,启动一个新的 Agent 会话做 Review。新会话 = 干净的上下文窗口,只包含 spec + 待审代码。在 AGENTS.md 中配置:

关键点:Spec 文件是 Evaluator 的标尺。没有 spec,Review Agent 也不知道该用什么标准评判

五、知识沉淀

Tip 9:如何更好地积累项目知识?

  • 渐进式披露——建索引,别堆大文件

把所有项目知识堆在一个 .md 里,看似信息全面,实际效果更差。当上下文窗口使用超过 40% 后,AI 注意力分散、遗忘加剧。正确做法:建立一个顶级索引文档作为目录入口,AI 先读索引,再按需深入具体文档。

暂时无法在飞书文档外展示此内容

类比:就像一本书的目录——你不会为了查某个概念通读全书,你看目录定位到章节,直接翻过去。AI 也一样。OpenSpec 的 AGENTS.md 里已经内置了这个思路:

暂时无法在飞书文档外展示此内容

关键词是 relevant——不是 all,是相关的那个。索引结构让 找到 relevant 这件事变得可靠。

我自己的知识库文档,都会写一个索引文件,这个文件会披露当前目前下的知识索引

暂时无法在飞书文档外展示此内容


串起来:一个完整需求从 0 到归档的流程

各阶段详解:

阶段做什么关联 Tip产出物
Phase 0: 知识对齐首次接入项目时,AI 先自学再提问 20 个问题,快速对齐业务语义和设计背景Tip 1project.md / mrap-doc 更新
Phase 1: 需求澄清目标模糊时先 Brainstorm,通过 Socratic 式对话理清思路;目标清晰则跳过Tip 2brainstorm.md(可选)
Phase 2: 提案/opsx:propose —— 让 AI 先提问再生成方案,强制质疑而非谄媚,任务清单内嵌 TDD 步骤结构Tip 3 + Tip 4 + Tip 7proposal.md + design.md + tasks.md(含 RED-GREEN-REFACTOR)
Phase 3: 定义openspec validate —— 只加载相关模块的 spec,写增量并通过校验Tip 9specs/ 增量文件
Phase 4: 实现/opsx:apply —— 逐 Task 实现,埋好可追踪日志,每个 Task 走完整 RED-GREEN-REFACTOR 循环,完成后启独立 Review Agent 对照 spec 审查Tip 5 + Tip 6 + Tip 7 + Tip 8源代码变更
Phase 5: 归档/opsx:archive —— 增量 spec 合并回主 specs/,清理 changes/,保证文档与代码始终同步更新后的 Source of Truth

五、个性化上下文——项目知识沉淀

这一章解决的就是:怎么把项目知识组织好,让 AI 按需加载、越用越准。

核心思路只有一句话:分层存放、按需加载、持续沉淀。

项目知识目录结构

暂时无法在飞书文档外展示此内容

各层职责一张表讲清

解决什么问题应该存什么何时更新
AGENTS.mdAgent 每次会话的"第一口饭"技术栈、命令、目录结构、三级边界、指向深层文档的链接架构/流程有变时
standards/跨 feature 不变的持久约束代码风格、测试策略、API 约定、错误处理规范规则有共识变更时
guides/新人第一天能跑起来环境搭建、架构总览、开发流程、测试规范架构/基础设施/流程变更时
domains/快速理解一个领域的边界核心概念、模块职责、接口语义、设计决策领域模型/接口语义变化时
playbooks/出了事照着做就行事故响应、数据迁移、发版检查——可执行操作序列操作流程变更、复盘发现缺失时
topics/跨领域技术专题深潜性能调优、幂等设计、多租户隔离等跨域方案方案落地验证后沉淀
skills/个人可执行知识 + 经验库排查流程、工具套路、踩坑经验踩坑时随手记

做一个需求时,知识怎么流转

上面的表格讲了"各层放什么",但更关键的问题是:通过 OpenSpec 做一个需求的过程中,这些知识层到底在什么时候被读、什么时候被写?

下面用一个完整的需求生命周期,把每个阶段的知识流转说清楚:

需求阶段你在做什么Agent 读取哪些知识(输入)产出 / 更新哪些知识(输出)
① 需求启动写 proposal.md——明确做什么、为什么、影响范围AGENTS.md(项目全局感)→ domains/(理解涉及领域)→ specs/(已有能力边界)changes/xxx/proposal.md(新建)
② 方案设计写 design.md——数据模型、接口变更、状态机、边界 casedomains/(领域概念)→ specs/(接口契约)→ standards/(代码规范、API 约定)→ topics/(跨域技术方案)changes/xxx/design.md(新建)
③ 任务拆解拆 tasks.md——把设计拆成可执行的开发任务清单design.md(本次方案)→ guides/(开发流程、测试规范)changes/xxx/tasks.md(新建)
④ 编码实现Agent 按 tasks 逐个执行编码standards/(编码规范实时约束)→ design.md + tasks.md(施工蓝图)→ domains/(业务逻辑确认)代码本身 + changes/xxx/ 下的附加资产:usage-manual.md、配置说明等
⑤ 踩坑与调试遇到问题排查、调试、绕坑playbooks/(已有 SOP)→ topics/(相关技术方案)→ memory/(历史踩坑经验)memory/entries/xxx.md(记录本次踩坑经验);如果排查路径稳定,升级为 skills/
⑥ 需求完成代码合并、验证上线changes/ 全部资产(自检完整性)补全 implementation-checklist.md(验收清单);移入 archive/
⑦ 归档升格需求沉淀为长期知识资产changes/ 归档资产(提炼素材)能力稳定 → 提炼到 specs/;领域概念变化 → 更新 domains/;使用手册 → 关联到 domains/ 对应文档;新增目录/模块 → 更新 AGENTS.md 索引

一句话总结这个流转

做需求的过程是 从外圈知识读、往内圈知识写 ——Agent 从 AGENTS.md、domains、specs 获取上下文,把产出写入 changes;

需求完成后再 从内圈往外圈升格 ——changes 中的稳定能力提炼到 specs,领域知识回写 domains,新增模块更新 AGENTS.md 索引。

这样形成了一个 知识飞轮 :每做一个需求,项目知识库就更完整一圈,下一个需求的 Agent 上下文就更准一分。

工程师的工作内容变了——从写代码到写任务描述 + review AI PR + 维护 harness——但人还是需要的。真正被省掉的是人手敲键盘写实现的那段时间,不是人本身。

AI 替你写了代码,但"写什么代码"和"这代码对不对",还是你的活。

快速食用 bootstrap.md

对AI说:下载使用它! github.com/bwj177/open…