AI_Harness
前言
Github:https://github.com/HealerJean
一、Harness 是什么
Harness一词来自马具——缰绳、马鞍、嚼子——这是一套引导强大但不可预测的动物的完整装备。驾驭工程不是去削弱 AI 的能力,而是为它打造一套黄金缰绳,让它跑得又快又稳。
AI 模型已经能写出 100 万行代码。真正的挑战不再是让它写得更好,而是怎么驾驭它稳定、可靠、不失控地工作。这套围绕 AI 智能体构建约束、反馈与控制系统的方法论,就是 2026 年初迅速席卷工程圈的新范式——Harness Engineering(驾驭工程)。
-
传统工程:人类写代码 → 机器执行代码
-
Harness Engineering:驾驭工程是围绕 AI 智能体,构建约束机制、反馈回路、工作流控制、持续改进循环的系统工程实践。
1、Harness 的发展过程
这个概念由 HashiCorp 联合创始人 Mitchell Hashimoto 在 2026 年 2 月 5 日首次提出,六天后 OpenAI 在百万行代码实验报告中正式采用这一术语,随后 Martin Fowler 撰文深度分析,一个月内成为开发者社区的高频词。
harness engineering is the idea that anytime you find an agent makes a mistake, you take the time to engineer a solution such that the agent will not make that mistake again in the future.
—— Mitchell Hashimoto
控制工程的思想是,每当你发现一个代理犯了错误,你就花时间设计一个解决方案,这样代理将来就不会再犯同样的错误。
这句话的潜台词是:Agent 的每一次失败,都是环境设计不完善的信号。正确的回应不是换一个更强的模型,而是重新设计它运行的环境。
2、AI 工程范式的三次跃迁

| 范式 | 核心问题 | 优化对象 | 交互模式 |
|---|---|---|---|
| 提示词工程 | 怎么把话说清楚 | Prompt 的措辞、格式、示例 |
一问一答 |
| 上下文工程 | 怎么给 AI 喂信息 |
文档、代码片段、历史对话 | 信息注入 → 生成 |
| 驾驭工程 | 怎么让 Agent 可靠工作 |
约束、反馈回路、控制系统 | 人类掌舵,Agent 执行 |
-
Prompt工程:对着马喊话指挥 -
Context工程:给马配好地图和粮草 -
Harness工程:给马修高速公路 + 护栏 + 限速 + 补给站
2、Agent 常见失败模式
Anthropic 工程师在长时间运行 Agent 的过程中,总结了三种典型的翻车姿势,正是驾驭工程要解决的核心痛点:
失败模式 1:试图一步到位(One-shotting):Agent 倾向于在一个会话里把所有功能都做完。结果是上下文窗口耗尽,留下一堆没有文档的半成品代码,下一个会话启动时只能花大量时间猜测之前发生了什么。
失败模式 2:过早宣布胜利:部分功能做完就自认为任务完成,忽略剩余需求,擅自终止工作流。
失败模式 3:过早标记功能完成:写完代码直接判定完工,跳过单元测试、端到端测试,局部通过不代表线上可用。
此外,智能体还有一个危险特性:Agent 擅长模式复制放大,会原样照搬代码库坏架构、坏规范,极速堆积技术债务,无约束会越做越烂。
二、Harness 核心四大组件

