只告诉 AI“不要这样做”是不够的。真正可靠的做法,是让错误在提交、构建、发布前被机器发现。机械化执行的目标不是微观管理 AI 的每一步,而是强制产出满足不可破坏的边界。
什么规则适合机械化
- 文件大小、目录位置、命名约定。
- 依赖方向,例如 UI 不能直接读数据库。
- 内容发布门槛,例如标题、来源、分类、特色图是否齐全。
- 高风险字段,例如外部链接、凭证、生产写库权限。
| 层级 | 例子 | 给 Agent 的价值 |
|---|---|---|
| 格式层 | php -l、eslint、prettier | 先排除低级错误 |
| 结构层 | 依赖方向检查、文件边界检查 | 减少架构漂移 |
| 业务层 | 发布门槛、字段契约审计 | 防止内容或数据伪真相 |
| 体验层 | 浏览器截图、DOM 检查 | 证明页面真的可用 |
AI 生成语法检查结构检查内容审计浏览器验收发布
错误信息也要可执行
普通错误只说“失败”。面向 Agent 的错误应该告诉它如何修复:哪个文件、哪个规则、参考哪个文档、应该改成什么结构。这样 AI 才能进入自我纠正闭环。

源文档学习快照
这一节由当前 GitHub 源文档生成,用来保证教程正文能跟随仓库变化刷新。当前主源文档:concepts/02-mechanical-enforcement.md。
核心概念核心思想两类约束架构约束(结构测试)品味不变式(自定义 linter)关键设计:lint 错误信息 = 修复指令
| 当前源文档 | 读者应关注 | 同步含义 |
|---|---|---|
| concepts/02-mechanical-enforcement.md | 通过强制执行不变量,而非对实施过程进行微观管理 | 源文档 SHA 会写入文章 meta,正文快照会随同步任务刷新。 |
- 核心思想
- 两类约束
- 架构约束(结构测试)
- 品味不变式(自定义 linter)
- 关键设计:lint 错误信息 = 修复指令
GitHub Markdown:concepts/02-mechanical-enforcement.md
概念 2:机械化执行
核心思想
通过强制执行不变量,而非对实施过程进行微观管理
文档会腐烂。人会忘记。但 lint 规则和 CI 检查每次都会执行。
两类约束
架构约束(结构测试)
- 域内分层顺序:Types → Config → Repo → Service → Runtime → UI
- 依赖方向只能向前
- 横切关注点必须通过 Providers 进入
- 违反 = CI 阻塞合并
品味不变式(自定义 linter)
- 结构化日志(禁止 console.log 裸输出)
- Schema/类型的命名约定
- 文件大小限制
- 平台特定的可靠性要求
关键设计:lint 错误信息 = 修复指令
❌ 普通做法:
Error: File exceeds 500 lines.
✅ Harness 做法:
Error: File exceeds 500 lines.
Fix: Split into domain-specific modules following docs/ARCHITECTURE.md#splitting-guide.
Consider extracting types to <domain>/types/ and service logic to <domain>/service/.错误信息中注入智能体可执行的修复路径 → 自我纠正闭环。
哲学
在中央层面强制执行边界,在本地层面允许自主权。
类似大型工程平台组织的管理模式:
- 严格的:边界、正确性、可重复性
- 自由的:边界内的具体实现方式
- 生成的代码不符合人类风格偏好?没关系。正确 + 可维护 + 智能体可读 = 达标。
来自其他文章的补充
OpenAI Symphony — 给目标,不规定状态转换
OpenAI Symphony(references/articles.md #16)提供了机械化执行的反向边界。OpenAI 的工程师早期把智能体当作状态机里的刚性节点,每个状态规定智能体只能做特定动作。文章原话:
"把智能体当作状态机里的刚性节点并不好用。模型会变得更聪明,也能解决比我们预设框架更大的问题。"
最终他们转向 给目标,不规定状态转换——给智能体目标 + 工具 + 上下文,让推理能力决定路径。
这与机械化执行不矛盾,而是分工:
- 机械化层:约束结果形态(不变量、架构、品味),CI 强制
- 目标层:约束意图与边界(要解决什么问题、不能做什么),不规定路径
机械化执行管"产出必须满足什么",目标层管"为什么做、做到什么程度"。把两者都收紧成"必须按 1-2-3 步骤"会浪费模型的推理能力,也会随模型升级越来越显得笨拙。