baa-conductor

git clone 

baa-conductor / plans
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- 系统恢复和对话恢复不会互相覆盖状态