baa-conductor

git clone 

baa-conductor / tasks
im_wower  ·  2026-03-28

T-S040.md

  1# Task T-S040:Artifact 接入指令执行主链路
  2
  3## 状态
  4
  5- 当前状态:`待开始`
  6- 规模预估:`M`
  7- 依赖任务:`T-S039`
  8- 建议执行者:`Claude`(需要深入理解 ingest → executor → delivery 现有链路,在多个文件中精确插入逻辑)
  9
 10## 直接给对话的提示词
 11
 12`/Users/george/code/baa-conductor/tasks/T-S040.md` 任务文档,完成开发任务。
 13
 14如需补背景,再读:
 15
 16- `/Users/george/code/baa-conductor/plans/ARTIFACT_STATIC_SERVICE.md`
 17
 18## 当前基线
 19
 20- 仓库:`/Users/george/code/baa-conductor`
 21- 分支基线:`main`(T-S039 合并后)
 22- 提交:`<T-S039 合并后的提交>`
 23
 24## 分支与 worktree(强制)
 25
 26每个任务必须使用独立的分支和 worktree,禁止直接在 main 上修改,禁止多个任务共用同一个 worktree。
 27
 28- 分支名:`feat/artifact-pipeline`
 29- worktree 路径:`/Users/george/code/baa-conductor-artifact-pipeline`
 30
 31开工步骤:
 32
 331. `cd /Users/george/code/baa-conductor`
 342. `git worktree add ../baa-conductor-artifact-pipeline -b feat/artifact-pipeline main`
 353. `cd ../baa-conductor-artifact-pipeline`
 364. 在这个 worktree 目录里开发,不要回到主仓库目录
 37
 38完成后提交与推送(由执行者完成,不要合并):
 39
 401. 在 worktree 里提交所有变更(包括更新后的任务文档)
 412. `git push -u origin feat/artifact-pipeline`
 42
 43合并冲突处理:
 44
 451. 如果 `git merge` 报冲突,先 `git diff` 查看冲突文件
 462. 手动解决冲突后 `git add` 冲突文件
 473. `git merge --continue` 完成合并
 484. 不要用 `git merge --abort` 然后 force 覆盖
 49
 50## 目标
 51
 52将 artifact 数据库和静态文件生成接入 BAA 指令执行主链路:browser.final_message 到达时写入 messages 表,指令执行完成时写入 executions 表,回送 AI 时超长结果截断并附带 artifact URL。
 53
 54## 背景
 55
 56T-S039 建好了数据库和静态文件生成能力,但还没有接入实际的消息和指令流水线。本任务把这些能力串进 ingest → executor → delivery 主链路,让每条消息和每次执行都自动入库并生成可访问的 URL。
 57
 58## 涉及仓库
 59
 60- `/Users/george/code/baa-conductor`
 61
 62## 范围
 63
 64- ingest 收到 browser.final_message 时写入 messages 表 + 生成静态文件
 65- executor 执行完成后写入 executions 表 + 生成静态文件
 66- delivery 回送时:短结果内联全文 + URL,长结果截断前 500 字符 + URL
 67- 阈值和摘要长度可配置
 68- session 索引在写入时自动更新
 69
 70## 允许修改的目录
 71
 72- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/` (ingest, executor, loop)
 73- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/artifacts/` (upload-session, delivery)
 74- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.ts` (注入 artifact store)
 75- `/Users/george/code/baa-conductor/packages/artifact-db/` (如需补方法)
 76
 77## 尽量不要修改
 78
 79- `/Users/george/code/baa-conductor/packages/db/` (现有数据库不动)
 80- `/Users/george/code/baa-conductor/plugins/` (插件不动)
 81- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts` (T-S039 已加路由)
 82- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-ws.ts` (尽量不动 WS 层)
 83
 84## 必须完成
 85
 86### 1. ingest 写入 messages 表
 87
 88- `browser.final_message` 到达 → 调用 `artifactStore.insertMessage()`
 89- 全量保存 raw_text(永不截断)
 90- 自动生成 summary(取前 500 字符)
 91- 自动生成静态文件
 92- 不阻塞现有 ingest 流程,写入失败只 log 不中断
 93
 94### 2. executor 写入 executions 表
 95
 96- 指令执行完成 → 调用 `artifactStore.insertExecution()`
 97- 全量保存 result_data(永不截断)
 98- 自动生成 result_summary
 99- 自动生成静态文件
100- 不阻塞现有执行流程,写入失败只 log 不中断
101
102### 3. 回送截断 + URL 拼接
103
104- 配置项:`inlineThreshold`(默认 2000 字符)、`summaryLength`(默认 500 字符)
105- 结果 ≤ 阈值:内联全文 + 末尾附 artifact URL
106- 结果 > 阈值:前 N 字符 + `\n\n完整结果:{artifact_url}`
107- URL 格式:`https://conductor.makefile.so/artifact/exec/{id}.txt`
108- 配置通过环境变量或 conductor config 注入
109
110### 4. session 索引自动更新
111
112- 每次写入 message 或 execution 时,自动 upsert 对应 session
113- session 按 (platform, conversation_id) 去重
114- 更新 last_activity_at、message_count、execution_count
115- 生成 `state/artifacts/session/latest.txt`(最近 20 个活跃 session)
116
117## 需要特别注意
118
119- 写入 artifact 数据库和生成静态文件不能阻塞指令执行主链路
120- 如果 artifact 写入失败(磁盘满、权限问题),只 log 错误,不影响正常执行和 delivery
121- 截断阈值和摘要长度必须可配置
122- 回送给 AI 的 URL 必须是 exact URL(完整路径),不能让 AI 自己拼
123- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
124
125## 验收标准
126
127- AI 发送含 baa 指令的消息 → messages 表有记录 + 静态文件存在
128- 指令执行完成 → executions 表有记录 + 静态文件存在
129- 短结果(< 2000 字符回送时包含完整内容 + artifact URL
130- 长结果> 2000 字符)回送时只有前 500 字符 + artifact URL
131- `curl https://conductor.makefile.so/artifact/exec/{id}.txt` 返回完整执行结果
132- sessions 表自动更新,`latest.txt` 包含最近活跃会话
133- artifact 写入失败时不影响正常指令执行
134
135## 推荐验证命令
136
137- `cd /Users/george/code/baa-conductor-artifact-pipeline && pnpm build`
138- `cd /Users/george/code/baa-conductor-artifact-pipeline && pnpm test`
139- 实际跑一轮 BAA 指令闭环,检查 `state/artifacts/` 目录下是否生成了文件
140- `curl https://conductor.makefile.so/artifact/session/latest.txt`
141
142## 执行记录
143
144> 以下内容由执行任务的 AI 填写,创建任务时留空。
145
146### 开始执行
147
148- 执行者:`Codex`
149- 开始时间:`2026-03-28 17:35:00 +0800`
150- 状态变更:`待开始` → `进行中`
151
152### 完成摘要
153
154- 完成时间:`2026-03-28 18:27:35 +0800`
155- 状态变更:`进行中` → `已完成`
156- 修改了哪些文件:
157  - `packages/artifact-db/src/store.ts`
158  - `packages/artifact-db/src/index.test.js`
159  - `apps/conductor-daemon/src/instructions/ingest.ts`
160  - `apps/conductor-daemon/src/instructions/executor.ts`
161  - `apps/conductor-daemon/src/instructions/types.ts`
162  - `apps/conductor-daemon/src/artifacts/upload-session.ts`
163  - `apps/conductor-daemon/src/firefox-ws.ts`
164  - `apps/conductor-daemon/src/index.ts`
165  - `apps/conductor-daemon/src/artifacts.test.js`
166  - `apps/conductor-daemon/src/index.test.js`
167  - `tasks/T-S040.md`
168- 核心实现思路:
169  -`ArtifactStore` 内部把 `insertMessage()` / `insertExecution()` 扩展为自动维护 session 记录、timeline 静态文件和 `session/latest.txt`,避免上层链路重复拼 session 逻辑。
170  - `browser.final_message` 进入 ingest 时先 best-effort 写入 messages 表与静态文件,失败只记录日志;指令执行结束后在 executor 中写入 executions 表,并把 artifact URL / 完整结果文本挂回执行结果。
171  - delivery 渲染从“按行截断”改为“按字符阈值 + exact URL”:短结果内联全文并附 URL,长结果截断前 `summaryLength` 字符并附 `完整结果:{url}`;阈值通过 conductor config / 环境变量注入。
172- 跑了哪些测试:
173  - `pnpm -C /Users/george/code/baa-conductor-artifact-pipeline -F @baa-conductor/artifact-db test`
174  - `pnpm -C /Users/george/code/baa-conductor-artifact-pipeline -F @baa-conductor/conductor-daemon test`
175
176### 执行过程中遇到的问题
177
178> 记录执行过程中遇到的阻塞、环境问题、临时绕过方案等。合并时由合并者判断是否需要修复或建新任务。
179
180### 剩余风险
181
182- artifact URL 依赖 `publicApiBase` / `BAA_CONDUCTOR_PUBLIC_API_BASE` 配置正确;如果公网域名或反代未同步,AI 能拿到 URL,但外部访问仍会失败。