baa-conductor


baa-conductor / tasks / archive
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 编排