前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

一、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 工程范式的三次跃迁

image-20260601151009450

范式 核心问题 优化对象 交互模式
提示词工程 怎么把话说清楚 Prompt 的措辞、格式、示例 一问一答
上下文工程 怎么给 AI 喂信息 文档、代码片段、历史对话 信息注入 → 生成
驾驭工程 怎么让 Agent 可靠工作 约束、反馈回路、控制系统 人类掌舵,Agent 执行
  • Prompt 工程:对着马喊话指挥

  • Context 工程:给马配好地图和粮草

  • Harness 工程:给马修高速公路 + 护栏 + 限速 + 补给站

2、Agent 常见失败模式

Anthropic 工程师在长时间运行 Agent 的过程中,总结了三种典型的翻车姿势,正是驾驭工程要解决的核心痛点:

失败模式 1:试图一步到位(One-shotting)Agent 倾向于在一个会话里把所有功能都做完。结果是上下文窗口耗尽,留下一堆没有文档的半成品代码,下一个会话启动时只能花大量时间猜测之前发生了什么。

失败模式 2:过早宣布胜利:部分功能做完就自认为任务完成,忽略剩余需求,擅自终止工作流。

失败模式 3:过早标记功能完成:写完代码直接判定完工,跳过单元测试、端到端测试,局部通过不代表线上可用。

此外,智能体还有一个危险特性:Agent 擅长模式复制放大,会原样照搬代码库坏架构、坏规范,极速堆积技术债务,无约束会越做越烂。

二、Harness 核心四大组件

image-20260601151603101

核心组件 解决的问题 代表实践
上下文工程 Context Agent 不知道该看什么、怎么找 AGENTS.md 活文档、按需检索
架构约束 Constraints Agent 复制并放大坏模式 分层依赖、自定义 LinterCI 强制阻断
反馈循环 Feedback Agent 不知道自己做错了 Agent-to-Agent Review、自动测试套件
熵管理 Entropy 技术债务和文档腐烂 Doc-gardening Agent、持续垃圾回收

1、护栏一:上下文工程(Context Engineering)——新员工手册

定位AI 新员工入职手册

解决问题AI 不知道该看什么、上下文塞满、文档陈旧无用

核心实践

  1. AGENTS.md 作为唯一入口:项目根目录必备,精简规则,不堆砌大段文档
  2. 按需动态检索:上下文是稀缺资源,不一次性全灌入,按任务拉取对应文档
  3. 活文档机制:文档不是静态废品,每次 Agent 踩坑就更新规则,形成反馈闭环

2、护栏二:架构约束(Architecture Constraints)——缰绳

定位AI 行为缰绳

解决问题Agent 乱改目录、反向依赖、破坏分层、放大坏代码模式

核心实践

  1. 固定分层依赖:Types → Config → Repo → Service → Runtime → UI禁止下层反向依赖上层
  2. 自定义架构 Linter:把架构规则编码成可检测脚本
  3. CI 强制阻断:违反架构规则直接拦截合并,人机写代码一视同仁
  4. 友好报错提示:Linter 报错不只报错误,还要解释原因 + 正确写法,让 AI 自修复

3、护栏三:反馈循环(Feedback Loop)——智能体审智能体

定位:智能体审智能体

解决问题AI 不知道自己写错、测试无效、自我糊弄

核心实践

  1. 放弃纯人工 CR,改为 Agent 互审 / 自审,自动挂载测试套件,失败自动带回错误信息重试
  2. 校验测试有效性:如果 AI 写的测试用例通过了带有 Bug 的代码,Harness 就会判定测试无效,强迫它重新思考测试边界。

4、护栏四:熵管理(Entropy Management)——垃圾回收

定位:系统垃圾回收器

解决问题:软件熵增、技术债务堆积、文档腐烂过时

核心实践

  1. 小额持续还债:后台定时扫描代码偏差、架构漂移,小额重构,不积压大债务
  2. 文档园丁 Agent:自动检测代码与文档不一致,自动提交 PR 修复

三、行业六大统一共识

  1. 瓶颈在基础设施,不在模型智能:换模型提升有限,优化 Harness 可实现分数翻倍
  2. 文档必须是活的反馈循环:静态文档是坟场,动态文档才有价值。让后台 Agent 定期清理过时文档并提交 PR
  3. 思考与执行分离:复杂任务不可能在单个上下文窗口内完成,需要 Orchestrator + Worker 分层架构,状态持久化到外部存储
  4. 上下文不是越多越好:上下文是稀缺资源。巨大的指令文件会挤掉任务空间,应按需检索、动态注入
  5. 约束必须自动化:人工 Review 是瓶颈。护栏要编码为 LinterCI、类型系统,让机器来执行而非人
  6. 工程师角色彻底转型:从代码的编写者变成环境的建筑师。最大的工程挑战是设计让 Agent 可靠工作的控制系统

四、Harness 与传统框架的关系