| 核心组件 | 解决的问题 | 代表实践 |
|---|---|---|
上下文工程 Context |
Agent 不知道该看什么、怎么找 | AGENTS.md 活文档、按需检索 |
架构约束 Constraints |
Agent 复制并放大坏模式 | 分层依赖、自定义 Linter、CI 强制阻断 |
反馈循环 Feedback |
Agent 不知道自己做错了 | Agent-to-Agent Review、自动测试套件 |
熵管理 Entropy |
技术债务和文档腐烂 | Doc-gardening Agent、持续垃圾回收 |
1、护栏一:上下文工程(Context Engineering)——新员工手册
定位:AI 新员工入职手册
解决问题:AI 不知道该看什么、上下文塞满、文档陈旧无用
核心实践
AGENTS.md作为唯一入口:项目根目录必备,精简规则,不堆砌大段文档- 按需动态检索:上下文是稀缺资源,不一次性全灌入,按任务拉取对应文档
- 活文档机制:文档不是静态废品,每次
Agent踩坑就更新规则,形成反馈闭环
2、护栏二:架构约束(Architecture Constraints)——缰绳
定位:AI 行为缰绳
解决问题:Agent 乱改目录、反向依赖、破坏分层、放大坏代码模式
核心实践
- 固定分层依赖:
Types → Config → Repo → Service → Runtime → UI,禁止下层反向依赖上层 - 自定义架构
Linter:把架构规则编码成可检测脚本 CI强制阻断:违反架构规则直接拦截合并,人机写代码一视同仁- 友好报错提示:
Linter报错不只报错误,还要解释原因 + 正确写法,让AI自修复
3、护栏三:反馈循环(Feedback Loop)——智能体审智能体
定位:智能体审智能体
解决问题:AI 不知道自己写错、测试无效、自我糊弄
核心实践
- 放弃纯人工
CR,改为Agent互审 / 自审,自动挂载测试套件,失败自动带回错误信息重试 - 校验测试有效性:如果
AI写的测试用例通过了带有Bug的代码,Harness就会判定测试无效,强迫它重新思考测试边界。
4、护栏四:熵管理(Entropy Management)——垃圾回收
定位:系统垃圾回收器
解决问题:软件熵增、技术债务堆积、文档腐烂过时
核心实践
- 小额持续还债:后台定时扫描代码偏差、架构漂移,小额重构,不积压大债务
- 文档园丁
Agent:自动检测代码与文档不一致,自动提交PR修复
三、行业六大统一共识
- 瓶颈在基础设施,不在模型智能:换模型提升有限,优化
Harness可实现分数翻倍 - 文档必须是活的反馈循环:静态文档是坟场,动态文档才有价值。让后台
Agent定期清理过时文档并提交 PR - 思考与执行分离:复杂任务不可能在单个上下文窗口内完成,需要
Orchestrator+Worker分层架构,状态持久化到外部存储 - 上下文不是越多越好:上下文是稀缺资源。巨大的指令文件会挤掉任务空间,应按需检索、动态注入
- 约束必须自动化:人工
Review是瓶颈。护栏要编码为Linter、CI、类型系统,让机器来执行而非人 - 工程师角色彻底转型:从代码的编写者变成环境的建筑师。最大的工程挑战是设计让
Agent可靠工作的控制系统
四、Harness 与传统框架的关系
框架解决怎么建 Agent,
Harness解决怎么让 Agent 可靠稳定长期干活。
从上到下层级清晰,不冲突、是叠加关系:
Harness驾驭层:约束、反馈、上下文、熵管理、生命周期管控- Agent 框架层:LangGraph/AutoGen/CrewAI,负责任务编排、消息路由
- SDK/API 层:OpenAI/Anthropic 模型调用、工具注册
- 基础模型层:GPT/Claude/DeepSeek 提供原生智能

