baa-conductor

git clone 

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
M bugs/README.md
+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 | 状态 | 一句话 |
M plans/STATUS_SUMMARY.md
+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`,当前进入实现排期
A tasks/T-S060.md
+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+- 暂无
A tasks/T-S061.md
+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+- 暂无
A tasks/T-S062.md
+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+- 暂无
A tasks/T-S063.md
+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+- 暂无
A tasks/T-S064.md
+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+- 暂无
A tasks/T-S065.md
+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+- 暂无
M tasks/TASK_OVERVIEW.md
+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