baa-conductor

git clone 

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
M plans/AUTOMATION_ARBITRATION_REQUIREMENTS.md
+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 - 系统恢复和对话恢复不会互相覆盖状态
M plans/BAA_INSTRUCTION_ROADMAP.md
+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 
M plans/SYSTEM_LEVEL_PAUSE_REQUIREMENTS.md
+6, -0
 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 
M plans/UNIFIED_OVERLAY_AUTOMATION_CONTROL.md
+12, -0
 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 指令主链路