Skip to content

第 29 章 · 循环安全与失败模式

本章目标:掌握循环的五大安全机制,精读官方失败模式目录与设计反模式,理解理解债/意图债等运营概念,最终能用生产上线检查单验收一个循环。

22.1 五大安全机制

循环会以机器的执行力放大你植入的判断,因此安全机制是生产循环的最低配置而非可选项:

1. 路径黑名单(Path Denylist)

以下路径永远不允许循环自动修改,命中必须升级给人:

text
.env / .env.*
**/secrets/**  **/credentials/**  **/*_key*  **/*_secret*
.terraform/**  k8s/production/**
**/migrations/**          # 除非是专门的迁移循环
auth/**  payments/**  billing/**

关键设计:黑名单不靠"提示词里写一句请勿修改"来执行,而是用 loop-gate 工具机械化执行——loop-gate check --action <type> --paths <files> 命中黑名单时以退出码 2 强制升级,控制脚本可以链式判断。

2. 自动合并白名单(Auto-Merge Allowlist)

默认策略:禁止自动合并。确有把握的琐碎变更才进白名单:

允许自动合并绝不允许
注释/文档错别字一切行为变更
仅测试文件内的 lint 自动修复依赖版本升级
import 排序锁文件变更
白名单 docs/ 路径内的配置任何黑名单路径

3. 人工门控(Human Gates)

以下场景无条件等人:安全/认证/授权相关、支付与 PII、基础设施(Terraform/K8s 生产)、依赖升级、单次变更超过 N 个文件(建议 N=10)、同一事项第三次尝试仍失败、以及预算追加请求。

4. MCP 最小权限

连接器允许读允许写
GitHubissues、PR、checks评论、打标签(默认不给 merge
Linear团队 issue评论、改状态(不给删除)
Slack频道历史只发到 #loop-escalations
数据库禁止生产库写入

用独立的 bot 账号和最小 scope 的 token,让每次循环动作都可追溯到 bot 身份。

5. Worktree 隔离

所有写代码的动作都发生在独立 git worktree 中:失败即丢弃,成功才走 PR 流程;配合 loop-worktree 做到"一次尝试一个 worktree、拒绝即清扫"。

22.2 官方失败模式目录精读

官方按严重度把失败分为 S1(烦人)/ S2(有害)/ S3(严重)三级。五个最经典的形态:

失败模式症状根因缓解手段
Infinite Fix Loop同一 PR 被自动修 5+ 次仍不过验证者太弱或与实现者同会话;只治症状尝试硬上限(3 次)→ 升级;独立验证者;flaky 测试隔离而非改代码
State Rot状态文件引用已合并的 PR、已关闭的工单每轮结束不清理;多循环乱写同一文件每轮修剪;校验 ID 是否仍存活;每个模式一个状态文件
Verifier Theater验证者"通过"但 CI 明明是红的验证提示词太模糊("看起来不错");根本没跑测试验证者必须运行测试并贴输出;指令改为"找出拒绝的理由"
Notification FatigueSlack 每 5 分钟响一次,团队把 bot 静音了每次运行都通知,而不是每次"可行动发现"才通知只在需要人决策时通知;报告类用摘要模式
Token Burn账单飙升空分诊也跑全链路子智能体空观察列表 <5k token 退出;预算文件 + 熔断器

使用方式

这份目录的正确打开方式是当调试手册用:循环行为异常时,先按症状对号入座,再按缓解手段逐项排查——绝大多数事故都能在其中找到原型。

22.3 设计反模式:上线前就要杜绝

失败模式是"运行时事故",反模式则是"设计期错误"。官方列出七条,每条都有明确的"应该这样做":

markdown
1. 同一智能体既实现又验证   → 拆出独立验证者,默认立场 REJECT
2. 没有尝试次数上限         → 硬上限 3 次 → 带上下文升级
3. 分诊输出是叙事段落       → 结构化 markdown,一行一条 + 明确建议动作
4. L1 质量没验证就上 L3     → 先 report-only 一周,用数据说话
5. 共享状态没有 schema      → 每模式一个状态文件,或清晰分区 + 修剪规则
6. MCP 一上来就全写权限     → L1 只读连接器,赢得信任再扩权
7. 没有终止开关             → LOOP.md 写明暂停/终止条件 + 预算文件

22.4 理解债、意图债与认知放弃

Loop Engineering 提供了一组"运营词汇",帮你命名那些说不清的失控感:

  • 意图债(Intent Debt):智能体每轮冷启动,缺失的项目意图会被"自信的猜测"填补。技能是还债方式——约定写一次,每轮都读;
  • 理解债(Comprehension Debt):仓库里存在的东西与你实际理解的东西之间的差距。循环跑得越快,"不是你写的代码"堆积越快——除非你坚持读循环产出的东西
  • 认知放弃(Cognitive Surrender):最危险的陷阱——让循环跑着,而你停止持有观点。设计循环需要判断力,用循环逃避思考则是加速剂:同一个动作,相反的结局;
  • 编排税(Orchestration Tax):并行智能体的协调人力成本——审查带宽、合并冲突、上下文切换。worktree 解决机械冲突,但你能消化的并行循环数量上限始终是你自己

22.5 运营要点:降速、暂停与终止

什么时候降速 / 暂停

text
降速信号:token 预算周中已用 >80% | 分诊误报率 >30% | 同一事项 48h 内被升级 2+ 次
暂停信号:生产事故进行中(循环可能干扰热修) | 破坏性 schema 迁移中 | 关键审查者休假且开了自动合并

什么时候终止循环

出现以下任一情况就该认真考虑杀掉循环:连续出现 S2 级失败、成本连续两周高于价值、团队把它的通知全部静音、模式已被事件驱动方案(如纯 CI Action)取代。

终止清单三步走:

bash
# 1. 停调度:删除定时器 / 禁用 Automation / 移除 GitHub Action
# 2. 归档状态:状态文件标记 retired
mv STATE.md STATE.retired-2026-06.md
# 3. 复盘(可选但强烈建议):把这段经历写成故事,供下次设计参考

22.6 生产上线检查单

把前几章的内容收敛成一张验收单,全部打勾才允许上生产:

markdown
## 循环上线检查单
- [ ] 单一清晰目标 + 明确的非目标(不做什么)
- [ ] 分诊技能输出结构化、描述"无聊而具体"
- [ ] 实现者/验证者分离,验证者真的跑测试
- [ ] 状态文件有 schema、每轮读写、每轮修剪
- [ ] 路径黑名单由 loop-gate 机械化执行
- [ ] 自动合并默认关闭;白名单最小化
- [ ] MCP 连接器最小权限 + 独立 bot 身份
- [ ] loop-budget.md 有每日上限与超限动作
- [ ] loop-run-log.md 每轮追加运行记录
- [ ] 升级触发条件成文(次数上限/风险路径/歧义)
- [ ] 已完成 L1 报告期校准,误报率 <30%
- [ ] 终止条件写进 LOOP.md,随时可一键降级

本章小结

  • 五大安全机制:黑名单机械化执行、自动合并默认关、人工门控无条件触发、MCP 最小权限、worktree 隔离;
  • 失败模式按 S1/S2/S3 分级,五经典形态各有对症缓解,可当调试手册用;
  • 七条设计反模式在上线前杜绝,核心是:验证分离、次数上限、结构化输出、循序渐进;
  • 理解债与认知放弃是长期运营的最大敌人——坚持读循环的产出,保持自己的观点;
  • 降速/暂停/终止都有明确信号与清单,终止不是失败,及时止损是运营能力。

🛠️ 动手实践

  1. 把本章上线检查单复制到你的仓库,逐项核对你在第 20 章初始化的 Daily Triage,列出未达标项与补齐计划。
  2. 为你的循环写一份 gate.yaml:定义 3 条路径黑名单与 1 条自动合并白名单,并用 loop-gate check 验证命中行为。
  3. 设计一次"预演终止":写下你的循环在什么信号出现时降级、暂停、终止,以及每步的具体命令。

全部章节到此结束。回到 课程导学 复盘,或继续探索本站其他课程。

完成后进入下一章:AGENTS.md 标准:给智能体的 README