框架解决怎么建 AgentHarness 解决怎么让 Agent 可靠稳定长期干活

从上到下层级清晰,不冲突、是叠加关系:

  1. Harness 驾驭层:约束、反馈、上下文、熵管理、生命周期管控
  2. Agent 框架层:LangGraph/AutoGen/CrewAI,负责任务编排、消息路由
  3. SDK/API 层:OpenAI/Anthropic 模型调用、工具注册
  4. 基础模型层:GPT/Claude/DeepSeek 提供原生智能

image-20260601153137154

五、Harness 落地

1、标准落地工作流

1)阶段 0 初始化

  • 项目根目录创建 AGENTS.md(项目简介、技术栈、目录规范、禁止操作、流程规则)

  • 建立架构目录规范、配置自定义 Linter 脚本

  • Git 初始化,锁定初始基线版本

2)阶段 1 需求→方案(先设计后编码)

  1. 输入原始需求

  2. Agent 输出详细技术方案(接口、数据模型、目录路径)

  3. 人工确认通过,才允许进入编码,避免返工

3)阶段 2 编码开发

  1. 严格遵循 AGENTS.md + 架构分层规则
  2. 自动运行架构 Linter,违规立即提示修复
  3. 代码格式化、类型校验,合规后提交

4)阶段 3 测试验证(强制卡点)

  1. 自动生成单元测试 / 接口测试
  2. 运行测试套件,不通过禁止合并
  3. 测试失败触发反馈循环,自动分析修复重试

5)阶段 4 文档更新 + 熵管理

  1. 同步更新 READMEAPI 文档
  2. 文档园丁自动校验文档与代码一致性
  3. 清理冗余配置、重置上下文,防止熵增

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.mddesign.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)去“翻阅”它。当 AIspec/ 下做设计时,必须参考 .context/ 提供的历史约束
  • 目录职责解说

    • business/rules.md:告诉 AI 既有的底线业务规则是什么(新设计不能和旧规则冲突)。
    • architecture/danger-zones.md:告诉 AI 当前项目有哪些高风险代码区域(改动这些地方要极其小心)。
    • history/lessons.md:告诉 AI 以前踩过哪些坑,防止在编写新需求时“历史重演”。
  • 如何更新:当你使用 Cursor (Agent 模式)ClineRoo Code 等具备文件读写能力的 AI 智能体时,更新是完全自动化的。

    • 步骤 1:人类只改源头:在代码里修改核心逻辑。

    • 步骤 2:对 AI 下达“同步命令”:在聊天框里对 Agent 说:“我刚刚修改了订单创建的错误码和重试逻辑,请帮我同步更新 .context/ 目录下所有受影响的文档。”

    • 步骤 3:AI 自动“跑腿”AI Agent 会立刻扫描你的代码改动,然后同时打开 contract/error-code.mdcontract/idempotency.mdarchitecture/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/ 知识库中作为历史养分:

  1. 沟通靠 .clauderules:卡死输出格式,消灭嘴碎,追求极致的完整代码。
  2. 常驻靠 CLAUDE.md:作为基础内存,提供环境常用命令和知识库强引用引导。
  3. 前瞻靠 spec/:通过 spec.md(行为)和 design.md(设计)在动刀前达成跨物种的意图对齐。
  4. 根基靠 .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、OpenSpecClaude 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_filegrep),顺着你的链接去补充它的上下文字典。

3)专门对齐“特殊名词与业务黑话

每一个公司或微服务都有自己的“历史黑话”和特定潜规则

例如:把“付费用户”叫“VIP2”,或者把“延迟队列”叫“小黑屋”)。AI 最容易在这些地方产生 Hallucination(幻觉)。

编辑建议:必须在 .context/business/terms.md 中建立一个结构极严密的业务术语对照表,格式建议如下:

### 术语对照表
- **领域词 (Domain Term)**: `FreezeBalance` (资产冻结)
  - **代码表现**: 对应 `UserAccount.frozen_amount` 字段
  - **业务含义**: 用户下单后、未扣款前,暂时锁定其可用额度,防止超卖。
  - **注意点**: 冻结金额在任何情况下都不能为负数。

4)针对 history/(历史层)的编辑秘诀

.context/history/ 目录是整套架构里的神来之笔。要让 AI 在这里吸取教训,避免历史重演,你需要用“总结性原则”来编写。

  • 不要只贴大段日志:AI 读不懂裸日志,还会浪费大量的 Context Window(上下文窗口)。

  • 三段式编写规范:每个踩坑记录或事故复盘,都必须精简为以下三要素:

    1. **现象 **:发生了什么?(如:优惠券接口在促销打满时响应超时)。
    2. **根因 **:代码里哪里写错了?(如:在 Loop 循环中查了数据库)。
    3. **长期防线 **:以后 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 会自动读取错误日志,自己重新给自己写提示词去修复,再次运行,直到测试完全通过。

ContactAuthor