- commit
- 2c1eb7b
- parent
- 64d122e
- author
- codex@macbookpro
- date
- 2026-04-01 10:47:41 +0800 CST
docs: split automation backlog into tasks
9 files changed,
+973,
-33
+6,
-3
1@@ -17,12 +17,15 @@ bugs/
2
3 当前 open opt:
4
5-- `OPT-005`:[`OPT-005-normalize-parse-error-isolation.md`](./OPT-005-normalize-parse-error-isolation.md)
6-- `OPT-008`:[`OPT-008-timed-jobs-async-log-writes.md`](./OPT-008-timed-jobs-async-log-writes.md)
7-- `OPT-003`:[`OPT-003-policy-configurable.md`](./OPT-003-policy-configurable.md)
8 - `OPT-004`:[`OPT-004-final-message-claude-sse-fallback.md`](./OPT-004-final-message-claude-sse-fallback.md)
9 - `OPT-009`:[`OPT-009-renewal-duplicate-utility-functions.md`](./OPT-009-renewal-duplicate-utility-functions.md)
10
11+已转任务卡跟踪:
12+
13+- `OPT-005` → [`../tasks/T-S063.md`](../tasks/T-S063.md)
14+- `OPT-008` → [`../tasks/T-S064.md`](../tasks/T-S064.md)
15+- `OPT-003` → [`../tasks/T-S065.md`](../tasks/T-S065.md)
16+
17 ## 已归档(archive/)
18
19 | ID | 状态 | 一句话 |
+24,
-15
1@@ -6,7 +6,7 @@
2
3 ## 当前代码基线
4
5-- 当前主分支:`main@b8d69c8`
6+- 当前主分支:`main@64d122e`
7 - canonical local API:`http://100.71.210.78:4317`
8 - canonical public host:`https://conductor.makefile.so`
9 - 活跃任务文档和近期刚完成的任务文档保留在 `tasks/` 根目录;较早已完成任务归档到 [`../tasks/archive/README.md`](../tasks/archive/README.md)
10@@ -68,27 +68,36 @@
11
12 **当前下一波任务:**
13
14-1. `OPT-005`:normalize / parse 错误隔离
15-2. `OPT-008`:timed-jobs 日志改异步写入
16-3. `OPT-003`:policy 配置化
17-4. `OPT-004`:Claude final-message 更稳 fallback
18-5. `OPT-009`:renewal 模块重复工具函数抽取
19+1. `T-S060`:自动化仲裁与自动熔断基础
20+2. `T-S063`:normalize / parse 错误隔离
21+3. `T-S061`:浮层统一自动化控制
22+4. `T-S062`:系统级暂停接入自动化主链
23+5. `T-S064`:timed-jobs 异步日志写入
24+6. `T-S065`:policy 配置化
25+7. `OPT-004`:Claude final-message 更稳 fallback
26+8. `OPT-009`:renewal 模块重复工具函数抽取
27
28 并行需要持续关注:
29
30-- 自动化仲裁 / 统一浮层控制 / 系统级暂停 这三份需求文档已定稿,但尚未拆成实现任务卡
31+- `T-S061`、`T-S062` 建议在 `T-S060` 之后推进
32
33 **并行优化项:**
34
35-1. `OPT-005`
36- 让 normalize / parse 错误进一步隔离,不拖累整批指令
37-2. `OPT-008`
38+1. `T-S060`
39+ 自动化仲裁、执行锁、pause_reason 和自动熔断基础
40+2. `T-S063`
41+ normalize / parse 错误进一步隔离,不拖累整批指令
42+3. `T-S061`
43+ 浮层统一页面级 BAA / renewal 控制
44+4. `T-S062`
45+ 系统级暂停接入 BAA 与 timed-jobs 主链
46+5. `T-S064`
47 timed-jobs 日志改异步写入,减少同步 IO 对事件循环的阻塞
48-3. `OPT-003`
49+6. `T-S065`
50 让 policy 白名单配置化
51-4. `OPT-004`
52+7. `OPT-004`
53 为 Claude final-message 增加更稳的 SSE fallback
54-5. `OPT-009`
55+8. `OPT-009`
56 renewal 模块重复工具函数抽取,减少重复逻辑
57
58 **已关闭的优化项:**
59@@ -127,7 +136,7 @@ Phase 1(浏览器主链)、Artifact 静态服务,以及 timed-jobs + 续
60 - 当前主线已无 open bug blocker
61 - `browser.chatgpt` / `browser.gemini` helper target 与 Gemini DOM delivery adapter 已在主线
62 - 当前主要以剩余 `OPT-*` 优化项为主
63-- 自动化仲裁、统一浮层控制、系统级暂停 这三条需求已完成文档定稿,但代码实现尚未拆 task
64+- 自动化仲裁、统一浮层控制、系统级暂停 这三条需求已拆成 `T-S060`、`T-S061`、`T-S062`
65
66 之前的浏览器主链继续保持:
67
68@@ -146,4 +155,4 @@ Phase 1(浏览器主链)、Artifact 静态服务,以及 timed-jobs + 续
69 - ChatGPT root message / mapping 结构如果后续变化,final-message 提取启发式仍需跟进
70 - recent relay cache 是有限窗口;极老 replay 超出窗口后,仍会落回 conductor dedupe
71 - `status-api` 继续保留为显式 opt-in 兼容层,不是当前删除重点
72-- 自动化仲裁、统一浮层控制、系统级暂停目前仍停留在需求文档阶段,尚未拆成实现任务卡
73+- 自动化仲裁、统一浮层控制、系统级暂停已经拆成 `T-S060`、`T-S061`、`T-S062`,当前进入实现排期
+180,
-0
1@@ -0,0 +1,180 @@
2+# Task T-S060:自动化仲裁与自动熔断基础
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`L`
8+- 依赖任务:`T-S056`、`T-S058`、`T-S059`
9+- 建议执行者:`Codex`(涉及 conductor 指令链路、renewal 调度和状态模型联动)
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S060.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/plans/AUTOMATION_ARBITRATION_REQUIREMENTS.md`
18+- `/Users/george/code/baa-conductor/plans/UNIFIED_OVERLAY_AUTOMATION_CONTROL.md`
19+- `/Users/george/code/baa-conductor/plans/SYSTEM_LEVEL_PAUSE_REQUIREMENTS.md`
20+
21+## 当前基线
22+
23+- 仓库:`/Users/george/code/baa-conductor`
24+- 分支基线:`main`
25+- 提交:`64d122e`
26+
27+## 分支与 worktree(强制)
28+
29+- 分支名:`feat/automation-arbitration-core`
30+- worktree 路径:`/Users/george/code/baa-conductor-automation-arbitration-core`
31+
32+开工步骤:
33+
34+1. `cd /Users/george/code/baa-conductor`
35+2. `git worktree add ../baa-conductor-automation-arbitration-core -b feat/automation-arbitration-core main`
36+3. `cd ../baa-conductor-automation-arbitration-core`
37+4. 在这个 worktree 目录里开发,不要回到主仓库目录
38+
39+完成后提交与推送:
40+
41+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
42+2. `git push -u origin feat/automation-arbitration-core`
43+
44+合并步骤(由合并者执行):
45+
46+1. `cd /Users/george/code/baa-conductor`
47+2. `git fetch origin`
48+3. `git merge origin/feat/automation-arbitration-core`
49+4. `git push`
50+5. `git worktree remove ../baa-conductor-automation-arbitration-core`(如果 worktree 还在)
51+
52+合并冲突处理:
53+
54+1. 如果 `git merge` 报冲突,先 `git diff` 查看冲突文件
55+2. 手动解决冲突后 `git add` 冲突文件
56+3. `git merge --continue` 完成合并
57+4. 不要用 `git merge --abort` 然后 force 覆盖
58+
59+命名规则:
60+
61+- 功能任务分支名以 `feat/` 开头
62+- 缺陷任务分支名以 `bug/` 开头
63+
64+## 目标
65+
66+把 BAA 指令系统和续命系统的执行顺序、互斥规则、自动熔断和 `pause_reason` 基础能力落到代码里,形成统一的 automation arbitration core。
67+
68+## 背景
69+
70+当前 BAA 指令和 renewal 都会在 final-message 结束后开始工作。如果没有统一仲裁,同一对话会出现:
71+
72+- 指令执行和续命发送同时争抢出站机会
73+- 连续失败、重复消息和重复续命时没有自动停机
74+- AI 想显式暂停当前对话时,没有稳定的基础状态模型
75+
76+## 涉及仓库
77+
78+- `/Users/george/code/baa-conductor`
79+
80+## 范围
81+
82+- 落地 control > instruction > renewal 的处理顺序
83+- 落地同一对话的自动化执行锁
84+- 落地 `pause_reason` 和自动熔断基础能力
85+- 落地最小显式控制指令或等价内部控制入口
86+
87+## 路径约束
88+
89+- 首版重点在 conductor 后端,不要求同时完成浮层 UI
90+- 不把系统级暂停和页面级控制混成一个总状态机
91+- 自动熔断必须以结构化行为信号为主,文本信号为辅
92+
93+## 推荐实现边界
94+
95+建议优先做:
96+
97+- `apps/conductor-daemon/src/instructions/`
98+- `apps/conductor-daemon/src/renewal/`
99+- `apps/conductor-daemon/src/firefox-ws.ts`
100+- `apps/conductor-daemon/src/local-api.ts`
101+- `packages/artifact-db/`
102+
103+## 允许修改的目录
104+
105+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
106+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/renewal/`
107+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-ws.ts`
108+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
109+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
110+- `/Users/george/code/baa-conductor/packages/artifact-db/`
111+
112+## 尽量不要修改
113+
114+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
115+- `/Users/george/code/baa-conductor/apps/codexd/`
116+
117+## 必须完成
118+
119+### 1. 自动化仲裁顺序
120+
121+- 明确实现:控制类指令 > 普通 BAA 指令 > renewal 判断
122+- 同一条 final-message 不会同时触发普通 BAA 执行和续命发送
123+- 同一对话同一时刻只能有一个自动化出站者
124+
125+### 2. 对话级状态基础
126+
127+- 为 local conversation 落地 `pause_reason`
128+- 落地最小执行锁:`idle / instruction_running / renewal_running`
129+- 系统恢复不会覆盖对话原有状态
130+
131+### 3. 自动熔断
132+
133+- 至少接入重复消息、重复续命、连续失败、超时/429/5xx、route unavailable 等结构化信号
134+- 命中后自动切到 `paused` 或 `rescue_wait`
135+- 记录暂停原因、触发时间和最近错误
136+
137+## 需要特别注意
138+
139+- 自动熔断是基础要求,不是可选优化
140+- 文本模式匹配只能作为辅助信号,不能作为唯一熔断依据
141+- 不要把 UI 交互逻辑混进本任务;浮层统一控制由后续任务完成
142+- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
143+
144+## 验收标准
145+
146+- 同一条 final-message 不会同时触发普通 BAA 执行和 renewal 发送
147+- 自动化命中死循环/连续失败信号后会自动停机
148+- 对话状态会写明 `pause_reason`
149+- 系统恢复和对话恢复不会互相覆盖
150+
151+## 推荐验证命令
152+
153+- `cd /Users/george/code/baa-conductor-automation-arbitration-core && pnpm -C apps/conductor-daemon test`
154+- `cd /Users/george/code/baa-conductor-automation-arbitration-core && pnpm -C packages/artifact-db test`
155+- `cd /Users/george/code/baa-conductor-automation-arbitration-core && pnpm build`
156+
157+## 执行记录
158+
159+> 以下内容由执行任务的 AI 填写,创建任务时留空。
160+
161+### 开始执行
162+
163+- 执行者:
164+- 开始时间:
165+- 状态变更:`待开始` → `进行中`
166+
167+### 完成摘要
168+
169+- 完成时间:
170+- 状态变更:`进行中` → `已完成`
171+- 修改了哪些文件:
172+- 核心实现思路:
173+- 跑了哪些测试:
174+
175+### 执行过程中遇到的问题
176+
177+- 暂无
178+
179+### 剩余风险
180+
181+- 暂无
+172,
-0
1@@ -0,0 +1,172 @@
2+# Task T-S061:浮层统一自动化控制
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`M`
8+- 依赖任务:`T-S060`
9+- 建议执行者:`Claude / Codex`(需要同时处理插件浮层、WS 同步和状态映射)
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S061.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/plans/UNIFIED_OVERLAY_AUTOMATION_CONTROL.md`
18+- `/Users/george/code/baa-conductor/plans/AUTOMATION_ARBITRATION_REQUIREMENTS.md`
19+- `/Users/george/code/baa-conductor/tasks/T-S060.md`
20+
21+## 当前基线
22+
23+- 仓库:`/Users/george/code/baa-conductor`
24+- 分支基线:`main`
25+- 提交:`64d122e`
26+
27+## 分支与 worktree(强制)
28+
29+- 分支名:`feat/unified-overlay-automation-control`
30+- worktree 路径:`/Users/george/code/baa-conductor-unified-overlay-automation-control`
31+
32+开工步骤:
33+
34+1. `cd /Users/george/code/baa-conductor`
35+2. `git worktree add ../baa-conductor-unified-overlay-automation-control -b feat/unified-overlay-automation-control main`
36+3. `cd ../baa-conductor-unified-overlay-automation-control`
37+4. 在这个 worktree 目录里开发,不要回到主仓库目录
38+
39+完成后提交与推送:
40+
41+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
42+2. `git push -u origin feat/unified-overlay-automation-control`
43+
44+合并步骤(由合并者执行):
45+
46+1. `cd /Users/george/code/baa-conductor`
47+2. `git fetch origin`
48+3. `git merge origin/feat/unified-overlay-automation-control`
49+4. `git push`
50+5. `git worktree remove ../baa-conductor-unified-overlay-automation-control`(如果 worktree 还在)
51+
52+合并冲突处理:
53+
54+1. 如果 `git merge` 报冲突,先 `git diff` 查看冲突文件
55+2. 手动解决冲突后 `git add` 冲突文件
56+3. `git merge --continue` 完成合并
57+4. 不要用 `git merge --abort` 然后 force 覆盖
58+
59+命名规则:
60+
61+- 功能任务分支名以 `feat/` 开头
62+- 缺陷任务分支名以 `bug/` 开头
63+
64+## 目标
65+
66+把页面右下角浮层升级成统一自动化控制入口,同时控制页面级 BAA 和 renewal,并展示 `pause_reason`。
67+
68+## 背景
69+
70+当前浮层只能控制页面级 BAA;renewal 的 `manual / auto / paused` 只能通过 API 操作。用户看不到两套状态之间的关系,也无法从一个入口暂停当前对话的全部自动化。
71+
72+## 涉及仓库
73+
74+- `/Users/george/code/baa-conductor`
75+
76+## 范围
77+
78+- 浮层展示系统状态和当前对话状态
79+- 页面级按钮同时作用于 BAA 与 renewal
80+- API / WS / 浮层状态保持同步
81+- `pause_reason` 在浮层上可见
82+
83+## 路径约束
84+
85+- 本任务只做页面/对话级统一控制
86+- 系统级暂停的后端行为和独立控制由 `T-S062` 处理
87+- 不改自动化仲裁核心规则;依赖 `T-S060`
88+
89+## 推荐实现边界
90+
91+建议优先做:
92+
93+- `plugins/baa-firefox/content-script.js`
94+- `plugins/baa-firefox/controller.js`
95+- `apps/conductor-daemon/src/firefox-ws.ts`
96+- `apps/conductor-daemon/src/local-api.ts`
97+
98+## 允许修改的目录
99+
100+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
101+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-ws.ts`
102+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
103+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
104+
105+## 尽量不要修改
106+
107+- `/Users/george/code/baa-conductor/packages/artifact-db/`
108+- `/Users/george/code/baa-conductor/apps/codexd/`
109+
110+## 必须完成
111+
112+### 1. 浮层统一显示
113+
114+- 浮层同时显示系统状态和当前对话状态
115+- 当前对话如处于 `paused`,显示 `pause_reason`
116+- 页面级状态与 renewal `automation_status` 一致
117+
118+### 2. 页面级统一控制
119+
120+- “暂停本页”同时暂停页面级 BAA 和 renewal
121+- “恢复本页”只恢复当前对话,不解除系统级暂停
122+- “设为手动”会让当前对话停止自动续命
123+
124+### 3. 状态同步
125+
126+- 浮层按钮 → conductor → renewal/page_control 双向生效
127+- REST API 改状态后,浮层能实时刷新
128+- 自动熔断后的 `pause_reason` 能同步到浮层
129+
130+## 需要特别注意
131+
132+- 系统级状态和页面级状态必须分层显示,不共用一个状态值
133+- UI 可以统一入口,但不能把系统级和页面级恢复动作混在一起
134+- 不要让“恢复本页”顺手解除系统暂停
135+- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
136+
137+## 验收标准
138+
139+- 浮层点击“暂停本页”后,BAA 和 renewal 同时暂停
140+- 浮层点击“恢复本页”后,当前对话恢复,但系统级暂停保持不变
141+- 自动熔断后,浮层能看到暂停原因
142+- REST API 修改状态后,浮层实时反映
143+
144+## 推荐验证命令
145+
146+- `cd /Users/george/code/baa-conductor-unified-overlay-automation-control && pnpm -C apps/conductor-daemon test`
147+- `cd /Users/george/code/baa-conductor-unified-overlay-automation-control && pnpm -C plugins/baa-firefox test`
148+
149+## 执行记录
150+
151+> 以下内容由执行任务的 AI 填写,创建任务时留空。
152+
153+### 开始执行
154+
155+- 执行者:
156+- 开始时间:
157+- 状态变更:`待开始` → `进行中`
158+
159+### 完成摘要
160+
161+- 完成时间:
162+- 状态变更:`进行中` → `已完成`
163+- 修改了哪些文件:
164+- 核心实现思路:
165+- 跑了哪些测试:
166+
167+### 执行过程中遇到的问题
168+
169+- 暂无
170+
171+### 剩余风险
172+
173+- 暂无
+171,
-0
1@@ -0,0 +1,171 @@
2+# Task T-S062:系统级暂停接入自动化主链
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`M`
8+- 依赖任务:`T-S060`
9+- 建议执行者:`Codex`(以后端状态门控、timed-jobs 和控制接口为主)
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S062.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/plans/SYSTEM_LEVEL_PAUSE_REQUIREMENTS.md`
18+- `/Users/george/code/baa-conductor/plans/AUTOMATION_ARBITRATION_REQUIREMENTS.md`
19+- `/Users/george/code/baa-conductor/tasks/T-S060.md`
20+
21+## 当前基线
22+
23+- 仓库:`/Users/george/code/baa-conductor`
24+- 分支基线:`main`
25+- 提交:`64d122e`
26+
27+## 分支与 worktree(强制)
28+
29+- 分支名:`feat/system-level-automation-pause`
30+- worktree 路径:`/Users/george/code/baa-conductor-system-level-automation-pause`
31+
32+开工步骤:
33+
34+1. `cd /Users/george/code/baa-conductor`
35+2. `git worktree add ../baa-conductor-system-level-automation-pause -b feat/system-level-automation-pause main`
36+3. `cd ../baa-conductor-system-level-automation-pause`
37+4. 在这个 worktree 目录里开发,不要回到主仓库目录
38+
39+完成后提交与推送:
40+
41+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
42+2. `git push -u origin feat/system-level-automation-pause`
43+
44+合并步骤(由合并者执行):
45+
46+1. `cd /Users/george/code/baa-conductor`
47+2. `git fetch origin`
48+3. `git merge origin/feat/system-level-automation-pause`
49+4. `git push`
50+5. `git worktree remove ../baa-conductor-system-level-automation-pause`(如果 worktree 还在)
51+
52+合并冲突处理:
53+
54+1. 如果 `git merge` 报冲突,先 `git diff` 查看冲突文件
55+2. 手动解决冲突后 `git add` 冲突文件
56+3. `git merge --continue` 完成合并
57+4. 不要用 `git merge --abort` 然后 force 覆盖
58+
59+命名规则:
60+
61+- 功能任务分支名以 `feat/` 开头
62+- 缺陷任务分支名以 `bug/` 开头
63+
64+## 目标
65+
66+把系统级 `running / paused / draining` 接入 BAA 指令处理和 timed-jobs 主链,形成真正的全局 automation gate。
67+
68+## 背景
69+
70+当前页面/对话级暂停已经存在,但 renewal 没有真正的系统级全局开关。需要一键暂停所有自动化,同时不改写各对话原有状态。
71+
72+## 涉及仓库
73+
74+- `/Users/george/code/baa-conductor`
75+
76+## 范围
77+
78+- 系统级 automation.mode 统一门控
79+- timed-jobs 在系统暂停时跳过 tick
80+- BAA 指令链路在系统暂停时阻断
81+- 最小 REST / WS / 浮层状态同步
82+
83+## 路径约束
84+
85+- 自动熔断仍属于页面/对话级暂停,本任务不替代 `T-S060`
86+- 不把系统级暂停和页面级状态合并
87+
88+## 推荐实现边界
89+
90+建议优先做:
91+
92+- `apps/conductor-daemon/src/timed-jobs/`
93+- `apps/conductor-daemon/src/instructions/`
94+- `apps/conductor-daemon/src/local-api.ts`
95+- `apps/conductor-daemon/src/firefox-ws.ts`
96+- `packages/db/`
97+
98+## 允许修改的目录
99+
100+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/timed-jobs/`
101+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
102+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
103+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-ws.ts`
104+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
105+- `/Users/george/code/baa-conductor/packages/db/`
106+
107+## 尽量不要修改
108+
109+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`(除非确有必要补 system 状态展示)
110+
111+## 必须完成
112+
113+### 1. 系统级门控
114+
115+- 系统级 `paused` 时,BAA 指令和 renewal 都不执行
116+- 系统级 `running` 时,恢复后按各对话原有状态继续
117+- `system_pause` 不会覆盖各对话已有 `pause_reason`
118+
119+### 2. timed-jobs 集成
120+
121+- system paused 时,runner 不执行实际逻辑
122+- timed-jobs 日志写出 `skipped_system_paused`
123+
124+### 3. 控制入口
125+
126+- 保留现有系统级控制按钮和接口
127+- 如有必要,补最小系统级 pause/resume API
128+- 后续 BAA 控制指令可挂到这套后端状态上
129+
130+## 需要特别注意
131+
132+- 系统恢复不会把 `manual` 或 `paused` 的对话自动改成 `auto`
133+- 页面恢复不会把系统级 `paused` 改成 `running`
134+- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
135+
136+## 验收标准
137+
138+- 系统暂停后,BAA 指令和 renewal 同时停止
139+- 系统恢复后,两者按各自状态恢复
140+- timed-jobs 日志里有 `skipped_system_paused`
141+- 系统暂停不覆盖对话级 `pause_reason`
142+
143+## 推荐验证命令
144+
145+- `cd /Users/george/code/baa-conductor-system-level-automation-pause && pnpm -C apps/conductor-daemon test`
146+- `cd /Users/george/code/baa-conductor-system-level-automation-pause && pnpm -C packages/db test`
147+
148+## 执行记录
149+
150+> 以下内容由执行任务的 AI 填写,创建任务时留空。
151+
152+### 开始执行
153+
154+- 执行者:
155+- 开始时间:
156+- 状态变更:`待开始` → `进行中`
157+
158+### 完成摘要
159+
160+- 完成时间:
161+- 状态变更:`进行中` → `已完成`
162+- 修改了哪些文件:
163+- 核心实现思路:
164+- 跑了哪些测试:
165+
166+### 执行过程中遇到的问题
167+
168+- 暂无
169+
170+### 剩余风险
171+
172+- 暂无
+131,
-0
1@@ -0,0 +1,131 @@
2+# Task T-S063:normalize / parse 错误隔离
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`S`
8+- 依赖任务:无
9+- 建议执行者:`Codex`
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S063.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/bugs/OPT-005-normalize-parse-error-isolation.md`
18+- `/Users/george/code/baa-conductor/plans/STATUS_SUMMARY.md`
19+
20+## 当前基线
21+
22+- 仓库:`/Users/george/code/baa-conductor`
23+- 分支基线:`main`
24+- 提交:`64d122e`
25+
26+## 分支与 worktree(强制)
27+
28+- 分支名:`feat/normalize-parse-error-isolation`
29+- worktree 路径:`/Users/george/code/baa-conductor-normalize-parse-error-isolation`
30+
31+开工步骤:
32+
33+1. `cd /Users/george/code/baa-conductor`
34+2. `git worktree add ../baa-conductor-normalize-parse-error-isolation -b feat/normalize-parse-error-isolation main`
35+3. `cd ../baa-conductor-normalize-parse-error-isolation`
36+4. 在这个 worktree 目录里开发,不要回到主仓库目录
37+
38+完成后提交与推送:
39+
40+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
41+2. `git push -u origin feat/normalize-parse-error-isolation`
42+
43+合并步骤(由合并者执行):
44+
45+1. `cd /Users/george/code/baa-conductor`
46+2. `git fetch origin`
47+3. `git merge origin/feat/normalize-parse-error-isolation`
48+4. `git push`
49+5. `git worktree remove ../baa-conductor-normalize-parse-error-isolation`(如果 worktree 还在)
50+
51+合并冲突处理:
52+
53+1. 如果 `git merge` 报冲突,先 `git diff` 查看冲突文件
54+2. 手动解决冲突后 `git add` 冲突文件
55+3. `git merge --continue` 完成合并
56+4. 不要用 `git merge --abort` 然后 force 覆盖
57+
58+命名规则:
59+
60+- 功能任务分支名以 `feat/` 开头
61+- 缺陷任务分支名以 `bug/` 开头
62+
63+## 目标
64+
65+让 normalize / parse 阶段对单个坏 block 失败隔离,不再中断整批 BAA 指令。
66+
67+## 背景
68+
69+当前单个 block parse 失败仍可能影响后续合法 block 处理。这已经不是一般优化,而是指令链路健壮性问题。
70+
71+## 涉及仓库
72+
73+- `/Users/george/code/baa-conductor`
74+
75+## 范围
76+
77+- normalize / parse 错误隔离
78+- parseErrors 记录
79+- 对应测试
80+
81+## 允许修改的目录
82+
83+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
84+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
85+
86+## 必须完成
87+
88+### 1. 错误隔离
89+
90+- 单个坏 block 解析失败不影响后续合法 block
91+- normalize 结果能带出 parseErrors 或等价错误摘要
92+
93+### 2. 测试
94+
95+- 覆盖“前一个 block 坏、后一个 block 好”的场景
96+- 保持现有合法解析路径不回退
97+
98+## 验收标准
99+
100+- 单个 parse 失败不会中断整批
101+- 合法 block 仍能继续执行
102+- 测试覆盖该链路
103+
104+## 推荐验证命令
105+
106+- `cd /Users/george/code/baa-conductor-normalize-parse-error-isolation && pnpm -C apps/conductor-daemon test`
107+
108+## 执行记录
109+
110+> 以下内容由执行任务的 AI 填写,创建任务时留空。
111+
112+### 开始执行
113+
114+- 执行者:
115+- 开始时间:
116+- 状态变更:`待开始` → `进行中`
117+
118+### 完成摘要
119+
120+- 完成时间:
121+- 状态变更:`进行中` → `已完成`
122+- 修改了哪些文件:
123+- 核心实现思路:
124+- 跑了哪些测试:
125+
126+### 执行过程中遇到的问题
127+
128+- 暂无
129+
130+### 剩余风险
131+
132+- 暂无
+132,
-0
1@@ -0,0 +1,132 @@
2+# Task T-S064:timed-jobs 异步日志写入
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`S`
8+- 依赖任务:无
9+- 建议执行者:`Codex`
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S064.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/bugs/OPT-008-timed-jobs-async-log-writes.md`
18+- `/Users/george/code/baa-conductor/tasks/T-S057.md`
19+
20+## 当前基线
21+
22+- 仓库:`/Users/george/code/baa-conductor`
23+- 分支基线:`main`
24+- 提交:`64d122e`
25+
26+## 分支与 worktree(强制)
27+
28+- 分支名:`feat/timed-jobs-async-log-writes`
29+- worktree 路径:`/Users/george/code/baa-conductor-timed-jobs-async-log-writes`
30+
31+开工步骤:
32+
33+1. `cd /Users/george/code/baa-conductor`
34+2. `git worktree add ../baa-conductor-timed-jobs-async-log-writes -b feat/timed-jobs-async-log-writes main`
35+3. `cd ../baa-conductor-timed-jobs-async-log-writes`
36+4. 在这个 worktree 目录里开发,不要回到主仓库目录
37+
38+完成后提交与推送:
39+
40+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
41+2. `git push -u origin feat/timed-jobs-async-log-writes`
42+
43+合并步骤(由合并者执行):
44+
45+1. `cd /Users/george/code/baa-conductor`
46+2. `git fetch origin`
47+3. `git merge origin/feat/timed-jobs-async-log-writes`
48+4. `git push`
49+5. `git worktree remove ../baa-conductor-timed-jobs-async-log-writes`(如果 worktree 还在)
50+
51+合并冲突处理:
52+
53+1. 如果 `git merge` 报冲突,先 `git diff` 查看冲突文件
54+2. 手动解决冲突后 `git add` 冲突文件
55+3. `git merge --continue` 完成合并
56+4. 不要用 `git merge --abort` 然后 force 覆盖
57+
58+命名规则:
59+
60+- 功能任务分支名以 `feat/` 开头
61+- 缺陷任务分支名以 `bug/` 开头
62+
63+## 目标
64+
65+把 timed-jobs JSONL 日志从同步写改成异步写,减少事件循环阻塞。
66+
67+## 背景
68+
69+timed-jobs 已经是正式主链能力。继续使用同步日志写入会放大 tick 周期内的阻塞和抖动,已经不只是“代码风格优化”。
70+
71+## 涉及仓库
72+
73+- `/Users/george/code/baa-conductor`
74+
75+## 范围
76+
77+- timed-jobs runtime 日志写入改异步
78+- 保持日志格式和现有可读性
79+- 补测试或验证
80+
81+## 允许修改的目录
82+
83+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/timed-jobs/`
84+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
85+
86+## 必须完成
87+
88+### 1. 日志写入改造
89+
90+- 替换同步 `appendFileSync`
91+- 保持单条 JSONL 格式不变
92+- 错误写入不应拖死主链
93+
94+### 2. 行为保持
95+
96+- runner/tick 日志语义保持不变
97+- 不引入明显日志丢失或测试 flake
98+
99+## 验收标准
100+
101+- timed-jobs 不再依赖同步日志写入
102+- 现有日志仍可直接 tail / 分析
103+- 测试覆盖或验证通过
104+
105+## 推荐验证命令
106+
107+- `cd /Users/george/code/baa-conductor-timed-jobs-async-log-writes && pnpm -C apps/conductor-daemon test`
108+
109+## 执行记录
110+
111+> 以下内容由执行任务的 AI 填写,创建任务时留空。
112+
113+### 开始执行
114+
115+- 执行者:
116+- 开始时间:
117+- 状态变更:`待开始` → `进行中`
118+
119+### 完成摘要
120+
121+- 完成时间:
122+- 状态变更:`进行中` → `已完成`
123+- 修改了哪些文件:
124+- 核心实现思路:
125+- 跑了哪些测试:
126+
127+### 执行过程中遇到的问题
128+
129+- 暂无
130+
131+### 剩余风险
132+
133+- 暂无
+138,
-0
1@@ -0,0 +1,138 @@
2+# Task T-S065:policy 配置化
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`M`
8+- 依赖任务:无
9+- 建议执行者:`Codex`
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S065.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/bugs/OPT-003-policy-configurable.md`
18+- `/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md`
19+- `/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_ROADMAP.md`
20+
21+## 当前基线
22+
23+- 仓库:`/Users/george/code/baa-conductor`
24+- 分支基线:`main`
25+- 提交:`64d122e`
26+
27+## 分支与 worktree(强制)
28+
29+- 分支名:`feat/policy-configurable`
30+- worktree 路径:`/Users/george/code/baa-conductor-policy-configurable`
31+
32+开工步骤:
33+
34+1. `cd /Users/george/code/baa-conductor`
35+2. `git worktree add ../baa-conductor-policy-configurable -b feat/policy-configurable main`
36+3. `cd ../baa-conductor-policy-configurable`
37+4. 在这个 worktree 目录里开发,不要回到主仓库目录
38+
39+完成后提交与推送:
40+
41+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
42+2. `git push -u origin feat/policy-configurable`
43+
44+合并步骤(由合并者执行):
45+
46+1. `cd /Users/george/code/baa-conductor`
47+2. `git fetch origin`
48+3. `git merge origin/feat/policy-configurable`
49+4. `git push`
50+5. `git worktree remove ../baa-conductor-policy-configurable`(如果 worktree 还在)
51+
52+合并冲突处理:
53+
54+1. 如果 `git merge` 报冲突,先 `git diff` 查看冲突文件
55+2. 手动解决冲突后 `git add` 冲突文件
56+3. `git merge --continue` 完成合并
57+4. 不要用 `git merge --abort` 然后 force 覆盖
58+
59+命名规则:
60+
61+- 功能任务分支名以 `feat/` 开头
62+- 缺陷任务分支名以 `bug/` 开头
63+
64+## 目标
65+
66+把 BAA policy 从硬编码常量改成可配置结构,为后续 automation control plane 和更多 target/tool 扩面提供基础。
67+
68+## 背景
69+
70+当前 target/tool 白名单仍主要是硬编码集合。随着 `browser.chatgpt/gemini` 放开、自动化控制指令准备接入,这部分已经进入主链演进路径,不应继续只挂在 opt。
71+
72+## 涉及仓库
73+
74+- `/Users/george/code/baa-conductor`
75+
76+## 范围
77+
78+- policy 配置化入口
79+- 默认策略与当前行为兼容
80+- 测试覆盖
81+
82+## 允许修改的目录
83+
84+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
85+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
86+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
87+
88+## 必须完成
89+
90+### 1. policy 配置入口
91+
92+- 支持在 instruction center 构造或初始化阶段传入 policy 配置
93+- 默认值保持当前主线行为不变
94+
95+### 2. 兼容现有 target / tool
96+
97+- `conductor` / `system` / `browser.claude/chatgpt/gemini` 现有行为不回退
98+- 为后续新增 automation control 指令留清晰扩展点
99+
100+### 3. 测试
101+
102+- 覆盖默认 policy
103+- 覆盖自定义 policy 覆盖行为
104+
105+## 验收标准
106+
107+- 不传配置时,当前主线行为不变
108+- 传配置时,可以扩展或收缩允许的 target / tool 集合
109+- 测试覆盖核心分支
110+
111+## 推荐验证命令
112+
113+- `cd /Users/george/code/baa-conductor-policy-configurable && pnpm -C apps/conductor-daemon test`
114+
115+## 执行记录
116+
117+> 以下内容由执行任务的 AI 填写,创建任务时留空。
118+
119+### 开始执行
120+
121+- 执行者:
122+- 开始时间:
123+- 状态变更:`待开始` → `进行中`
124+
125+### 完成摘要
126+
127+- 完成时间:
128+- 状态变更:`进行中` → `已完成`
129+- 修改了哪些文件:
130+- 核心实现思路:
131+- 跑了哪些测试:
132+
133+### 执行过程中遇到的问题
134+
135+- 暂无
136+
137+### 剩余风险
138+
139+- 暂无
+19,
-15
1@@ -3,7 +3,7 @@
2 ## 当前基线
3
4 - 日期:`2026-04-01`
5-- 主分支基线:`main@b8d69c8`
6+- 主分支基线:`main@64d122e`
7 - canonical local API:`http://100.71.210.78:4317`
8 - canonical public host:`https://conductor.makefile.so`
9 - 当前活跃任务卡和近期刚完成的任务卡保留在本目录;较早已完成任务归档到 [`./archive/README.md`](./archive/README.md)
10@@ -77,9 +77,12 @@
11
12 | 项目 | 标题 | 类型 | 状态 | 说明 |
13 |---|---|---|---|---|
14-| [`../bugs/OPT-005-normalize-parse-error-isolation.md`](../bugs/OPT-005-normalize-parse-error-isolation.md) | normalize / parse 错误隔离 | opt | open | 避免单个坏 block 中断整批 BAA 指令 |
15-| [`../bugs/OPT-008-timed-jobs-async-log-writes.md`](../bugs/OPT-008-timed-jobs-async-log-writes.md) | timed-jobs 异步日志写入 | opt | open | 减少同步日志 IO 对事件循环的阻塞 |
16-| [`../bugs/OPT-003-policy-configurable.md`](../bugs/OPT-003-policy-configurable.md) | policy 配置化 | opt | open | 为后续 target / tool 扩面和自动化控制面铺路 |
17+| [`T-S060`](./T-S060.md) | 自动化仲裁与自动熔断基础 | task | 待开始 | 先落仲裁顺序、执行锁、pause_reason 和自动熔断基础 |
18+| [`T-S063`](./T-S063.md) | normalize / parse 错误隔离 | task | 待开始 | 收口指令链路健壮性,避免单个坏 block 中断整批 |
19+| [`T-S061`](./T-S061.md) | 浮层统一自动化控制 | task | 待开始 | 统一页面级 BAA / renewal 控制入口并显示 pause_reason |
20+| [`T-S062`](./T-S062.md) | 系统级暂停接入自动化主链 | task | 待开始 | 把系统级暂停接入 BAA 与 timed-jobs 主链 |
21+| [`T-S064`](./T-S064.md) | timed-jobs 异步日志写入 | task | 待开始 | 减少同步日志 IO 对事件循环的阻塞 |
22+| [`T-S065`](./T-S065.md) | policy 配置化 | task | 待开始 | 为自动化控制指令和后续扩面提供策略入口 |
23 | [`../bugs/OPT-004-final-message-claude-sse-fallback.md`](../bugs/OPT-004-final-message-claude-sse-fallback.md) | Claude final-message SSE fallback | opt | open | 降低上游 SSE 协议变化的脆弱性 |
24 | [`../bugs/OPT-009-renewal-duplicate-utility-functions.md`](../bugs/OPT-009-renewal-duplicate-utility-functions.md) | renewal 工具函数去重 | opt | open | 收口重复逻辑,属于低风险代码卫生 |
25
26@@ -129,12 +132,15 @@
27
28 ### P1(并行优化)
29
30-- [`../bugs/OPT-005-normalize-parse-error-isolation.md`](../bugs/OPT-005-normalize-parse-error-isolation.md)
31-- [`../bugs/OPT-008-timed-jobs-async-log-writes.md`](../bugs/OPT-008-timed-jobs-async-log-writes.md)
32+- [`T-S060`](./T-S060.md)
33+- [`T-S063`](./T-S063.md)
34
35 ### P2(次级优化)
36
37-- [`../bugs/OPT-003-policy-configurable.md`](../bugs/OPT-003-policy-configurable.md)
38+- [`T-S061`](./T-S061.md)
39+- [`T-S062`](./T-S062.md)
40+- [`T-S064`](./T-S064.md)
41+- [`T-S065`](./T-S065.md)
42 - [`../bugs/OPT-004-final-message-claude-sse-fallback.md`](../bugs/OPT-004-final-message-claude-sse-fallback.md)
43 - [`../bugs/OPT-009-renewal-duplicate-utility-functions.md`](../bugs/OPT-009-renewal-duplicate-utility-functions.md)
44
45@@ -147,9 +153,6 @@
46 - open bug:
47 - 当前没有 open bug
48 - open opt:
49- - `OPT-005`
50- - `OPT-008`
51- - `OPT-003`
52 - `OPT-004`
53 - `OPT-009`
54
55@@ -176,11 +179,12 @@
56
57 Phase 1(浏览器主链)、Artifact 静态服务,以及 timed-jobs + 续命主线都已完成收口。当前主线已经没有 open bug blocker,下一步是:
58
59-- 优先收口 `OPT-005`
60-- 并行推进 `OPT-008`
61-- 再处理 `OPT-003`、`OPT-004`
62-- 最后做 `OPT-009`
63-- 自动化仲裁 / 统一浮层控制 / 系统级暂停 需求已经定稿,下一步应拆成独立实现任务卡
64+- 先做 `T-S060`
65+- 并行推进 `T-S063`
66+- 然后做 `T-S061`
67+- 再做 `T-S062`
68+- 之后收口 `T-S064`、`T-S065`
69+- `OPT-004`、`OPT-009` 继续保留为 open opt
70
71 ## 现在该读什么
72