- commit
- a207f82
- parent
- 071abbf
- author
- codex@macbookpro
- date
- 2026-03-30 14:32:38 +0800 CST
docs: add renewal implementation tasks
6 files changed,
+794,
-11
+154,
-0
1@@ -0,0 +1,154 @@
2+# Task T-S055:续命基础存储层
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`M`
8+- 依赖任务:无
9+- 建议执行者:`Codex`(存储层、schema、同步队列改动集中)
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S055.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/plans/discuss/DISCUSS-TIMED-JOBS-RENEWAL-REQUIREMENTS.md`
18+- `/Users/george/code/baa-conductor/tasks/TASK_OVERVIEW.md`
19+
20+## 当前基线
21+
22+- 仓库:`/Users/george/code/baa-conductor`
23+- 分支基线:`main`
24+- 提交:`071abbf`
25+
26+## 分支与 worktree(强制)
27+
28+- 分支名:`feat/renewal-storage-foundation`
29+- worktree 路径:`/Users/george/code/baa-conductor-renewal-storage-foundation`
30+
31+开工步骤:
32+
33+1. `cd /Users/george/code/baa-conductor`
34+2. `git worktree add ../baa-conductor-renewal-storage-foundation -b feat/renewal-storage-foundation main`
35+3. `cd ../baa-conductor-renewal-storage-foundation`
36+
37+完成后提交与推送:
38+
39+1. 在 worktree 里提交所有变更
40+2. `git push -u origin feat/renewal-storage-foundation`
41+
42+## 目标
43+
44+为续命系统补齐首版存储基础:本地对话表、对话关联表、续命任务表,以及对应的本地 store 和 D1 同步能力。
45+
46+## 背景
47+
48+当前已经确认首版续命实现复用 `artifact.db + SyncQueue + D1SyncWorker`,但仍需要正式落地三个新对象:
49+
50+- 本地对话表
51+- 对话关联表
52+- 续命任务表
53+
54+这一步只做存储基础,不做自动化状态接口、不做消息投影、不做发送执行。
55+
56+## 涉及仓库
57+
58+- `/Users/george/code/baa-conductor`
59+
60+## 范围
61+
62+- 为 `artifact.db` 增加本地对话、对话关联、续命任务三张表
63+- 为 `packages/artifact-db` 增加对应的读写方法
64+- 为 `packages/d1-client` 增加三张表的同步白名单和远端 D1 schema
65+- 为后续任务预留必要索引、状态字段和查询原语
66+
67+## 路径约束
68+
69+- 新表统一落在 `artifact.db` 体系,不新建第二套本地数据库
70+- 同步能力复用现有 `SyncQueue` / `D1SyncWorker`
71+- 这一步不要引入业务判断逻辑,不要实现 `shouldRenew()`
72+
73+## 推荐实现边界
74+
75+建议优先做:
76+
77+- `packages/artifact-db` 的 schema、types、store 方法
78+- `packages/d1-client` 的 D1 setup 与 sync whitelist
79+
80+## 允许修改的目录
81+
82+- `/Users/george/code/baa-conductor/packages/artifact-db/`
83+- `/Users/george/code/baa-conductor/packages/d1-client/`
84+
85+## 尽量不要修改
86+
87+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
88+- `/Users/george/code/baa-conductor/plugins/`
89+
90+## 必须完成
91+
92+### 1. 本地 schema
93+
94+- 在 `artifact.db` 中增加本地对话表
95+- 在 `artifact.db` 中增加对话关联表
96+- 在 `artifact.db` 中增加续命任务表
97+- 为状态查询、到期任务扫描、对话映射增加必要索引
98+
99+### 2. store 方法
100+
101+- 增加本地对话表的 upsert / read / list 原语
102+- 增加对话关联表的 upsert / read 原语
103+- 增加续命任务表的 insert / list / update 原语
104+- 至少预留后续任务需要的 `next_attempt_at`、目标快照、日志路径字段
105+
106+### 3. D1 同步
107+
108+- 在远端 D1 setup SQL 中镜像新增三张表
109+- 在 `SYNC_COLUMN_WHITELIST` 中放行新增表字段
110+- 确保本地写入能继续通过 `SyncQueue` 入队同步
111+
112+## 需要特别注意
113+
114+- 本地对话身份不能退化成 `platform|conversation_id` 拼接字符串
115+- 本任务只做存储基础,不要顺手实现业务 worker
116+- 新表字段命名要兼顾后续 `manual / auto / paused`、`pending / running / done / failed`
117+- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
118+
119+## 验收标准
120+
121+- `artifact.db` schema 中存在三张新表
122+- `packages/artifact-db` 暴露对应 store 方法
123+- `packages/d1-client` 能识别并同步三张新表
124+- 现有 messages / executions / sessions 链路不被破坏
125+
126+## 推荐验证命令
127+
128+- `cd /Users/george/code/baa-conductor-renewal-storage-foundation && pnpm build`
129+- `cd /Users/george/code/baa-conductor-renewal-storage-foundation && pnpm test`
130+
131+## 执行记录
132+
133+> 以下内容由执行任务的 AI 填写,创建任务时留空。
134+
135+### 开始执行
136+
137+- 执行者:
138+- 开始时间:
139+- 状态变更:`待开始` → `进行中`
140+
141+### 完成摘要
142+
143+- 完成时间:
144+- 状态变更:`进行中` → `已完成`
145+- 修改了哪些文件:
146+- 核心实现思路:
147+- 跑了哪些测试:
148+
149+### 执行过程中遇到的问题
150+
151+-
152+
153+### 剩余风险
154+
155+-
+156,
-0
1@@ -0,0 +1,156 @@
2+# Task T-S056:对话自动化状态与对话关联接口
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`M`
8+- 依赖任务:`T-S055`
9+- 建议执行者:`Claude` 或 `Codex`
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S056.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/plans/discuss/DISCUSS-TIMED-JOBS-RENEWAL-REQUIREMENTS.md`
18+- `/Users/george/code/baa-conductor/tasks/T-S055.md`
19+
20+## 当前基线
21+
22+- 仓库:`/Users/george/code/baa-conductor`
23+- 分支基线:`main`
24+- 提交:`071abbf`
25+
26+## 分支与 worktree(强制)
27+
28+- 分支名:`feat/renewal-automation-control`
29+- worktree 路径:`/Users/george/code/baa-conductor-renewal-automation-control`
30+
31+开工步骤:
32+
33+1. `cd /Users/george/code/baa-conductor`
34+2. `git worktree add ../baa-conductor-renewal-automation-control -b feat/renewal-automation-control main`
35+3. `cd ../baa-conductor-renewal-automation-control`
36+
37+完成后提交与推送:
38+
39+1. 在 worktree 里提交所有变更
40+2. `git push -u origin feat/renewal-automation-control`
41+
42+## 目标
43+
44+让 `conductor` 正式持有对话级自动化状态,并维护本地对话与平台对话、浏览器目标、页面路由之间的关联。
45+
46+## 背景
47+
48+续命规则已经明确由对话自动化状态驱动,而不是由消息本身直接驱动。首版需要正式支持三态:
49+
50+- `manual`
51+- `auto`
52+- `paused`
53+
54+同时,需要一层正式的对话关联关系,承载平台对话和目标路由信息。
55+
56+## 涉及仓库
57+
58+- `/Users/george/code/baa-conductor`
59+
60+## 范围
61+
62+- 定义本地对话状态读写流程
63+- 将观察到的平台对话、client、页面、路由信息写入对话关联表
64+- 提供最小可用的本地 API 读写接口
65+- 不实现消息投影和续命发送
66+
67+## 路径约束
68+
69+- 对话状态必须基于 `local_conversations`,不要回退到拼接 key
70+- API 命名统一收进 `/v1/renewal/` 命名空间
71+- 不要求首版修改 Firefox 插件 UI,只做后端控制面
72+
73+## 推荐实现边界
74+
75+建议优先做:
76+
77+- `apps/conductor-daemon/src/local-api.ts`
78+- `apps/conductor-daemon/src/firefox-ws.ts`
79+- 新建 `apps/conductor-daemon/src/renewal/` 目录承载辅助逻辑
80+
81+## 允许修改的目录
82+
83+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
84+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-ws.ts`
85+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.ts`
86+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/renewal/`
87+- `/Users/george/code/baa-conductor/packages/artifact-db/`
88+
89+## 尽量不要修改
90+
91+- `/Users/george/code/baa-conductor/plugins/`
92+- `/Users/george/code/baa-conductor/packages/d1-client/`
93+
94+## 必须完成
95+
96+### 1. 对话状态模型
97+
98+- 支持 `manual / auto / paused`
99+- 能按本地对话 ID 读取和更新状态
100+- 为后续插件面板和 `baa` 指令系统共用同一份后端状态
101+
102+### 2. 对话关联关系
103+
104+- 将平台对话 ID 与本地对话 ID 建立关联
105+- 将 client、页面 URL、页面标题、目标路由快照写入对话关联表
106+- 新消息到达时能解析并落到正确的本地对话
107+
108+### 3. 本地 API
109+
110+- 增加对话状态读取接口
111+- 增加 `manual / auto / paused` 的写接口
112+- 增加最小可用的对话关联查询接口,方便后续排障
113+
114+## 需要特别注意
115+
116+- `paused` 不是删除或禁用对话,只是暂停自动化
117+- 这一步不要实现 projector 或 dispatcher
118+- 尽量把读写逻辑收敛到 `renewal/` 辅助模块,不要把状态机细节散落到 `local-api.ts`
119+- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
120+
121+## 验收标准
122+
123+- 可以创建或解析本地对话记录
124+- 可以把本地对话状态切到 `manual / auto / paused`
125+- 可以通过 API 读取当前状态和关联目标信息
126+- 新增逻辑不破坏现有 `browser.final_message` 主链路
127+
128+## 推荐验证命令
129+
130+- `cd /Users/george/code/baa-conductor-renewal-automation-control && pnpm build`
131+- `cd /Users/george/code/baa-conductor-renewal-automation-control && pnpm -C apps/conductor-daemon test`
132+
133+## 执行记录
134+
135+> 以下内容由执行任务的 AI 填写,创建任务时留空。
136+
137+### 开始执行
138+
139+- 执行者:
140+- 开始时间:
141+- 状态变更:`待开始` → `进行中`
142+
143+### 完成摘要
144+
145+- 完成时间:
146+- 状态变更:`进行中` → `已完成`
147+- 修改了哪些文件:
148+- 核心实现思路:
149+- 跑了哪些测试:
150+
151+### 执行过程中遇到的问题
152+
153+-
154+
155+### 剩余风险
156+
157+-
+149,
-0
1@@ -0,0 +1,149 @@
2+# Task T-S057:定时任务框架与执行日志
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`M`
8+- 依赖任务:`T-S055`
9+- 建议执行者:`Codex`
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S057.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/plans/discuss/DISCUSS-TIMED-JOBS-RENEWAL-REQUIREMENTS.md`
18+- `/Users/george/code/baa-conductor/tasks/T-S055.md`
19+
20+## 当前基线
21+
22+- 仓库:`/Users/george/code/baa-conductor`
23+- 分支基线:`main`
24+- 提交:`071abbf`
25+
26+## 分支与 worktree(强制)
27+
28+- 分支名:`feat/timed-jobs-framework`
29+- worktree 路径:`/Users/george/code/baa-conductor-timed-jobs-framework`
30+
31+开工步骤:
32+
33+1. `cd /Users/george/code/baa-conductor`
34+2. `git worktree add ../baa-conductor-timed-jobs-framework -b feat/timed-jobs-framework main`
35+3. `cd ../baa-conductor-timed-jobs-framework`
36+
37+完成后提交与推送:
38+
39+1. 在 worktree 里提交所有变更
40+2. `git push -u origin feat/timed-jobs-framework`
41+
42+## 目标
43+
44+为续命系统建立独立的定时任务框架,提供 leader-only 周期调度、批量扫描配置和统一外部日志写入能力。
45+
46+## 背景
47+
48+当前 `ConductorDaemon` 有 lease / heartbeat loop,但没有正式的后台定时任务模块。续命实现已经明确不直接复用现有 `tasks/runs`,而是要有一个轻量的 timed-jobs 模块。
49+
50+## 涉及仓库
51+
52+- `/Users/george/code/baa-conductor`
53+
54+## 范围
55+
56+- 新建 timed-jobs 模块
57+- 接入 leader-only 调度
58+- 支持可配置扫描周期、批量限制、settle delay
59+- 为后续 projector / dispatcher 提供共享日志能力
60+
61+## 路径约束
62+
63+- 这一步不实现具体业务扫描逻辑,只搭框架和日志基建
64+- 尽量将新代码放在独立目录,不要把 loop 逻辑散落到 `index.ts`
65+- 执行日志必须写外部文件,不只打 stderr
66+
67+## 推荐实现边界
68+
69+建议优先做:
70+
71+- 新建 `apps/conductor-daemon/src/timed-jobs/`
72+- `apps/conductor-daemon/src/index.ts` 只做最小接线
73+
74+## 允许修改的目录
75+
76+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.ts`
77+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/timed-jobs/`
78+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
79+
80+## 尽量不要修改
81+
82+- `/Users/george/code/baa-conductor/packages/`
83+- `/Users/george/code/baa-conductor/plugins/`
84+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
85+
86+## 必须完成
87+
88+### 1. timed-jobs 框架
89+
90+- 提供独立模块来注册和执行后台定时任务
91+- 只允许 leader 节点执行周期扫描
92+- 支持统一 tick 上下文和 runner 命名
93+
94+### 2. 配置项
95+
96+- 支持扫描周期可配置
97+- 支持每轮最大消息数、最大任务数可配置
98+- 支持消息 settle delay 可配置
99+- 默认值对齐当前讨论稿:周期 `5-10 秒`、每轮约 `10` 条
100+
101+### 3. 外部日志
102+
103+- 定时任务执行过程写入外部 JSONL 日志
104+- 至少记录时间、runner、批次标识、阶段、结果、耗时、错误
105+- 日志目录在 conductor 启动时创建
106+
107+## 需要特别注意
108+
109+- 这一步不要把 projector / dispatcher 业务规则写死
110+- 日志写入失败不能影响主流程
111+- loop 需要有 start/stop 生命周期,不能泄漏定时器
112+- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
113+
114+## 验收标准
115+
116+- conductor 启动后 timed-jobs 框架可初始化
117+- standby 节点不会执行 runner
118+- 能生成外部 JSONL 日志文件
119+- 后续任务可以在这个框架上挂 projector / dispatcher
120+
121+## 推荐验证命令
122+
123+- `cd /Users/george/code/baa-conductor-timed-jobs-framework && pnpm build`
124+- `cd /Users/george/code/baa-conductor-timed-jobs-framework && pnpm -C apps/conductor-daemon test`
125+
126+## 执行记录
127+
128+> 以下内容由执行任务的 AI 填写,创建任务时留空。
129+
130+### 开始执行
131+
132+- 执行者:
133+- 开始时间:
134+- 状态变更:`待开始` → `进行中`
135+
136+### 完成摘要
137+
138+- 完成时间:
139+- 状态变更:`进行中` → `已完成`
140+- 修改了哪些文件:
141+- 核心实现思路:
142+- 跑了哪些测试:
143+
144+### 执行过程中遇到的问题
145+
146+-
147+
148+### 剩余风险
149+
150+-
+154,
-0
1@@ -0,0 +1,154 @@
2+# Task T-S058:消息同步任务生成续命任务
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`M`
8+- 依赖任务:`T-S055`、`T-S056`、`T-S057`
9+- 建议执行者:`Codex` 或 `Claude`
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S058.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/plans/discuss/DISCUSS-TIMED-JOBS-RENEWAL-REQUIREMENTS.md`
18+- `/Users/george/code/baa-conductor/tasks/T-S055.md`
19+- `/Users/george/code/baa-conductor/tasks/T-S056.md`
20+- `/Users/george/code/baa-conductor/tasks/T-S057.md`
21+
22+## 当前基线
23+
24+- 仓库:`/Users/george/code/baa-conductor`
25+- 分支基线:`main`
26+- 提交:`071abbf`
27+
28+## 分支与 worktree(强制)
29+
30+- 分支名:`feat/renewal-message-projector`
31+- worktree 路径:`/Users/george/code/baa-conductor-renewal-message-projector`
32+
33+开工步骤:
34+
35+1. `cd /Users/george/code/baa-conductor`
36+2. `git worktree add ../baa-conductor-renewal-message-projector -b feat/renewal-message-projector main`
37+3. `cd ../baa-conductor-renewal-message-projector`
38+
39+完成后提交与推送:
40+
41+1. 在 worktree 里提交所有变更
42+2. `git push -u origin feat/renewal-message-projector`
43+
44+## 目标
45+
46+实现“消息同步任务”:定时扫描旧消息,按照对话自动化状态和可用路由规则,生成续命任务。
47+
48+## 背景
49+
50+当前共识已经排除了“在 ingest 末尾直接发续命”的做法。首版需要一个独立的 projector,把消息事实和续命执行解耦开。
51+
52+## 涉及仓库
53+
54+- `/Users/george/code/baa-conductor`
55+
56+## 范围
57+
58+- 实现消息扫描与游标推进
59+- 实现 `shouldRenew()` 和 payload 构建
60+- 将满足条件的消息幂等投影到 `renewal_jobs`
61+- 不实现实际发送
62+
63+## 路径约束
64+
65+- 不要把 projector 做成“消息到达即同步”的直接 hook
66+- 必须通过 timed-jobs 框架运行
67+- 必须遵守小批量和 settle delay 约束
68+
69+## 推荐实现边界
70+
71+建议优先做:
72+
73+- `apps/conductor-daemon/src/timed-jobs/`
74+- `apps/conductor-daemon/src/renewal/`
75+- 必要时最小改动 `apps/conductor-daemon/src/instructions/ingest.ts` 以补齐消息元数据
76+
77+## 允许修改的目录
78+
79+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/timed-jobs/`
80+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/renewal/`
81+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
82+- `/Users/george/code/baa-conductor/packages/artifact-db/`
83+
84+## 尽量不要修改
85+
86+- `/Users/george/code/baa-conductor/plugins/`
87+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
88+
89+## 必须完成
90+
91+### 1. 消息扫描
92+
93+- 只扫描“旧消息”
94+- 每轮最多处理约 `10` 条
95+- 支持可配置 settle delay
96+- 支持游标或等价机制,避免重复全表扫描
97+
98+### 2. 续命判断
99+
100+- 以对话状态 `manual / auto / paused` 为判断核心
101+- 检查冷却时间
102+- 检查重复消息
103+- 检查当前目标路由是否可用
104+
105+### 3. 任务生成
106+
107+- 生成 `renewal_jobs`
108+- 幂等,不为同一条消息重复生成任务
109+- 写 projector 外部日志
110+- 不执行发送
111+
112+## 需要特别注意
113+
114+- `paused` 和 `manual` 不应生成新任务
115+- payload 构建不要写死成未来无法扩展的格式
116+- 尽量把规则收敛成独立函数,避免散落在 runner 代码里
117+- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
118+
119+## 验收标准
120+
121+- auto 对话的新旧消息能生成 `pending` 续命任务
122+- manual / paused 对话不会生成续命任务
123+- 同一消息重复扫描不会生成重复任务
124+- projector 执行过程会写外部日志
125+
126+## 推荐验证命令
127+
128+- `cd /Users/george/code/baa-conductor-renewal-message-projector && pnpm build`
129+- `cd /Users/george/code/baa-conductor-renewal-message-projector && pnpm -C apps/conductor-daemon test`
130+
131+## 执行记录
132+
133+> 以下内容由执行任务的 AI 填写,创建任务时留空。
134+
135+### 开始执行
136+
137+- 执行者:
138+- 开始时间:
139+- 状态变更:`待开始` → `进行中`
140+
141+### 完成摘要
142+
143+- 完成时间:
144+- 状态变更:`进行中` → `已完成`
145+- 修改了哪些文件:
146+- 核心实现思路:
147+- 跑了哪些测试:
148+
149+### 执行过程中遇到的问题
150+
151+-
152+
153+### 剩余风险
154+
155+-
+159,
-0
1@@ -0,0 +1,159 @@
2+# Task T-S059:续命执行任务与运维接口
3+
4+## 状态
5+
6+- 当前状态:`待开始`
7+- 规模预估:`M`
8+- 依赖任务:`T-S055`、`T-S056`、`T-S057`、`T-S058`
9+- 建议执行者:`Codex`
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S059.md` 任务文档,完成开发任务。
14+
15+如需补背景,再读:
16+
17+- `/Users/george/code/baa-conductor/plans/discuss/DISCUSS-TIMED-JOBS-RENEWAL-REQUIREMENTS.md`
18+- `/Users/george/code/baa-conductor/tasks/T-S058.md`
19+
20+## 当前基线
21+
22+- 仓库:`/Users/george/code/baa-conductor`
23+- 分支基线:`main`
24+- 提交:`071abbf`
25+
26+## 分支与 worktree(强制)
27+
28+- 分支名:`feat/renewal-dispatcher-ops`
29+- worktree 路径:`/Users/george/code/baa-conductor-renewal-dispatcher-ops`
30+
31+开工步骤:
32+
33+1. `cd /Users/george/code/baa-conductor`
34+2. `git worktree add ../baa-conductor-renewal-dispatcher-ops -b feat/renewal-dispatcher-ops main`
35+3. `cd ../baa-conductor-renewal-dispatcher-ops`
36+
37+完成后提交与推送:
38+
39+1. 在 worktree 里提交所有变更
40+2. `git push -u origin feat/renewal-dispatcher-ops`
41+
42+## 目标
43+
44+实现“续命执行任务”:扫描待执行续命任务,通过浏览器 API 代理发送,并补齐最小运维读接口。
45+
46+## 背景
47+
48+在消息已经投影为 `renewal_jobs` 之后,还需要独立 dispatcher 完成:
49+
50+- 扫描到期任务
51+- 执行发送
52+- 更新状态
53+- 写外部日志
54+- 提供最小可排障的读接口
55+
56+## 涉及仓库
57+
58+- `/Users/george/code/baa-conductor`
59+
60+## 范围
61+
62+- 实现 dispatcher runner
63+- 调用现有浏览器 API 代理发送
64+- 实现超时、重试、退避和最终失败
65+- 提供最小查询接口查看对话和续命任务状态
66+
67+## 路径约束
68+
69+- 首版只走 API 代理,不做 GUI / a11y
70+- 不直接复用现有 `tasks/runs`
71+- 仍然通过 timed-jobs 框架运行
72+
73+## 推荐实现边界
74+
75+建议优先做:
76+
77+- `apps/conductor-daemon/src/timed-jobs/`
78+- `apps/conductor-daemon/src/renewal/`
79+- `apps/conductor-daemon/src/local-api.ts`
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/renewal/`
85+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
86+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.ts`
87+- `/Users/george/code/baa-conductor/packages/artifact-db/`
88+
89+## 尽量不要修改
90+
91+- `/Users/george/code/baa-conductor/plugins/`
92+- `/Users/george/code/baa-conductor/packages/d1-client/`
93+
94+## 必须完成
95+
96+### 1. dispatcher
97+
98+- 扫描 `next_attempt_at <= now` 的到期任务
99+- 每轮最多处理约 `10` 个任务
100+- 调现有浏览器 API 代理发送
101+- 成功推进到 `done`
102+
103+### 2. 超时与重试
104+
105+- 单次执行有内部超时
106+- 失败后更新 `attempt_count`
107+- 失败后写 `next_attempt_at`
108+- 超过限制后进入 `failed`
109+
110+### 3. 运维接口与日志
111+
112+- 提供最小续命任务查询接口
113+- 提供最小对话自动化状态查询接口
114+- dispatcher 全流程写外部日志
115+
116+## 需要特别注意
117+
118+- `paused` 对话不应继续推进待执行任务
119+- 执行中的任务允许自然结束,不要求强制中断
120+- 发送接口应尽量复用现有内部 service,不要通过 HTTP 自己调自己
121+- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
122+
123+## 验收标准
124+
125+- `pending` 任务可以被 dispatcher 扫到并发送
126+- 成功任务进入 `done`
127+- 失败任务能重试并最终进入 `failed`
128+- dispatcher 执行过程会写外部日志
129+- 可以通过本地 API 读取任务和对话状态
130+
131+## 推荐验证命令
132+
133+- `cd /Users/george/code/baa-conductor-renewal-dispatcher-ops && pnpm build`
134+- `cd /Users/george/code/baa-conductor-renewal-dispatcher-ops && pnpm -C apps/conductor-daemon test`
135+
136+## 执行记录
137+
138+> 以下内容由执行任务的 AI 填写,创建任务时留空。
139+
140+### 开始执行
141+
142+- 执行者:
143+- 开始时间:
144+- 状态变更:`待开始` → `进行中`
145+
146+### 完成摘要
147+
148+- 完成时间:
149+- 状态变更:`进行中` → `已完成`
150+- 修改了哪些文件:
151+- 核心实现思路:
152+- 跑了哪些测试:
153+
154+### 执行过程中遇到的问题
155+
156+-
157+
158+### 剩余风险
159+
160+-
+22,
-11
1@@ -2,8 +2,8 @@
2
3 ## 当前基线
4
5-- 日期:`2026-03-29`
6-- 主分支基线:`main@4663817`
7+- 日期:`2026-03-30`
8+- 主分支基线:`main@071abbf`
9 - canonical local API:`http://100.71.210.78:4317`
10 - canonical public host:`https://conductor.makefile.so`
11 - 当前活跃任务卡保留在本目录;已完成任务卡已归档到 [`./archive/README.md`](./archive/README.md)
12@@ -49,17 +49,26 @@
13
14 | 任务 | 标题 | 规模 | 依赖 | 建议 AI | 状态 |
15 |---|---|---|---|---|---|
16-| [`T-S048`](./T-S048.md) | Gemini 投递适配器 | M | 无 | Claude | 待开始 |
17-| [`T-S051`](./T-S051.md) | 代码文件直读映射 | S | 无 | Codex / Claude | 待开始 |
18-| [`T-S049`](./T-S049.md) | 开放 chatgpt/gemini target | S | T-S048 | Codex / Claude | 待开始 |
19+| [`T-S055`](./T-S055.md) | 续命基础存储层 | M | 无 | Codex | 待开始 |
20+| [`T-S056`](./T-S056.md) | 对话自动化状态与对话关联接口 | M | T-S055 | Claude / Codex | 待开始 |
21+| [`T-S057`](./T-S057.md) | 定时任务框架与执行日志 | M | T-S055 | Codex | 待开始 |
22+| [`T-S058`](./T-S058.md) | 消息同步任务生成续命任务 | M | T-S055, T-S056, T-S057 | Claude / Codex | 待开始 |
23+| [`T-S059`](./T-S059.md) | 续命执行任务与运维接口 | M | T-S055, T-S056, T-S057, T-S058 | Codex | 待开始 |
24
25 建议顺序:
26
27 ```text
28-T-S048 (Gemini 适配器) -> T-S049 (开放 target)
29-T-S051 (代码直读) <- 可并行
30+T-S055 -> (T-S056 || T-S057) -> T-S058 -> T-S059
31 ```
32
33+### 暂时后移的 backlog 与参考
34+
35+| 任务 | 标题 | 说明 |
36+|---|---|---|
37+| [`T-S048`](./T-S048.md) | Gemini 投递适配器 | 仍保留,但暂让位于续命/定时任务主线 |
38+| [`T-S049`](./T-S049.md) | 开放 chatgpt/gemini target | 依赖 T-S048,暂后移 |
39+| [`T-S051`](./T-S051.md) | 代码文件直读映射 | 已完成,保留为后续实现参考 |
40+
41 ### 已完成
42
43 | 任务 | 标题 | 状态 |
44@@ -133,11 +142,13 @@ T-S051 (代码直读) <- 可并行
45
46 ## 当前主线判断
47
48-Phase 1(浏览器主链)和 Artifact 静态服务都已完成收口。当前下一波重点是:
49+Phase 1(浏览器主链)和 Artifact 静态服务都已完成收口。当前主线已切到“定时任务 + 续命”实现,下一波重点是:
50
51-- `T-S048`:补 Gemini 投递适配器
52-- `T-S051`:补 `/code/` 代码文件直读
53-- `T-S049`:在 `T-S048` 完成后正式开放 `@browser.chatgpt` / `@browser.gemini` target
54+- `T-S055`:补续命基础存储层
55+- `T-S056`:补对话自动化状态与对话关联接口
56+- `T-S057`:补独立 timed-jobs 框架与执行日志
57+- `T-S058`:补消息投影到续命任务
58+- `T-S059`:补续命执行任务与最小运维接口
59 - 并行关注 open bug `BUG-026` / `BUG-027`
60
61 并行推进 `OPT-002`(executor 超时保护)。