im_wower
·
2026-03-28
T-S033.md
1# Task T-S033:补 BAA dedupe 与 execution journal 持久化
2
3## 直接给对话的提示词
4
5读 `/Users/george/code/baa-conductor/tasks/archive/T-S033.md` 任务文档,完成开发任务。
6
7如需补背景,再读:
8
9- `/Users/george/code/baa-conductor/plans/archive/BAA_EXECUTION_PERSISTENCE_REQUIREMENTS.md`
10- `/Users/george/code/baa-conductor/plans/archive/BAA_FINAL_MESSAGE_INGEST_REQUIREMENTS.md`
11- `/Users/george/code/baa-conductor/plans/archive/BAA_INSTRUCTION_CENTER_REQUIREMENTS.md`
12- `/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/04-execution-loop-state-machine.md`
13
14## 当前基线
15
16- 仓库:`/Users/george/code/baa-conductor`
17- 分支:`main`
18- 提交:`5cdeb5d`
19- 开工要求:如需新分支,从当前 `main` 新切
20
21## 建议分支名
22
23- `feat/baa-execution-persistence`
24
25## 目标
26
27把 live message dedupe、instruction dedupe 和最近执行摘要从进程内内存态补成单节点可恢复的持久化状态。
28
29## 背景
30
31`T-S031` 已经打通 live ingest,但当前仍有两个实际风险:
32
33- dedupe 重启后丢失
34- 最近摘要只保留最近一次,不落库
35
36如果不补这层,系统重启后会重复执行已处理过的 final message,诊断面也不完整。
37
38## 涉及仓库
39
40- `/Users/george/code/baa-conductor`
41
42## 范围
43
44- live message dedupe 持久化
45- instruction dedupe 持久化
46- execution / ingest journal 持久化
47- `/v1/browser` 最近摘要历史读面
48- 自动化测试与文档回写
49
50## 路径约束
51
52- 首版只做单节点持久化
53- 不要在这张卡里顺手做 artifact upload / inject / send
54- 不要把这张卡扩成 task/run 系统
55
56## 推荐实现边界
57
58建议新增:
59
60- `apps/conductor-daemon/src/instructions/store.ts` 或等价持久化封装
61- 最近摘要历史结构与读面适配
62
63建议放到:
64
65- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
66- `/Users/george/code/baa-conductor/packages/db/`
67
68## 允许修改的目录
69
70- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
71- `/Users/george/code/baa-conductor/packages/db/`
72- `/Users/george/code/baa-conductor/tasks/`
73- `/Users/george/code/baa-conductor/plans/`
74- `/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/`
75
76## 尽量不要修改
77
78- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
79- `/Users/george/code/baa-conductor/tests/browser/`
80- `/Users/george/code/baa-conductor/apps/status-api/`
81
82## 必须完成
83
84### 1. 持久化 dedupe 状态
85
86- live message dedupe 重启后仍能生效
87- instruction dedupe 重启后仍能生效
88
89### 2. 持久化 execution journal
90
91- ingest / execute 摘要不再只保留最后一次
92- 重启后仍能读取最近若干条摘要
93
94### 3. 补回归测试和读面
95
96- 至少补重启后不重复执行的测试
97- `/v1/browser` 或等价读面要能读最近历史
98
99## 需要特别注意
100
101- 不要把 journal 做成无限增长的无边界存储
102- 不要为了持久化改掉当前 Phase 1 exact target 规则
103- 和 `T-S034` 并行时,不要去实现 upload / inject / send
104
105## 验收标准
106
107- 重启后同一条已处理 final message 不会再次执行
108- 最近摘要历史重启后仍可读
109- `git diff --check` 通过
110
111## 评测要求
112
113### 1. 正向评测
114
115- 执行过一次的 final message 在重启后仍被识别为 duplicate
116- 最近若干条 ingest / execute 摘要可正常读取
117
118### 2. 反向评测
119
120- 新消息不能被错误判成历史 duplicate
121- journal 读面不能把空记录误报成成功执行
122
123### 3. 边界评测
124
125- 缺少 `conversation_id` 的消息身份仍能持久化去重
126- journal 条数达到上限时不能崩,且淘汰顺序稳定
127
128## 推荐验证命令
129
130- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
131- `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
132- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
133- `git -C /Users/george/code/baa-conductor diff --check`
134
135## 交付要求
136
137完成后请说明:
138
139- 修改了哪些文件
140- dedupe 和 journal 是怎么持久化的
141- 最近历史读面放在了哪里
142- 跑了哪些测试
143- 还有哪些剩余风险
144
145## 完成记录(2026-03-27)
146
147- 已完成:
148 - 新增 control-plane sqlite 持久化表:
149 - `baa_message_dedupes`
150 - `baa_instruction_dedupes`
151 - `baa_execution_journal`
152 - live message dedupe 与 instruction dedupe 都已改为 repo-backed 持久化
153 - ingest / execute 摘要已写入 bounded journal,并在 daemon 启动时恢复
154 - `GET /v1/browser` 与 Firefox WS `state_snapshot.snapshot.browser.instruction_ingest` 已暴露:
155 - `last_ingest`
156 - `last_execute`
157 - `recent_ingests`
158 - `recent_executes`
159 - automated test 已覆盖:
160 - 重启后 final message 仍判定为 duplicate
161 - `/v1/browser` 重启后可读最近历史
162 - bounded prune 顺序稳定
163
164- 当前残余风险:
165 - dedupe 与 journal 仍是单节点本地持久化,不做跨节点共享
166 - journal 采用固定上限淘汰,只保留最近窗口
167 - 当前 live 执行路径仍只覆盖 Phase 1 exact target,未扩展到 upload / inject / send 编排