codex@macbookpro
·
2026-04-01
AUTOMATION_ARBITRATION_REQUIREMENTS.md
1# 自动化仲裁需求
2
3> 日期:2026-03-31
4> 状态:需求讨论
5
6## 背景
7
8当前系统已经有两类自动化能力:
9
10- BAA 指令系统:在 final-message 中提取 ` ```baa ` 指令并执行
11- 续命系统:在 final-message 结束后,通过 timed-jobs 生成并发送续命任务
12
13两者都会在 SSE / final-message 结束后开始工作。如果没有统一仲裁规则,就会出现同一对话中“指令执行”和“续命发送”同时争抢出站机会的问题。
14
15## 目标
16
17定义同一对话上的自动化优先级、互斥规则、暂停语义和救援语义,避免:
18
19- 一条 final-message 同时触发 BAA 与 renewal
20- BAA 正在执行时 renewal 继续向同一对话发消息
21- 对话进入死循环或持续报错时没有自动停机与显式救援方式
22
23## 核心原则
24
25### 1. 显式控制优先于一切
26
27如果 final-message 中包含控制类指令,先处理控制,不再进入本轮普通 BAA 执行或续命。
28
29控制类指令包括:
30
31- 暂停当前对话
32- 恢复当前对话
33- 切换当前对话到 `manual / auto / paused`
34- 系统级暂停 / 恢复
35- 标记等待救援
36
37### 2. 显式执行优先于隐式续命
38
39如果 final-message 中包含普通 BAA 指令,则:
40
41- 先执行 BAA 指令
42- 本轮不生成续命任务
43
44续命只在“这一轮没有显式工作”时才运行。
45
46### 3. 同一对话同一时刻只能有一个自动化出站者
47
48对同一 local conversation,任一时刻只能处于以下之一:
49
50- `idle`
51- `instruction_running`
52- `renewal_running`
53
54不能同时存在两个自动化出站动作。
55
56### 4. 续命是空闲时的后台兜底,不是主逻辑
57
58续命只在以下条件同时满足时才允许运行:
59
60- 对话自动化状态为 `auto`
61- 系统级状态允许执行
62- 当前没有执行中的 BAA 指令
63- 当前没有执行中的 renewal
64- 没有命中熔断 / 救援等待状态
65
66### 5. 自动熔断是基础要求,不是可选优化
67
68系统必须能够自动检测“继续自动化可能进入死循环或放大错误”的场景,并自动把当前对话切到 `paused` 或 `rescue_wait`。
69
70这里的自动熔断不是为了自动修复,而是为了自动停机,等待人工或其他 AI 明确恢复。
71
72## 同一条 final-message 的处理顺序
73
74收到最终权威消息后,按顺序处理:
75
761. 控制类指令
772. 普通 BAA 指令
783. 续命判断
79
80也就是:
81
82- 有控制类指令:只做控制
83- 无控制类指令但有普通 BAA 指令:只做指令
84- 两者都没有:才考虑续命
85
86## 状态模型建议
87
88### 系统级
89
90- `running`
91- `paused`
92- `draining`
93
94### 对话级自动化状态
95
96- `manual`
97- `auto`
98- `paused`
99
100### 对话级暂停原因
101
102建议额外记录 `pause_reason`,至少支持:
103
104- `user_pause`
105- `ai_pause`
106- `system_pause`
107- `error_loop`
108- `rescue_wait`
109- `repeated_message`
110- `repeated_renewal`
111- `execution_failure`
112
113### 对话级执行锁
114
115建议运行态表达为:
116
117- `idle`
118- `instruction_running`
119- `renewal_running`
120
121## AI 自行停机与救援语义
122
123AI 需要能够在“持续出错、陷入死循环、需要人工或其他 AI 接手”时显式停机。
124
125这里不依赖自然语言猜测,而是要求 AI 发出明确控制指令。
126
127推荐语义:
128
129- AI 发现自己无法继续安全推进时:
130 - 暂停当前对话
131 - 原因设为 `rescue_wait`
132- 其他 AI 或人工介入后:
133 - 显式恢复该对话
134 - 或切到 `manual`
135 - 或重新切回 `auto`
136
137## 自动熔断基础要求
138
139### 必须检测的信号
140
141系统至少要能检测下面这些信号:
142
143#### A. 结构化行为信号(主规则)
144
145- renewal dispatcher 连续失败、超时、429、5xx 或 route unavailable
146- BAA 指令连续执行失败
147- 短时间内同一对话生成过多 renewal job
148- 同一对话重复发送同类自动化请求
149- 指令执行与续命交替触发,但没有产生新的有效状态变化
150
151#### B. 重复度 / 相似度信号(第二层)
152
153- 同一对话连续出现高度相似的 final-message
154- 同一对话连续生成高度相似的续命内容
155
156这里应优先采用归一化后的重复度判断,例如:
157
158- 去空白
159- 去时间戳
160- 去动态 ID
161- 保留语义正文再做 hash / 比较
162
163#### C. 文本模式信号(辅助规则)
164
165允许增加稳定错误短语匹配,例如:
166
167- “出错了”
168- “稍后再试”
169- “无法继续”
170- “需要人工帮助”
171
172但文本模式只作为辅助加分项,不能作为唯一熔断依据。
173
174### 判断原则
175
176自动熔断应遵循下面这条基础规则:
177
178> 以行为信号为主,以文本信号为辅,不以字符串匹配作为唯一依据。
179
180也就是说:
181
182- 优先看结构化状态和执行行为
183- 其次看消息重复度和续命内容重复度
184- 最后才参考稳定错误文本
185
186### 命中后的必需动作
187
188命中自动熔断条件后,系统必须:
189
190- 立即停止为该对话继续生成新的续命任务
191- 不再推进该对话待执行的自动化任务
192- 将对话切到 `paused` 或 `rescue_wait`
193- 写明 `pause_reason`
194- 记录最近错误、触发计数和触发时间
195
196### 恢复原则
197
198自动熔断后,不自动恢复。
199
200恢复必须显式发生,来源可以是:
201
202- 用户
203- 其他 AI
204- 后续明确的系统控制动作
205
206但都必须通过显式控制指令或明确 API 操作完成。
207
208## 建议的 BAA 控制指令草案
209
210沿用旧 `baa` 的 `@target::tool::params` 风格,优先采用显式 JSON 参数。
211
212### 系统级
213
214```text
215@conductor::system::pause
216@conductor::system::resume
217```
218
219### 当前对话
220
221```text
222@conductor::conversation::pause::{"scope":"current","reason":"rescue_wait"}
223@conductor::conversation::resume::{"scope":"current"}
224@conductor::conversation::mode::{"scope":"current","mode":"manual"}
225@conductor::conversation::mode::{"scope":"current","mode":"auto"}
226@conductor::conversation::mode::{"scope":"current","mode":"paused"}
227```
228
229### 指令约束
230
231- `scope:"current"` 表示当前 final-message 所属对话
232- `pause` 和 `mode:"paused"` 都可以让对话停机,但 `pause` 更适合带原因
233- `resume` 只解除当前对话暂停,不改系统级状态
234- `system::resume` 只恢复系统级闸门,不改各对话原有状态
235
236## 与现有需求文档的关系
237
238- 页面/对话级统一控制:见 `UNIFIED_OVERLAY_AUTOMATION_CONTROL.md`
239- 系统级暂停:见 `SYSTEM_LEVEL_PAUSE_REQUIREMENTS.md`
240- 本文档只回答“同一对话在 SSE 结束后先做什么、谁优先、什么时候该停机”
241
242## 验收标准
243
244- 同一条 final-message 不会同时触发 BAA 执行和 renewal 发送
245- 控制类指令优先于普通 BAA 与 renewal
246- BAA 指令执行时,renewal 不会抢同一对话的出站机会
247- 对话可被 AI 显式切到 `rescue_wait` / `paused`
248- 系统能自动检测重复消息、重复续命、连续失败等死循环信号
249- 命中熔断后,对话会自动停机并记录暂停原因
250- 系统恢复和对话恢复不会互相覆盖状态