baa-conductor

git clone 

baa-conductor / plans
codex@macbookpro  ·  2026-04-01

SYSTEM_LEVEL_PAUSE_REQUIREMENTS.md

 1# 系统级暂停需求
 2
 3> 日期:2026-03-31
 4> 状态:需求讨论
 5
 6## 背景
 7
 8当前 conductor 已有系统级 `automation.mode`(running/paused/draining),控制的是整个 BAA 指令处理链路。但续命系统没有全局暂停能力——只能逐个对话暂停。
 9
10需要一个系统级暂停,一键暂停所有自动化行为。
11
12同一对话在 SSE 结束后的优先级与互斥规则,另见 `AUTOMATION_ARBITRATION_REQUIREMENTS.md`13
14## 当前现状
15
16| 控制层级 | BAA 指令 | 续命系统 |
17|---------|---------|---------|
18| 系统级 | ✅ running/paused/draining | ❌ 没有全局开关 |
19| 页面/对话级 | ✅ 暂停本页/恢复本页 | ✅ manual/auto/paused(仅 API) |
20
21说明:
22
23- 自动熔断导致的停机,属于页面/对话级暂停,不属于系统级暂停
24- 系统级暂停只表达“整机先别跑任何自动化”,不承担死循环检测职责
25
26## 目标
27
28增加系统级暂停能力,一键暂停/恢复所有自动化(BAA 指令 + 续命)。
29
30这里的系统级暂停是独立于页面/对话级状态的上层闸门,不与 `manual / auto / paused` 合并。
31
32## 设计要点
33
34### 系统级暂停语义
35
36- **系统暂停**:所有 BAA 指令处理停止 + timed-jobs 停止 tick(projector 和 dispatcher 都不执行)
37- **系统恢复**:BAA 指令处理恢复 + timed-jobs 恢复 tick
38- 系统暂停不改变各对话的 automation_status,只是在更上层阻断执行
39- 系统恢复后,各对话按自己的 automation_status 恢复原有行为
40
41换句话说:
42
43- 系统级暂停是“先别跑任何自动化”
44- 对话级暂停是“只有这个对话别跑”
45- 两者可以同时存在,但绝不能互相覆盖状态
46
47### 与页面/对话级的关系
48
49```
50系统级暂停 → 全局阻断,不管对话级状态
51系统级恢复 → 恢复后,对话级状态生效
52对话级暂停 → 只影响该对话,其他对话不受影响
53```
54
55执行顺序固定为:
56
571. 先看系统级状态
582. 再看页面/对话级状态
59
60这意味着:
61
62- 系统级恢复不会把 `manual``paused` 的对话自动改成 `auto`
63- 页面级恢复不会把系统级 `paused` 改成 `running`
64
65### 实现方向
66
67- 复用现有 `system_state` 表的 `automation` key
68- timed-jobs runtime 的 `schedule` 回调里检查系统级状态
69- 如果系统 paused,所有 runner 跳过(已有 `skipped_not_leader` 机制,可类似实现 `skipped_system_paused`70
71### 控制入口
72
73- 浮层里保留系统级控制按钮(当前已有)
74- 浮层可以与页面级控制放在同一块 UI 里,但必须分成两个区域,不共用一个按钮或一个状态值
75- REST API:复用现有 `/v1/control/state` 或新增 `/v1/system/pause`、`/v1/system/resume`
76- 后续可通过 BAA 指令 `@conductor::system::pause` / `@conductor::system::resume` 控制
77
78## 验收标准
79
80- 系统暂停后,BAA 指令处理和续命同时停止
81- 系统恢复后,两者按各自状态恢复
82- 系统暂停不影响各对话的 automation_status
83- 系统暂停不会覆盖自动熔断写下的 `pause_reason`
84- timed-jobs 日志中能看到 `skipped_system_paused` 记录
85- 浮层能显示系统级暂停状态
86
87## 优先级
88
89中。当前优先项是“统一浮层入口但保持分层状态模型”;系统级暂停在此之后实现。