- commit
- 7074d4c
- parent
- 889f746
- author
- codex@macbookpro
- date
- 2026-04-01 10:24:31 +0800 CST
docs: require circuit breaking for automation
4 files changed,
+103,
-17
+83,
-17
1@@ -18,7 +18,7 @@
2
3 - 一条 final-message 同时触发 BAA 与 renewal
4 - BAA 正在执行时 renewal 继续向同一对话发消息
5-- 对话进入死循环或持续报错时没有显式停机方式
6+- 对话进入死循环或持续报错时没有自动停机与显式救援方式
7
8 ## 核心原则
9
10@@ -63,6 +63,12 @@
11 - 当前没有执行中的 renewal
12 - 没有命中熔断 / 救援等待状态
13
14+### 5. 自动熔断是基础要求,不是可选优化
15+
16+系统必须能够自动检测“继续自动化可能进入死循环或放大错误”的场景,并自动把当前对话切到 `paused` 或 `rescue_wait`。
17+
18+这里的自动熔断不是为了自动修复,而是为了自动停机,等待人工或其他 AI 明确恢复。
19+
20 ## 同一条 final-message 的处理顺序
21
22 收到最终权威消息后,按顺序处理:
23@@ -100,6 +106,9 @@
24 - `system_pause`
25 - `error_loop`
26 - `rescue_wait`
27+- `repeated_message`
28+- `repeated_renewal`
29+- `execution_failure`
30
31 ### 对话级执行锁
32
33@@ -125,6 +134,77 @@ AI 需要能够在“持续出错、陷入死循环、需要人工或其他 AI
34 - 或切到 `manual`
35 - 或重新切回 `auto`
36
37+## 自动熔断基础要求
38+
39+### 必须检测的信号
40+
41+系统至少要能检测下面这些信号:
42+
43+#### A. 结构化行为信号(主规则)
44+
45+- renewal dispatcher 连续失败、超时、429、5xx 或 route unavailable
46+- BAA 指令连续执行失败
47+- 短时间内同一对话生成过多 renewal job
48+- 同一对话重复发送同类自动化请求
49+- 指令执行与续命交替触发,但没有产生新的有效状态变化
50+
51+#### B. 重复度 / 相似度信号(第二层)
52+
53+- 同一对话连续出现高度相似的 final-message
54+- 同一对话连续生成高度相似的续命内容
55+
56+这里应优先采用归一化后的重复度判断,例如:
57+
58+- 去空白
59+- 去时间戳
60+- 去动态 ID
61+- 保留语义正文再做 hash / 比较
62+
63+#### C. 文本模式信号(辅助规则)
64+
65+允许增加稳定错误短语匹配,例如:
66+
67+- “出错了”
68+- “稍后再试”
69+- “无法继续”
70+- “需要人工帮助”
71+
72+但文本模式只作为辅助加分项,不能作为唯一熔断依据。
73+
74+### 判断原则
75+
76+自动熔断应遵循下面这条基础规则:
77+
78+> 以行为信号为主,以文本信号为辅,不以字符串匹配作为唯一依据。
79+
80+也就是说:
81+
82+- 优先看结构化状态和执行行为
83+- 其次看消息重复度和续命内容重复度
84+- 最后才参考稳定错误文本
85+
86+### 命中后的必需动作
87+
88+命中自动熔断条件后,系统必须:
89+
90+- 立即停止为该对话继续生成新的续命任务
91+- 不再推进该对话待执行的自动化任务
92+- 将对话切到 `paused` 或 `rescue_wait`
93+- 写明 `pause_reason`
94+- 记录最近错误、触发计数和触发时间
95+
96+### 恢复原则
97+
98+自动熔断后,不自动恢复。
99+
100+恢复必须显式发生,来源可以是:
101+
102+- 用户
103+- 其他 AI
104+- 后续明确的系统控制动作
105+
106+但都必须通过显式控制指令或明确 API 操作完成。
107+
108 ## 建议的 BAA 控制指令草案
109
110 沿用旧 `baa` 的 `@target::tool::params` 风格,优先采用显式 JSON 参数。
111@@ -153,22 +233,6 @@ AI 需要能够在“持续出错、陷入死循环、需要人工或其他 AI
112 - `resume` 只解除当前对话暂停,不改系统级状态
113 - `system::resume` 只恢复系统级闸门,不改各对话原有状态
114
115-## 熔断建议
116-
117-当出现下面情况时,系统应允许自动进入 `paused` 或 `rescue_wait`:
118-
119-- 同一对话短时间连续失败
120-- 续命内容高度重复,疑似死循环
121-- BAA 指令连续报错
122-- 指令和续命交替触发,形成无意义回路
123-
124-熔断后:
125-
126-- 停止继续续命
127-- 不再自动触发新的对话级执行
128-- 记录原因和最近错误
129-- 等待人工或其他 AI 恢复
130-
131 ## 与现有需求文档的关系
132
133 - 页面/对话级统一控制:见 `UNIFIED_OVERLAY_AUTOMATION_CONTROL.md`
134@@ -181,4 +245,6 @@ AI 需要能够在“持续出错、陷入死循环、需要人工或其他 AI
135 - 控制类指令优先于普通 BAA 与 renewal
136 - BAA 指令执行时,renewal 不会抢同一对话的出站机会
137 - 对话可被 AI 显式切到 `rescue_wait` / `paused`
138+- 系统能自动检测重复消息、重复续命、连续失败等死循环信号
139+- 命中熔断后,对话会自动停机并记录暂停原因
140 - 系统恢复和对话恢复不会互相覆盖状态
+2,
-0
1@@ -92,6 +92,7 @@
2 - `@conductor::conversation::pause`
3 - `@conductor::conversation::resume`
4 - `@conductor::conversation::mode`
5+- 自动熔断与 `pause_reason` 暴露
6
7 这些控制指令与 renewal 的关系不是“谁替代谁”,而是共享同一套 automation control plane。
8
9@@ -100,6 +101,7 @@
10 - 控制类指令优先于普通 BAA 指令
11 - 普通 BAA 指令优先于续命
12 - 续命只在对话空闲时运行
13+- 系统必须自动检测重复消息、连续失败和死循环迹象,并将对话自动切入停机状态
14
15 ## 5. 编排层路线
16
1@@ -18,6 +18,11 @@
2 | 系统级 | ✅ running/paused/draining | ❌ 没有全局开关 |
3 | 页面/对话级 | ✅ 暂停本页/恢复本页 | ✅ manual/auto/paused(仅 API) |
4
5+说明:
6+
7+- 自动熔断导致的停机,属于页面/对话级暂停,不属于系统级暂停
8+- 系统级暂停只表达“整机先别跑任何自动化”,不承担死循环检测职责
9+
10 ## 目标
11
12 增加系统级暂停能力,一键暂停/恢复所有自动化(BAA 指令 + 续命)。
13@@ -75,6 +80,7 @@
14 - 系统暂停后,BAA 指令处理和续命同时停止
15 - 系统恢复后,两者按各自状态恢复
16 - 系统暂停不影响各对话的 automation_status
17+- 系统暂停不会覆盖自动熔断写下的 `pause_reason`
18 - timed-jobs 日志中能看到 `skipped_system_paused` 记录
19 - 浮层能显示系统级暂停状态
20
1@@ -60,6 +60,13 @@
2
3 页面/对话级只回答“当前页面/对话是否允许自动化”;系统级只回答“整个 conductor 现在是否允许自动化”。
4
5+页面/对话级还需要保留 `pause_reason`,用于区分:
6+
7+- 用户手动暂停
8+- AI 主动暂停
9+- 系统自动熔断暂停
10+- 等待救援
11+
12 ## 执行判定顺序
13
14 执行时按下面顺序判断:
15@@ -80,6 +87,7 @@
16 - 浮层同时显示两类状态:
17 - 系统:运行中 / 系统暂停 / draining
18 - 当前对话:auto / paused / manual
19+- 当前对话如处于 `paused`,还应显示 `pause_reason`
20 - 按钮文案保持分层:
21 - 系统级按钮:`系统暂停` / `系统恢复`
22 - 页面级按钮:`暂停本页` / `恢复本页` / `设为手动`
23@@ -110,6 +118,8 @@
24
25 - `firefox-ws.ts`:收到页面控制指令时,同步更新 `local_conversations.automation_status`
26 - `local-api.ts`:renewal API 状态变更时,同步广播给对应的 WS 连接
27+- renewal / instruction 运行态需要能把自动熔断结果同步成 `automation_status + pause_reason`
28+- 自动熔断判断应以结构化行为信号为主,以文本模式匹配为辅;不能只靠字符串命中来暂停对话
29
30 ### 状态同步方向
31
32@@ -130,6 +140,7 @@ REST API → conductor → 广播 WS → controller → 浮层刷新
33 - “暂停本页”同时暂停页面级 BAA 和 renewal
34 - “恢复本页”只恢复当前对话,不解除系统级暂停
35 - “系统恢复”只恢复系统级闸门,不改各对话原有状态
36+- 自动熔断暂停属于页面/对话级暂停的一种,必须在浮层上可见,而不是只写日志
37 - 如果对话还没有 local_conversation 记录(从没有 final-message),浮层只控制 page_control
38 - 系统级暂停仍是独立需求,见 `SYSTEM_LEVEL_PAUSE_REQUIREMENTS.md`
39
40@@ -138,5 +149,6 @@ REST API → conductor → 广播 WS → controller → 浮层刷新
41 - 浮层点击"暂停本页"后,BAA 指令和续命同时暂停
42 - 浮层点击"恢复本页"后,两者同时恢复
43 - 浮层能同时显示系统状态和当前对话状态
44+- 自动熔断后,浮层能显示该对话已暂停及暂停原因
45 - REST API 修改状态后,浮层能实时反映
46 - 不影响现有 BAA 指令主链路