五、Harness 落地
1、标准落地工作流
1)阶段 0 初始化
-
项目根目录创建
AGENTS.md(项目简介、技术栈、目录规范、禁止操作、流程规则) -
建立架构目录规范、配置自定义
Linter脚本 -
Git初始化,锁定初始基线版本
2)阶段 1 需求→方案(先设计后编码)
-
输入原始需求
-
Agent输出详细技术方案(接口、数据模型、目录路径) -
人工确认通过,才允许进入编码,避免返工
3)阶段 2 编码开发
- 严格遵循
AGENTS.md+ 架构分层规则 - 自动运行架构
Linter,违规立即提示修复 - 代码格式化、类型校验,合规后提交
4)阶段 3 测试验证(强制卡点)
- 自动生成单元测试 / 接口测试
- 运行测试套件,不通过禁止合并
- 测试失败触发反馈循环,自动分析修复重试
5)阶段 4 文档更新 + 熵管理
- 同步更新
README、API文档 - 文档园丁自动校验文档与代码一致性
- 清理冗余配置、重置上下文,防止熵增
2、常见坑 & 避坑指南
1)AGENTS.md 写太笼统
后果:Agent 随意发挥、乱改架构
解法:规则要可检测、可落地、有禁止清单、有历史坑记录
2)一次性灌入全部上下文
后果:上下文溢出、AI 抓不住重点
解法:小而精入口 + 按需动态加载
3)只写代码不做强制测试
后果:AI 自我欺骗,假装完成任务
解法:CI 强制绑定测试,不过不允许提交
4)长期不做熵管理
后果:技术债务堆积、架构慢慢漂移
解法:定时后台重构 + 文档巡检,小额持续还债
六、编码知识核心概念
| 概念 | 核心定位 | 解决问题 | 核心特性 |
|---|---|---|---|
CLAUDE.md |
项目全局说明书 | 这个项目的开发硬性规矩和常用命令是什么 | 全自动加载、只读硬约束、建议 <200 行 |
rules |
行为约束与规范 | AI 在交互和写代码时绝对不能触碰的底线 |
强制遵守、干预回复格式、长期不改动 |
spec/ |
spec.md:要做什么:行为与需求;design.md :怎么做:架构与方案 |
动态新需求兵工厂,控制新需求演进 | 高频变动。每个新特性(Feature)对应一个专有 Spec 夹 |
.context/ |
静态参考资产 (外挂大脑) | 锁定项目既有记忆。防止 AI 遗忘历史逻辑、改错高风险区域 | 持续追加。随业务滚动,做检索 RAG 资产 |
1、深度解析:四大核心组件
1)CLAUDE.md(持久会话上下文)
核心作用:每次会话自动加载,全局持久生效,存放项目固定规则、约定、命令,无需每次重复叮嘱 Claude。
适用场景:项目技术栈、包管理器规范、提交规则、禁止修改目录、构建 / 测试命令、编码强制约定。
使用技巧:Claude 两次违背约定,直接把规则补进 CLAUDE.md,不要每次聊天口头纠正。
判断标准:一个新同事看完能少问三五个问题,AI 看完也一样。凡是你反复提醒过 AI 的内容,都应该考虑沉淀进 AGENTS.md。
什么时候更新:
-
当 AI 连续两次犯同一个错,把纠正方式写进去。
-
当 Review 里反复出现同类问题,把评审标准写进去。
-
当脚手架、测试框架、包管理器变化时,第一时间更新命令。
-
当某个模块风险升高,比如支付、权限、数据迁移,新增局部规则。
关键特性
- 会话启动全自动加载
- 可通过
@path导入其他规则文件 - 不能主动触发工作流命令
- 建议控制在 200 行以内,冗余内容拆到 Skills
# CLAUDE.md - 项目上下文与开发规范
## 1. 系统提示指引
- 本文件是项目命令、技术栈和编码规范的绝对真理源(Source of Truth)。
- 每次会话开始时自动加载,请务必严格遵守,不得违反以下任何规则。
- 回复请保持简明、直接、聚焦于代码实现,拒绝任何客套话与废话。
## 2. 技术栈与环境
- **前后端/语言:** Node.js (v20+), TypeScript (严格模式)
- **核心框架:** Next.js (App Router) / NestJS
- **数据库:** PostgreSQL (通过 Prisma ORM 驱动)
- **包管理器:** `pnpm` (严禁使用 npm 或 yarn)
## 3. 核心开发命令
执行项目操作时,必须使用以下确切命令:
- **本地启动:** `pnpm dev`
- **生产构建:** `pnpm build`
- **代码规范与格式化:** `pnpm lint` / `pnpm format`
- **类型检查:** `pnpm type-check`
- **运行单元测试:** `pnpm test`
- **运行 E2E 测试:** `pnpm test:e2e`
- **数据库迁移:** `pnpm prisma db push` / `pnpm prisma migrate dev`
## 4. 目录与架构约定
- `src/core/` - 全局单例与共享公共模块。**除非有明确指令,否则严禁修改此目录**。
- `src/modules/` - 领域驱动的功能模块(如 auth, orders, users)。
- 组件仅负责纯渲染;所有业务逻辑必须抽离到自定义 Hooks 或 Services 中。
- 文件命名:所有文件和目录一律使用短横线命名法(如 `user-profile.controller.ts`)。
## 5. 编码强制约束
- **TypeScript:** 绝对禁止使用 `any`。必须使用 `unknown` 或明确的 types/interfaces。
- **异步处理:** 异步操作必须包裹在 `try/catch` 块中,严禁漏掉未捕获的 Promise。
- **错误处理:** 统一使用全局 `AppError` 类,严禁直接抛出原生 `Error` 对象。
- **函数体量:** 单个函数最大不得超过 50 行,优先编写纯函数。
- **路径导入:** 必须使用别名绝对路径(如 `@/core/services/log`),严禁使用相对路径(`../../`)。
## 6. 防幻觉与错误防复发(AI 避坑指南)
- **禁止盲猜 API:** 如对第三方库的方法签名不确定,请提示用户或查阅项目知识库。
- **状态管理:** 禁止直接修改(Mutate)状态,必须通过 Hooks 或 Reducers 变更。
- **拒绝占位代码:** 修改文件时,严禁留下 `// TODO: 稍后实现` 或缺失的代码块。
## 7. Git 提交规范
- 严格遵循 Angular 提交信息规范: `<type>(<scope>): <subject>`
- 允许的类型(Type)包括: `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `chore`
- 示例: `feat(auth): 增加 argon2 密码哈希加密`
2)rules(行为与交互红线)
-
作用:专注于控制 AI 的“行为模式”和“回复格式”。它在底层过滤 AI 的思考路径,防止 AI 输出废话,卡死它的输出形态。
- 核心作用:专注于控制 AI 的“行为模式”和“回复格式”,卡死 AI 的性格、沟通习惯和输出格式,消除嘴碎和占位符。
- 核心内容:
- 交互禁忌:禁止说“好的,我明白了”、禁止解释显而易见的代码、必须直接给出修改后的代码块。
- 代码美学:嵌套不得超过 3 层、长函数必须重构、必须使用 strict 模式。
- 克制解释:除非用户主动要求,否则禁止主动解释显而易见的代码逻辑。
# .clauderules - AI 行为与交互铁律
## 1. 交互与回复红线(绝对不嘴碎)
- **禁止废话**:严禁输出“好的,我明白了”、“没问题,接下来我将...”等任何客套话。
- **直接行动**:收到指令后,直接开始思考并输出核心结果,不进行无意义的开场白。
- **严禁过度解释**:除非用户主动提问,否则严禁长篇大论解释显而易见的代码逻辑。
- **语言限制**:除非用户用英文提问,或者在编写代码中的注释,否则一律使用**简体中文**回复。
## 2. 代码输出规范(精准增删)
- **严禁占位符**:输出代码时必须完整,绝对禁止使用 `// ... 保持原样`、`// TODO: 实现其余部分` 等占位符污染文件。
- **最小化改动**:只修改与需求直接相关的代码。严禁为了重构而重构,严禁无故改动不相关的上下文。
- **精确 diff 意识**:在提供文件修改方案时,必须清晰指出目标文件路径。如果是局部修改,确保提供足够的上下文供用户定位。
## 3. 思考路径与防御性编程
- **全自动审视**:在编写任何代码前,必须自动检索并严格遵守根目录 `CLAUDE.md` 中的命令与技术规范。
- **副作用拦截**:在执行涉及文件删除、破坏性覆盖、依赖大版本升级等高风险操作前,必须主动向用户确认(布尔确认),不得擅自动手。
- **边界与异常思考**:编写业务逻辑时,必须强制思考异常分支、空值(null/undefined)处理以及边界条件,并在代码中体现防御性设计。
## 4. 格式与美学
- **Markdown 严格规范**:所有代码块必须指定正确的语言标记(如 ```typescript, ```bash)。
- **专业与克制**:保持专业、理性的工程师口吻。严禁在回复中使用任何情绪化词汇或无意义的表情符号(🎨、🚀 等)。
3)spec/:OpenSpec 核心契约目录
作用:遵循 OpenSpec 规范。在任何代码被写出来之前,AI 和人类必须在这个目录下先对齐“做什么”和“怎么做”。在实际开发中,它通常按照特征建立子目录(如 spec/feat-auth/)。
核心双子星文件:
spec.md(做什么 -What):定义externally observable behavior(外部可观测的行为行为)。包含用户故事(User Stories)、验收条件(Given/When/Then业务流场景)和边界情况。严禁在这里写具体用什么类、什么类库实现。design.md(怎么做 -How):技术架构设计方案。定义具体的数据库表结构设计、API 字段改动、核心算法选择和调用链路。
AI 联动规则:没有经过人类确认(Approve)的 spec.md 和 design.md,AI 绝不被允许触碰任何实际业务代码(Code)
### Requirement: User Authentication
系统 SHALL 在用户登录成功时签发 JWT Token<websource>source_group_web_1</websource>。
#### Scenario: Valid credentials (凭证有效)
- **GIVEN** 一个拥有正确账号密码的用户
- **WHEN** 用户提交登录表单
- **THEN** 系统返回 JWT token
- **AND** 用户被重定向到首页
#### Scenario: Invalid credentials (凭证无效)
- **GIVEN** 用户输入了错误的密码
- **WHEN** 用户提交登录表单
- **THEN** 系统显示“账号或密码错误”的提示
- **AND** 不签发任何 token
4).context/项目知识库(外挂 RAG 资料库)
- 作用:存放项目不需要实时装载、但随时可能查阅的长篇非结构化资料。
AI只有在提及相关概念时,才会通过向量检索(RAG)去“翻阅”它。当AI在spec/下做设计时,必须参考.context/提供的历史约束 -
目录职责解说:
business/rules.md:告诉AI既有的底线业务规则是什么(新设计不能和旧规则冲突)。architecture/danger-zones.md:告诉AI当前项目有哪些高风险代码区域(改动这些地方要极其小心)。history/lessons.md:告诉 AI 以前踩过哪些坑,防止在编写新需求时“历史重演”。
-
如何更新:当你使用
Cursor(Agent模式)、Cline或Roo Code等具备文件读写能力的 AI 智能体时,更新是完全自动化的。-
步骤 1:人类只改源头:在代码里修改核心逻辑。
-
步骤 2:对 AI 下达“同步命令”:在聊天框里对
Agent说:“我刚刚修改了订单创建的错误码和重试逻辑,请帮我同步更新.context/目录下所有受影响的文档。” -
步骤 3:
AI自动“跑腿”:AI Agent会立刻扫描你的代码改动,然后同时打开contract/error-code.md、contract/idempotency.md和architecture/data-flow.md,把涉及到的修改精准地填进去,并保持格式严密。 -
步骤 4:人类进行
Code Review:在Git暂存区会看到代码和 3 个 Markdown 文件被修改了。你只需扫一眼,确认AI没有理解错,然后一键git commit提交。
-
.context/
├── CONTEXT.md # 全局唯一的“地图首页”(人类和AI的第一入口)
│
├── global/ # 【全局通用规范】只放真正全库通用的东西
│ ├── danger-zones.md # 全局高危区(如:分布式锁、公共中间件高压线)
│ └── process/ # 全局工程流程(原封不动保留原有4个文件)
│ ├── dev.md # 本地开发和构建
│ ├── cr.md # MR/CR 规则
│ ├── test.md # 测试和回归策略
│ └── release.md # 发布、灰度、回滚
│
├── domain-order/ # 【订单领域】独立上下文文件夹
│ ├── README.md # 订单域的“一页纸读懂”(人看的大长篇)
│ ├── business/ # 订单业务细节(完全保留原有4个文件)
│ │ ├── overview.md # 服务业务定位
│ │ ├── scenario-flow.md # 核心交易流程
│ │ ├── rules.md # 关键业务规则
│ │ └── terms.md # 服务内术语
│ ├── contract/ # 订单契约(完全保留原有6个文件)
│ │ ├── api.md # HTTP/RPC API 契约
│ │ ├── event.md # MQ/事件契约
│ │ ├── status.md # 状态机、枚举语义
│ │ ├── idempotency.md # 幂等、重试、补偿
│ │ ├── error-code.md # 错误码语义
│ │ └── compatibility.md # 兼容和演进策略
│ ├── architecture/ # 订单架构(完全保留原有3个文件,danger-zones移至global)
│ │ ├── modules.md # 模块边界
│ │ ├── dependencies.md # 上下游依赖
│ │ ├── runtime.md # 环境、配置、中间件
│ │ └── data-flow.md # 数据流
│ └── history/ # 订单历史与复盘(完全保留原有4项)
│ ├── adr/ # 决策记录:为什么这样设计
│ ├── postmortems/ # 事故复盘:出过什么问题
│ ├── cases/ # 典型需求、MR、事故案例
│ └── lessons.md # 轻量踩坑记录
│
├── domain-payment/ # 【支付领域】独立上下文文件夹(示例扩展)
│ ├── README.md # 支付域“一页纸读懂”
│ ├── business/ # 支付业务细节(同订单域结构)
│ │ ├── overview.md
│ │ ├── scenario-flow.md
│ │ ├── rules.md
│ │ └── terms.md
│ ├── contract/ # 支付契约(同订单域结构)
│ │ ├── api.md
│ │ ├── event.md
│ │ ├── status.md
│ │ ├── idempotency.md
│ │ ├── error-code.md
│ │ └── compatibility.md
│ ├── architecture/ # 支付架构(同订单域结构)
│ │ ├── modules.md
│ │ ├── dependencies.md
│ │ ├── runtime.md
│ │ └── data-flow.md
│ └── history/ # 支付历史与复盘(同订单域结构)
│ ├── adr/
│ ├── postmortems/
│ ├── cases/
│ └── lessons.md
│
└── requirements/ # 【活跃需求】仅保留当前迭代的需求(上线后归档/删除)
└── REQ-YYYYMMDD-xxx/ # (完全保留原有6个文件)
├── requirement.md # 需求摘要
├── impact-analysis.md # 影响面分析
├── solution.md # 技术方案
├── test-plan.md # 测试计划
├── release-note.md # 发布说明
└── summary.md # 上线后总结
# 🎯 多领域核心上下文 (Multi-Domain Core Context)
> ⚠️ **AI 编码前必读指引**:
> - 本系统采用 **严格的多领域限界上下文 (Bounded Contexts) 隔离架构**。
> - 在开展任何 `spec/` 新需求设计或代码重构前,必须全自动装载并通读本全景图。
> - 必须确保每一行代码都落入其所属的正确领域和分层中,**严禁跨领域强耦合调用**。
---
## 1. 业务领域全景图与限界上下文 (Domain Bounded Contexts)
本服务/大仓包含以下核心业务领域,AI 必须严格对齐各自的职责边界:
### 👤 A. 用户域 (User Domain) - `src/domain/user/`
- **核心聚合根**: `User` (用户)
- **核心职责**: 管理用户生命周期、核心资质审查、账户安全状态。
- **解耦红线**: 属于基础支撑域,严禁依赖任何上游交易或营销领域。
### 📦 B. 商品域 (Catalog Domain) - `src/domain/catalog/`
- **核心聚合根**: `Product` (商品), `Inventory` (库存)
- **核心职责**: 商品类目上下架、多仓库存锁定与扣减逻辑。
- **解耦红线**: 纯内存库存计算,扣减逻辑必须由聚合根控制,严禁直接暴露 DB 扣减接口。
### 🛒 C. 订单交易域 (Trade Domain) - `src/domain/trade/`
- **核心聚合根**: `Order` (订单)
- **核心职责**: 处理提单、计价引擎、订单状态机流转。
- **解耦红线**: 订单域调用【商品域】或【营销域】时,必须通过自身领域内的 **防腐层 (ACL, Anti-Corruption Layer)** 接口进行隔离,严禁直接 import 对方的应用服务。
### 🎫 D. 营销域 (Marketing Domain) - `src/domain/marketing/`
- **核心聚合根**: `Coupon` (优惠券), `Campaign` (营销活动)
- **核心职责**: 营销资损控制、满减/折扣算法引擎、优惠券核销。
- **解耦红线**: 营销计算只接受入参数据流,严禁在营销域内部反向查询订单状态。
- **多领域细节索引**:
- 深度核对各领域的底线业务规则: [关键业务规则](./business/rules.md)
- 对齐各领域的统一语言,严禁混淆字段: [领域标准术语表](./business/terms.md)
---
## 2. 跨领域交互与解耦铁律 (Cross-Domain Interaction)
为了防止多领域系统退化为“大泥潭”,AI 必须严格执行以下交互规范:
1. **同步调用(左向右)**: 仅允许上游核心域(如 `Trade`)通过 **防腐层 (ACL)** 接口,同步调用下游支撑域(如 `User`, `Catalog`)。
2. **异步通信(右向左)**: 当下游或平行域需要感知上游变更时(例如订单支付成功后,营销域要核销优惠券),必须且只能通过 **领域事件 (Domain Events) + MQ** 进行异步解耦通信。
3. **严禁循环依赖**: 领域 A 引用了领域 B 的 ACL,则领域 B 的任何地方绝对禁止出现领域 A 的任何包/类导入。
- **交互细节导航**: [模块边界与纵向分层定义](./architecture/modules.md) | [上下游依赖与防腐层(ACL)设计](./architecture/dependencies.md)
---
## 3. 单领域内部:严格代码分层约束 (Architectural Layering)
在任何一个独立领域内部,AI 必须严格按照以下四个技术层级编写代码,严禁职责错位:
- **接口层 (`src/interface/`)**: 仅负责协议转换与基础入参校验(DTO),**严禁包含任何业务逻辑**。
- **应用服务层 (`src/application/`)**: 负责**流程编排**(如:开启事务、调用各领域的 Repository、发送领域事件),**不管业务规则**。
- **核心领域层 (`src/domain/`)**: 包含聚合根、实体、值对象和领域服务。它是纯粹的**业务核心,纯内存操作,外部零依赖**(严禁依赖 ORM、Redis、HTTP)。
- **基础设施层 (`src/infrastructure/`)**: 负责 Repository 的持久化实现、MQ 驱动、以及外部接口的 ACL 具体实现。
---
## 4. 核心契约与语义
- **对外原语**: 本服务整体对外暴露的对外能力,必须与根目录 `spec/` 中的 `spec.md` / `design.md` 保持 100% 绝对一致。
- **契约细节索引**:
- 跨领域异步消息格式与幂等去重设计: [MQ事件契约与幂等设计](./contract/event.md)
- 分层错误码转换(各领域私有异常转换为全局错误码): [错误码语义与异常拦截](./contract/error-code.md)
---
## 5. 警惕:多领域退化血泪史 (AI 重点防御)
- **防止跨领域对象污染**: 历史发生过 AI 直接把【商品域】的实体对象作为【订单域】接口的入参,导致两块业务产生强物理耦合(见 [history/lessons.md](./history/lessons.md))。
- **防御原则**: 跨领域传输数据,必须在各自领域的应用服务层转换成纯粹的 **DTO** 或 **值对象 (Value Object)**,严禁领域实体(Entity)跨界。
- **历史细节索引**: [ADR 架构决策记录(多领域解耦规范)](./history/adr/) | [跨领域踩坑复盘](./history/lessons.md)
2、协同执行流程(AI 思考路径)
职责划分:通过这样的划分,新开发的需求可以像插拔模块一样在 spec/ 里流转,一旦合并上线,它就会被沉淀到 .context/ 知识库中作为历史养分:
- 沟通靠
.clauderules:卡死输出格式,消灭嘴碎,追求极致的完整代码。 - 常驻靠
CLAUDE.md:作为基础内存,提供环境常用命令和知识库强引用引导。 - 前瞻靠
spec/:通过spec.md(行为)和design.md(设计)在动刀前达成跨物种的意图对齐。 - 根基靠
.context/:以CONTEXT.md为总沙盘,将全量历史资产与业务现状变为可检索的代码库长效养分。
当用户在编辑器中输入:“帮我把订单支付接口的异常处理完善一下”,AI 内部的读取和协同流程如下:
【 1. 接收指令:触发规范 】
│
▼
[ .clauderules ] ──► 自动激活底层过滤器(规范表达,禁止废话)
│
▼
[ CLAUDE.md ] ──► 加载内存上下文(获取技术栈规范、常用指令)
│
▼
【 2. 编写 OpenSpec 蓝图 】
AI 在 `spec/feat-coupon/` 目录下创建并完善两个核心文件:
├─► 1. 编写 `spec.md`:明确用户满减券的计算规则与 Given/When/Then 验收场景。
└─► 2. 结合【.context/】历史资产(参考旧的计价逻辑与 danger-zones 高风险区)
编写 `design.md`:设计优惠券表的 Schema 和扣减接口。
│
▼
【 3. 人类评审(Grilling)】
人类阅读并确认 `spec/` 下的 `spec.md` 和 `design.md` 符合预期。
│
▼
【 4. AI 严格按照蓝图开始 Code 】
AI 编写实际业务代码。此时由于有了详细的 design.md 约束,AI 绝不会乱写和猜想。
│
▼
【 5. 归档与闭环 】
测试通过准备上线。AI 自动将本次优惠券开发的核心技术决策归档至 `.context/history/adr/`,
并将踩坑记录沉淀至 `.context/history/lessons.md`。
你的项目根目录/
├── CLAUDE.md # 顶层:入口与命令指南
├── rules/ # 顶层:底线与行为约束
├── spec/ # 中层:当前正在做的需求
└── .context/ # 底层:外挂大脑(上下文仓库)
├── README.md # 告诉 AI:这里面每个文件的检索规则是什么
├── domain-models/ # 1. 业务领域模型层(如:用户状态机、订单生命周期图解)
├── architecture/ # 2. 技术架构层(如:核心中间件拓扑、分库分表路由规则)
├── pitfall-archive/ # 3. 历史死坑血泪史(如:某年某月因异步线程产生的线上Bug记录)
└── scripts/ # 4. 动态上下文脚本(如:运行后能一键生成最新 API 字典的工具)
3、最佳实践技巧
1)二错归档法(针对 CLAUDE.md):
- 严格执行您的技巧——不要在聊天框里重复纠正
AI。 AI同样的错误犯第二次,立刻去CLAUDE.md里加一行- Avoid using XXX, use YYY instead。
2)动静分离:
-
凡是涉及 “怎么运行项目、怎么写这个项目的代码” ──► 写进
CLAUDE.md。 -
凡是涉及 “怎么跟人类说话、代码字数/格式限制” ──► 写进
md rules。
七、FQA
1、OpenSpec 与 Claude Code
Claude Code拥有很多.md:主要是为了建立行为规范(How to do),去约束AI怎么写代码。OpenSpec专注spec.md:是为了建立项目的业务模型(What it is),去告诉AI系统的业务逻辑是什么。
| 维度 | OpenSpec (开发规范) |
Claude Code (编码工具集) |
|---|---|---|
| 核心定位 | 业务逻辑的“唯一事实源” | AI 编码的“行为控制器” |
| 解决的问题 | 解决 AI “不懂业务” 的问题。防止 AI 在复杂的存量代码中“幻觉”,写出不符合历史逻辑的代码。 | 解决 AI “不听话” 的问题。防止 AI 嗦、乱写格式、不遵守技术栈规范。 |
| 核心载体 | spec.md (做什么) + design.md (怎么做) |
CLAUDE.md (项目规矩) + .clauderules (交互红线) |
| 类比 | 建筑蓝图与施工合同 | 施工队的军规与SOP手册 |
【 混合 AI 编码工作流 】
│
┌────────────────────┴────────────────────┐
▼ ▼
【使用 Claude Code 的规则体系】 【使用 OpenSpec 的领域知识库】
- 管控 AI 的“工作态度” - 管控 AI 的“业务大脑”
- 配置代码风格、Lint 规则、Git 提交规范 - 维护项目当前业务现状(openspec/specs/)
- 处理零碎的 Bug 修复和工具函数编写 - 处理跨模块重构、复杂新功能落地
2、AI 是如何通过 OpenSpec 找到对应的规则的?
机制一:索引地图寻路:这是最基础的、完全基于全局 SPECS.md 目录文件的纯文本脱敏匹配。
-
用户输入:
"帮我把模块 A 每天凌晨执行的那个数据清洗范围,从 A 扩大到 B"[AI 运行日志 - 机制一] 1. 捕获用户指令关键词 -> ["模块 A", "每天凌晨", "数据清洗"] 2. 遵循 CLAUDE.md 死命令 -> 优先调用工具读取并分析: `ai-docs/SPECS.md` 3. 扫描地图内容中... - 检查 [B 消息域] -> 关键词 ["消息消费", "异常拦截"] -> ❌ 不匹配 - 检查 [A 业务域] -> 关键词 ["定时计算", "异步任务", "每天凌晨"] -> 🟢 强匹配! 4. 地图指引目标路径 -> `ai-docs/specs/module-a/feature-1.md` 5. AI 自动执行工具命令 -> `cat ai-docs/specs/module-a/feature-1.md` 6. 定位成功 -> 锁定了 Module A 的具体业务细节,开始进入编码状态。
机制二:语义向量检索(Vector Embedding RAG):
-
原理:利用向量数据库将自然语言转化为数学(向量坐标)。
-
优势:即使用户说“那个买东西付钱老是卡住的地方”,
AI也能通过语义相似度匹配到payment/idempotency.md(幂等性规范),解决了“词不达意”的检索难题。
3、如何写md,提高 AI 的检索精准度
1)使用 AI 最喜欢的“断言式”和“防御式”文本
AI 在泛化理解时容易跑偏,因此在编写
.context/文档时,要少用修饰词,多用断言句、强约束句和因果链。
❌ 坏例子(模糊的人类表达):
“我们的分布式锁以前在高并发下偶尔会出问题,所以后来大家达成共识,改成了用 Redisson。后续修改这块代码的时候,大家尽量多注意一下死锁的情况。”
▲ 好例子(AI 一眼看懂的断言+因果):
**[约束]** 核心交易模块(`src/trade/`)必须且只能使用 **Redisson 分布式锁**。
**[高风险区]** 严禁在持有 Redis 锁的上下文内发起 HTTP 同步网络请求。
**[原因]** 历史事故(见 `history/postmortems/20251101`):网络延迟会导致锁超时释放,从而引发多节点并发写入死锁。
2)善用 md「锚点链接」建立知识图谱
当
AI通过RAG(检索增强生成)工具读取你的文件时,它通常是分块(Chunking)读取的。为了防止 AI 缺失上下文,你需要在文档中建立交叉引用(Cross-reference)。
- 操作技巧:多在文档中使用相对路径互相 Q 对方。
- 在
architecture/danger-zones.md(高风险区)中写道:“涉及扣减库存的并发处理,见../business/rules.md” - 在
business/terms.md(术语表)中写道:“有关账户冻结状态机的流转定义,详见../contract/status.md。”
- 在
- 效果:
AI读取到这里时,会自动触发它的文件读取工具(如view_file或grep),顺着你的链接去补充它的上下文字典。
3)专门对齐“特殊名词与业务黑话
每一个公司或微服务都有自己的“历史黑话”和特定潜规则
例如:把“付费用户”叫“VIP2”,或者把“延迟队列”叫“小黑屋”)。AI 最容易在这些地方产生
Hallucination(幻觉)。
编辑建议:必须在 .context/business/terms.md 中建立一个结构极严密的业务术语对照表,格式建议如下:
### 术语对照表
- **领域词 (Domain Term)**: `FreezeBalance` (资产冻结)
- **代码表现**: 对应 `UserAccount.frozen_amount` 字段
- **业务含义**: 用户下单后、未扣款前,暂时锁定其可用额度,防止超卖。
- **注意点**: 冻结金额在任何情况下都不能为负数。
4)针对 history/(历史层)的编辑秘诀
.context/history/目录是整套架构里的神来之笔。要让 AI 在这里吸取教训,避免历史重演,你需要用“总结性原则”来编写。
-
不要只贴大段日志:AI 读不懂裸日志,还会浪费大量的
Context Window(上下文窗口)。 -
三段式编写规范:每个踩坑记录或事故复盘,都必须精简为以下三要素:
- **现象 **:发生了什么?(如:优惠券接口在促销打满时响应超时)。
- **根因 **:代码里哪里写错了?(如:在 Loop 循环中查了数据库)。
- **长期防线 **:以后 AI 写代码时绝对不能怎么做?
- 如:[禁止] 严禁在任何
for/map/forEach循环体内执行 DB Query,必须改用In批量查询)
- 如:[禁止] 严禁在任何
八、
八、Loop 是什么
1、是什么
AI圈最近爆火的 “Loop”(通常指 Loop Engineering,即循环工程),代表着一种从“亲手给AI写提示词”到“设计自动化循环系统让AI自己跟自己对话”的AI范式转变
1)为什么它在今天突然爆火
-
多 Agent 协作的普及:比如
PingCAP推出Loop平台,让架构师 AI 出方案、开发 AI 写代码、测试 AI 负责找茬。 -
持久化外部记忆(
Memory):AI 跨对话会忘掉历史,但 Loop 机制通过在本地磁盘写入MEMORY.md记录状态,让AI重启后能继续上一次的工作。 -
代码天然的反馈机制:代码能不能跑通有明确的测试标准,这让编程 AI(如
Claude Code)最先完美适配了这种自主纠错的循环。
2)Loop 的硬伤与争议
Loop代表着 AI 已经从“聊天机器人”演进到了“能够自我迭代、团队作战的系统工程”
-
Token成本高昂:无限循环极易导致字符膨胀,瞬间烧干预算。如果没有严格的停止条件(如最大迭代次数、无进展检测、预算上限),成本将难以控制 -
理解力负债:代码或方案全是
AI自动循环生成的,人类只负责最后按一下“同意”。这导致人类离底层逻辑越来越远,一旦系统出了诡异的Bug,人根本无法排查。 -
必须说“不”:如果循环里没有严格的硬性测试(测试用例、类型检查),
AI就会陷入“自己跟自己点头”、越改越错的死循环。 =
2、AI 工程化的四个层级
引擎是 AI 模型,Harness 是给员工配好的独立工位和工具手册,而 Loop 就是整个值班和验收制度。它决定了活从哪来、谁来验收、干砸了怎么重试。
| 名词 | 说明 |
|---|---|
Prompt Engineering |
解决“怎么问”。让人类通过精妙的词句让 AI 听懂并输出。缺点是无法处理复杂、长链路的任务 |
Context Engineering |
解决“给它看什么”。将项目背景、代码规范、历史记录塞进 AI 的记忆,防止 AI “胡言乱语”。 |
Harness Engineering |
解决“在什么环境运行”。给 AI 配置车间、沙箱、权限和工具,保证单次运行是合规的。 |
Loop Engineering |
解决“怎么让它持续往前把事情做完”。AI 跑一轮,自动从环境里获得报错反馈,对照标准检查,没达标就带着反馈再跑一轮,直到满足终止条件 |
3、 Loop 工作流
传统的 AI 是一问一答,而一个自动运转的 Loop 包含以下四个基础闭环
-
推理 (Reason):大模型分析当前的状态和目标,决定下一步要干什么。
-
行动 (Act):执行选定的操作,比如去写一段代码、查一次数据库或调用外部工具。
-
观察 (Observe):获取行动的结果。比如代码运行成功了,还是报了错?
-
循环 (Loop):如果报错,AI 会自动读取错误日志,自己重新给自己写提示词去修复,再次运行,直到测试完全通过。


