baa-conductor

git clone 

commit
6ea34e2
parent
3c85eaf
author
im_wower
date
2026-03-28 17:36:32 +0800 CST
docs: add artifact static service plan, update task template and progress

- Add ARTIFACT_STATIC_SERVICE.md: complete design for persisting messages
  and execution results to SQLite/D1 with static URL generation
- Update task template: enforce worktree isolation, add lifecycle tracking
  (status, executor, timestamps, summary, risks)
- Update STATUS_SUMMARY: next milestone is artifact static service
- Update TASK_OVERVIEW: P0 is artifact service, close OPT-006
- Update BAA_INSTRUCTION_ROADMAP: reference artifact service as next phase
- Close OPT-006: data never expires, no auto-cleanup needed
- Archive OPT-006 to bugs/archive/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7 files changed,  +560, -52
M bugs/README.md
+1, -1
 1@@ -17,7 +17,6 @@ bugs/
 2 - `OPT-003`:[`OPT-003-policy-configurable.md`](./OPT-003-policy-configurable.md)
 3 - `OPT-004`:[`OPT-004-final-message-claude-sse-fallback.md`](./OPT-004-final-message-claude-sse-fallback.md)
 4 - `OPT-005`:[`OPT-005-normalize-parse-error-isolation.md`](./OPT-005-normalize-parse-error-isolation.md)
 5-- `OPT-006`:[`OPT-006-db-table-auto-cleanup.md`](./OPT-006-db-table-auto-cleanup.md)
 6 
 7 ## 已归档(archive/)
 8 
 9@@ -45,6 +44,7 @@ bugs/
10 | MISSING-002 | FIXED | 插件侧 delivery plan 执行器已落地 |
11 | MISSING-003 | FIXED | Phase 1 已补齐 browser.claude target |
12 | OPT-001 | — | action_result 命名风格等代码质量建议 |
13+| OPT-006 | CLOSED | 已关闭:新方案(Artifact 静态服务)决定数据永不过期,不需要自动清理 |
14 
15 详细的代码核对结论和剩余风险说明见 `archive/` 下的 `BUG-*`、`FIX-BUG-*`、`MISSING-*` 和 `OPT-*` 文档。
16 
R bugs/OPT-006-db-table-auto-cleanup.md => bugs/archive/OPT-006-db-table-auto-cleanup.md
+0, -0
A plans/ARTIFACT_STATIC_SERVICE.md
+390, -0
  1@@ -0,0 +1,390 @@
  2+# Artifact 静态服务方案
  3+
  4+日期:`2026-03-28`
  5+
  6+## 状态
  7+
  8+- `设计中`
  9+- 依赖当前主分支:`main`
 10+- canonical local API:`http://100.71.210.78:4317`
 11+- canonical public host:`https://conductor.makefile.so`
 12+
 13+## 关联文档
 14+
 15+- [`./STATUS_SUMMARY.md`](./STATUS_SUMMARY.md)
 16+- [`./BAA_INSTRUCTION_SYSTEM.md`](./BAA_INSTRUCTION_SYSTEM.md)
 17+
 18+## 1. 背景与动机
 19+
 20+当前 BAA 指令闭环中,执行结果只能通过文本回送给 AI 对话。存在三个问题:
 21+
 22+1. **大结果截断**:超长输出(如测试日志、文件内容)只能截断回送,AI 看不到完整结果
 23+2. **文件传输不可行**:通过浏览器扩展注入文件到 AI 对话,链路复杂且脆弱
 24+3. **跨会话断裂**:新对话无法获取之前的执行历史和消息记录
 25+
 26+## 2. 核心思路
 27+
 28+把所有消息和执行结果持久化到数据库,同时生成可通过 HTTP GET 直接访问的静态文件。AI 通过 fetch URL 获取完整内容,不需要浏览器扩展参与。
 29+
 30+```
 31+AI 回复 → conductor 收到 browser.final_message
 32+  → 全量写入 SQLite + D1(消息表)
 33+  → 生成静态文件:/artifact/msg/{id}.txt + .json
 34+  → 提取 baa 指令 → 执行
 35+  → 全量写入 SQLite + D1(执行表)
 36+  → 生成静态文件:/artifact/exec/{id}.txt + .json
 37+  → 更新会话索引
 38+  → 回送给 AI:
 39+    结果 ≤ 2000 字符 → 内联全文
 40+    结果 > 2000 字符 → 前 500 字符摘要 + exact URL
 41+```
 42+
 43+## 3. 设计决策
 44+
 45+以下决策经过 ChatGPT 和 Gemini 实测验证。
 46+
 47+### 3.1 已确认的决策
 48+
 49+| 项 | 决策 | 原因 |
 50+|---|---|---|
 51+| 静态文件路由 | `/artifact/` | 通俗易懂,与内部 API `/v1/` 分离 |
 52+| 文件格式 | 同时提供 `.txt` 和 `.json` | ChatGPT / Gemini 都建议两种格式并存 |
 53+| `.txt` Content-Type | `text/plain; charset=utf-8` | AI 浏览工具最稳定的格式 |
 54+| `.json` Content-Type | `application/json; charset=utf-8` | 需要字段提取时使用 |
 55+| `.txt` 内容结构 | frontmatter 元数据 + 正文 | 两家 AI 都推荐此格式 |
 56+| URL 中的 ID | hash/UUID 格式 | 不用递增数字,防止遍历猜解 |
 57+| 文件过期 | 永不过期 | 所有内容永久保留 |
 58+| 访问控制 | 当前公开访问,无 token | AI 无法带自定义 Header,只能 GET |
 59+| 鉴权预留 | 后续用签名 URL `?sig=xxx&exp=xxx` | 比纯 token 更安全,AI 兼容性最高 |
 60+| 回送 AI 时 | 直接给 exact URL | ChatGPT 强调不能让 AI 猜路径 |
 61+| 截断阈值 | 2000 字符(可配置) | 超过此值开始截断 |
 62+| 摘要长度 | 500 字符(可配置) | 截取前 500 字符作为内联摘要 |
 63+| robots.txt | `Allow: /artifact/` | 允许 AI 爬虫访问 |
 64+| 静态文件由谁 serve | conductor HTTP server | nginx 在 VPS 上不在本地,走 conductor |
 65+
 66+### 3.2 AI 平台访问约束(实测确认)
 67+
 68+| 约束 | 说明 |
 69+|---|---|
 70+| 只能 GET | AI 不能发 POST,不能带自定义 Header |
 71+| 不能带 Cookie/Auth Header | 鉴权只能用 URL 参数 |
 72+| 超时约 10-15 秒 | 必须返回预生成的静态文件,不能现算 |
 73+| exact URL 最稳 | AI 访问明确给出的 URL 成功率最高,自己推导相邻 URL 可能被拒 |
 74+| `/api` 路径不被拦截 | 实测确认,但给 AI 读的接口和内部 API 分开是好习惯 |
 75+| JSON 和纯文本都能读 | 但纯文本/Markdown 更稳、更省 token |
 76+
 77+## 4. 数据库设计
 78+
 79+### 4.1 存储架构
 80+
 81+- **本地 SQLite**:先写,保证主链路不阻塞
 82+- **Cloudflare D1**:异步同步,分布式备份和跨设备访问
 83+- **新建数据库**:不复用旧版 D1 数据库
 84+- **D1 适配器**:TypeScript async 重写,接口兼容旧版 `D1Client`
 85+
 86+### 4.2 表结构
 87+
 88+#### messages 表
 89+
 90+存储所有 AI 对话消息(`browser.final_message` 到达时写入)。
 91+
 92+```sql
 93+CREATE TABLE IF NOT EXISTS messages (
 94+  id              TEXT PRIMARY KEY,     -- assistant_message_id
 95+  platform        TEXT NOT NULL,        -- 'claude' | 'chatgpt' | 'gemini'
 96+  conversation_id TEXT,                 -- 平台对话 ID
 97+  role            TEXT NOT NULL,        -- 'assistant' | 'human'
 98+  raw_text        TEXT NOT NULL,        -- 完整消息文本(永不截断)
 99+  summary         TEXT,                 -- 摘要(前 N 字符或 AI 生成)
100+  observed_at     INTEGER NOT NULL,     -- 毫秒时间戳
101+  static_path     TEXT,                 -- 静态文件相对路径
102+  page_url        TEXT,                 -- 来源页面 URL
103+  page_title      TEXT,                 -- 来源页面标题
104+  organization_id TEXT,                 -- Claude org ID
105+  created_at      INTEGER NOT NULL      -- 入库时间戳
106+);
107+
108+CREATE INDEX IF NOT EXISTS idx_messages_conversation
109+  ON messages(conversation_id);
110+CREATE INDEX IF NOT EXISTS idx_messages_platform
111+  ON messages(platform, observed_at);
112+```
113+
114+#### executions 表
115+
116+存储所有指令执行记录。
117+
118+```sql
119+CREATE TABLE IF NOT EXISTS executions (
120+  instruction_id  TEXT PRIMARY KEY,     -- inst_{hash前16位}
121+  message_id      TEXT NOT NULL,        -- 关联 messages.id
122+  target          TEXT NOT NULL,        -- 'conductor' | 'system' | 'browser.claude'
123+  tool            TEXT NOT NULL,        -- 'exec' | 'files/read' | 'send' 等
124+  params          TEXT,                 -- JSON,指令参数
125+  params_kind     TEXT,                 -- 'none' | 'body' | 'inline_json' | 'inline_string'
126+  result_ok       INTEGER NOT NULL,     -- 1=成功 0=失败
127+  result_data     TEXT,                 -- JSON,完整执行结果(永不截断)
128+  result_summary  TEXT,                 -- 摘要文本
129+  result_error    TEXT,                 -- 错误信息
130+  http_status     INTEGER,             -- HTTP 响应状态码
131+  executed_at     INTEGER NOT NULL,     -- 执行完成时间戳
132+  static_path     TEXT,                 -- 静态文件相对路径
133+  created_at      INTEGER NOT NULL      -- 入库时间戳
134+);
135+
136+CREATE INDEX IF NOT EXISTS idx_executions_message
137+  ON executions(message_id);
138+CREATE INDEX IF NOT EXISTS idx_executions_target_tool
139+  ON executions(target, tool);
140+```
141+
142+#### sessions 表
143+
144+会话级别索引,用于跨会话接续。
145+
146+```sql
147+CREATE TABLE IF NOT EXISTS sessions (
148+  id                TEXT PRIMARY KEY,   -- 自动生成 UUID
149+  platform          TEXT NOT NULL,
150+  conversation_id   TEXT,               -- 平台对话 ID
151+  started_at        INTEGER NOT NULL,
152+  last_activity_at  INTEGER NOT NULL,
153+  message_count     INTEGER NOT NULL DEFAULT 0,
154+  execution_count   INTEGER NOT NULL DEFAULT 0,
155+  summary           TEXT,               -- 会话摘要
156+  created_at        INTEGER NOT NULL
157+);
158+
159+CREATE INDEX IF NOT EXISTS idx_sessions_platform
160+  ON sessions(platform, last_activity_at);
161+CREATE INDEX IF NOT EXISTS idx_sessions_conversation
162+  ON sessions(conversation_id);
163+```
164+
165+## 5. URL 结构
166+
167+### 5.1 静态文件(AI 直接 fetch)
168+
169+```
170+/artifact/msg/{id}.txt            -- 消息全文(frontmatter + 正文)
171+/artifact/msg/{id}.json           -- 消息 JSON
172+/artifact/exec/{id}.txt           -- 执行结果(frontmatter + 正文)
173+/artifact/exec/{id}.json          -- 执行结果 JSON
174+/artifact/session/latest.txt      -- 最近活跃会话摘要
175+/artifact/session/{id}.txt        -- 单个会话时间线
176+```
177+
178+### 5.2 查询接口(内部/管理用)
179+
180+```
181+GET /v1/messages                  -- 消息列表(分页、按 conversation 过滤)
182+GET /v1/messages/{id}             -- 单条消息详情
183+GET /v1/executions                -- 执行记录列表(分页、按 message 过滤)
184+GET /v1/executions/{id}           -- 单条执行详情
185+GET /v1/sessions                  -- 会话索引
186+GET /v1/sessions/latest           -- 最近活跃会话
187+```
188+
189+### 5.3 辅助路由
190+
191+```
192+GET /robots.txt                   -- Allow: /artifact/
193+```
194+
195+## 6. 静态文件格式
196+
197+### 6.1 消息 .txt 格式
198+
199+```
200+kind: message
201+id: m_a8b9c2d7
202+platform: claude
203+conversation_id: conv_d4e5f6a1
204+role: assistant
205+observed_at: 2026-03-28T16:09:00+08:00
206+
207+---
208+
209+(此处为消息完整原文)
210+```
211+
212+### 6.2 执行结果 .txt 格式
213+
214+```
215+kind: execution
216+id: inst_a8b9c2d7
217+target: conductor
218+tool: exec
219+status: ok
220+executed_at: 2026-03-28T16:09:00+08:00
221+message_id: m_d4e5f6a1
222+message_url: https://conductor.makefile.so/artifact/msg/m_d4e5f6a1.txt
223+
224+---
225+
226+command: pnpm test
227+exit_code: 0
228+
229+(此处为完整执行输出)
230+```
231+
232+### 6.3 消息 .json 格式
233+
234+```json
235+{
236+  "kind": "message",
237+  "id": "m_a8b9c2d7",
238+  "platform": "claude",
239+  "conversation_id": "conv_d4e5f6a1",
240+  "role": "assistant",
241+  "observed_at": "2026-03-28T16:09:00+08:00",
242+  "raw_text": "(完整消息文本)",
243+  "summary": "(前 500 字符)",
244+  "artifact_url": "https://conductor.makefile.so/artifact/msg/m_a8b9c2d7.txt"
245+}
246+```
247+
248+### 6.4 执行结果 .json 格式
249+
250+```json
251+{
252+  "kind": "execution",
253+  "id": "inst_a8b9c2d7",
254+  "target": "conductor",
255+  "tool": "exec",
256+  "params": {"command": "pnpm test"},
257+  "status": "ok",
258+  "executed_at": "2026-03-28T16:09:00+08:00",
259+  "message_id": "m_d4e5f6a1",
260+  "message_url": "https://conductor.makefile.so/artifact/msg/m_d4e5f6a1.txt",
261+  "result": {
262+    "ok": true,
263+    "data": {"exit_code": 0, "stdout": "..."},
264+    "error": null
265+  },
266+  "summary": "pnpm test 完成,12 项通过",
267+  "artifact_url": "https://conductor.makefile.so/artifact/exec/inst_a8b9c2d7.txt"
268+}
269+```
270+
271+### 6.5 会话索引 latest.txt 格式
272+
273+```
274+kind: session_index
275+generated_at: 2026-03-28T16:30:00+08:00
276+count: 3
277+
278+---
279+
280+## [2026-03-28 16:09] Claude conv_abc123
281+messages: 5, executions: 3, last_activity: 16:09
282+latest_message: https://conductor.makefile.so/artifact/msg/m_001.txt
283+session: https://conductor.makefile.so/artifact/session/s_abc.txt
284+
285+## [2026-03-28 15:30] ChatGPT conv_def456
286+messages: 2, executions: 1, last_activity: 15:31
287+latest_message: https://conductor.makefile.so/artifact/msg/m_002.txt
288+session: https://conductor.makefile.so/artifact/session/s_def.txt
289+```
290+
291+## 7. 回送策略
292+
293+### 7.1 内联回送(结果 ≤ 2000 字符)
294+
295+```
296+执行完成。
297+
298+command: pnpm test
299+exit_code: 0
300+
301+Tests: 12 passed, 0 failed
302+Time: 3.2s
303+
304+记录:https://conductor.makefile.so/artifact/exec/inst_a8b9c2d7.txt
305+```
306+
307+### 7.2 截断回送(结果 > 2000 字符)
308+
309+```
310+执行完成(输出 8420 字符,已截断)。
311+
312+command: pnpm test
313+exit_code: 1
314+
315+FAIL src/api.test.ts
316+  ● should handle timeout
317+    Expected: 408
318+    Received: 500
319+(...前 500 字符...)
320+
321+完整结果:https://conductor.makefile.so/artifact/exec/inst_a8b9c2d7.txt
322+```
323+
324+### 7.3 配置项
325+
326+```typescript
327+interface ArtifactServiceConfig {
328+  /** 超过此字符数开始截断回送,默认 2000 */
329+  inlineThreshold: number;
330+  /** 截断时保留的前 N 字符,默认 500 */
331+  summaryLength: number;
332+  /** 静态文件存储目录 */
333+  artifactDir: string;
334+  /** 公开访问的 base URL */
335+  publicBaseUrl: string;
336+}
337+```
338+
339+## 8. D1 同步策略
340+
341+```
342+写入流程:
343+  本地 SQLite 写入(同步,阻塞)
344+    → 生成静态文件(同步,写入 artifactDir)
345+    → D1 异步推送(后台,不阻塞主链路)
346+    → 推送失败时记录重试队列
347+
348+读取流程:
349+  静态文件:直接读磁盘,conductor HTTP serve
350+  查询接口:读本地 SQLite
351+  D1:跨设备/远程访问时使用
352+```
353+
354+D1 同步细节:
355+
356+- 写入后触发异步推送,不等待结果
357+- 失败时记录到本地重试队列(SQLite 表 `d1_sync_queue`)
358+- 后台定时扫描重试队列,指数退避
359+- D1 不可用时,本地功能完全不受影响
360+
361+## 9. 跨会话接续
362+
363+新对话的 AI 通过以下方式了解历史:
364+
365+1. AI 发送 `@conductor::describe` → conductor 回复中包含最近会话 URL
366+2. AI fetch `https://conductor.makefile.so/artifact/session/latest.txt`
367+3. 看到所有历史对话、消息、执行记录的 exact URL
368+4. 按需 fetch 任意 URL 获取详情
369+
370+不需要人工复制粘贴历史,不需要浏览器扩展参与。
371+
372+## 10. 实施顺序
373+
374+1. **新建 SQLite 数据库 + 表结构**(messages / executions / sessions)
375+2. **静态文件生成模块**(写入时生成 .txt + .json)
376+3. **conductor HTTP 路由**(`/artifact/` serve 静态文件 + `/robots.txt`)
377+4. **接入主链路**(browser.final_message → 写库 + 生成文件;executor → 写库 + 生成文件)
378+5. **回送策略**(阈值截断 + URL 拼接)
379+6. **查询路由**(`/v1/messages`、`/v1/executions`、`/v1/sessions`)
380+7. **D1 异步适配器**(TypeScript async 重写)
381+8. **D1 同步队列**(后台推送 + 重试)
382+9. **会话索引自动更新**(事件触发)
383+10. **stagit 集成**(后续)
384+
385+## 11. 不做的事
386+
387+- 不做文件上传/下载注入到浏览器
388+- 不做 artifact 物化/manifest/upload receipt(v5 规范中的复杂方案)
389+- 不做 TTL/自动过期
390+- 不做多租户隔离(当前单用户)
391+- 不做 AI 调用生成摘要(纯截断,简单可靠)
M plans/BAA_INSTRUCTION_ROADMAP.md
+16, -7
 1@@ -7,10 +7,11 @@
 2 ## 状态
 3 
 4 - `路线图 / 未来规划`
 5-- 当前基线:`main@8ef82d8`
 6+- 当前基线:`main@3c85eaf`
 7 
 8 ## 关联文档
 9 
10+- [`./ARTIFACT_STATIC_SERVICE.md`](./ARTIFACT_STATIC_SERVICE.md)(下一阶段主线)
11 - [`./BAA_INSTRUCTION_SYSTEM.md`](./BAA_INSTRUCTION_SYSTEM.md)
12 - [`./STATUS_SUMMARY.md`](./STATUS_SUMMARY.md)
13 - [`./archive/BAA_BROWSER_PROXY_DELIVERY_REQUIREMENTS.md`](./archive/BAA_BROWSER_PROXY_DELIVERY_REQUIREMENTS.md)
14@@ -23,11 +24,18 @@
15 - `@conductor` / `@system` / `@browser.claude`
16 - proxy-first delivery
17 
18-下一步更合理的扩展顺序是:
19+下一阶段主线是 **Artifact 静态服务**(详见 [`./ARTIFACT_STATIC_SERVICE.md`](./ARTIFACT_STATIC_SERVICE.md)):
20 
21-1. 先做稳定性收尾
22-2. 再扩 target 面
23-3. 最后做多节点 / 任务池 / 能力池
24+1. 所有消息和执行结果全量入库(本地 SQLite + D1 异步同步)
25+2. 生成 `.txt` + `.json` 静态文件,conductor HTTP serve `/artifact/`
26+3. 长结果截断摘要 + exact URL 回送
27+4. 跨会话接续(新 AI 可 fetch 历史 URL)
28+
29+之后的扩展顺序:
30+
31+1. 稳定性收尾(OPT-002 等)
32+2. 扩 target 面
33+3. 多节点 / 任务池 / 能力池
34 
35 ## 2. 协议面扩展
36 
37@@ -87,15 +95,16 @@
38 
39 除非需求重新变化,当前路线图不打算回到:
40 
41-- artifact upload / download 主链
42+- ~~artifact upload / download 主链~~ → 已被 Artifact 静态服务方案替代(AI 通过 fetch URL 获取内容,不需要浏览器注入文件)
43 - binary delivery 主链
44 - 插件侧复杂编排
45 - 插件侧 BAA parser
46 
47 当前更清晰的方向仍然是:
48 
49-- conductor 负责上下文、路由和审计
50+- conductor 负责上下文、路由、审计和内容持久化
51 - 插件负责页面内真实请求执行
52+- AI 通过 HTTP GET fetch 静态 URL 获取大量内容,不走浏览器扩展管道
53 
54 ## 7. 阅读顺序
55 
M plans/STATUS_SUMMARY.md
+28, -9
 1@@ -6,7 +6,7 @@
 2 
 3 ## 当前代码基线
 4 
 5-- 当前主分支:`main@8ef82d8`
 6+- 当前主分支:`main@3c85eaf`
 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@@ -35,17 +35,27 @@
11 
12 ## 当前最高优先级
13 
14+**下一阶段主线:Artifact 静态服务**
15+
16+详见 [`./ARTIFACT_STATIC_SERVICE.md`](./ARTIFACT_STATIC_SERVICE.md)
17+
18+核心目标:所有消息和执行结果持久化到数据库,生成静态 URL,AI 可通过 fetch 获取完整内容,实现跨会话接续。
19+
20+**并行优化项:**
21+
22 1. `OPT-002`
23-   给 executor 加超时保护
24-2. `OPT-006`
25-   给 execution persistence 表加自动清理
26-3. `OPT-003`
27+   给 executor 加超时保护(与新方案不冲突,且新方案依赖 executor,加超时更安全)
28+2. `OPT-003`
29    让 policy 白名单配置化
30-4. `OPT-004`
31+3. `OPT-004`
32    为 Claude final-message 增加更稳的 SSE fallback
33-5. `OPT-005`
34+4. `OPT-005`
35    让 normalize / parse 错误进一步隔离,不拖累整批指令
36 
37+**已关闭的优化项:**
38+
39+- ~~`OPT-006` 给 execution persistence 表加自动清理~~ → 已关闭。新方案决定所有数据永不过期,不需要自动清理。
40+
41 说明:
42 
43 - 当前已没有 open `BUG-*` / `MISSING-*` blocker
44@@ -53,6 +63,7 @@
45 
46 ## 当前活跃需求文档
47 
48+- [`./ARTIFACT_STATIC_SERVICE.md`](./ARTIFACT_STATIC_SERVICE.md)(下一阶段主线)
49 - [`./BAA_INSTRUCTION_SYSTEM.md`](./BAA_INSTRUCTION_SYSTEM.md)
50 - [`./BAA_INSTRUCTION_ROADMAP.md`](./BAA_INSTRUCTION_ROADMAP.md)
51 - [`./STATUS_SUMMARY.md`](./STATUS_SUMMARY.md)
52@@ -63,7 +74,15 @@
53 
54 ## 当前主线判断
55 
56-现在浏览器主链的关键收口已经完成:
57+Phase 1(浏览器主链)已完成收口。下一阶段主线是 **Artifact 静态服务**:
58+
59+- 所有消息和执行结果全量入库(本地 SQLite + Cloudflare D1 异步同步)
60+- 同时生成 `.txt` + `.json` 静态文件,conductor HTTP serve `/artifact/`
61+- 回送 AI 时:短结果内联,长结果截断摘要 + exact URL
62+- 新对话 AI 可通过 fetch URL 获取历史,实现跨会话接续
63+- 后续集成 stagit 提供 git 仓库浏览
64+
65+之前的浏览器主链继续保持:
66 
67 - 入站:继续保留 `browser.final_message`
68 - 真相源:由 conductor 记录 conversation / request / routing
69@@ -76,7 +95,7 @@
70 - `Gemini` 当前仍不是 `/v1/browser/request` 的正式支持面,正式 browser target 仍只有 `browser.claude`
71 - ChatGPT proxy send 仍依赖最近捕获的真实发送模板;如果 controller 刚重载且还没观察到真实发送,会退回同页 DOM fallback
72 - Claude 的 `organizationId` 当前仍依赖最近观测到的 org 上下文,不是完整的多页多 org 精确映射
73-- `proxy_delivery` 当前的成功语义是“请求已派发到目标页面上下文”,不是“下游 AI 已完整回复”
74+- `proxy_delivery` 当前的成功语义是”请求已派发到目标页面上下文”,不是”下游 AI 已完整回复”
75 - ChatGPT root message / mapping 结构如果后续变化,final-message 提取启发式仍需跟进
76 - recent relay cache 是有限窗口;极老 replay 超出窗口后,仍会落回 conductor dedupe
77 - `status-api` 继续保留为显式 opt-in 兼容层,不是当前删除重点
M tasks/TASK_OVERVIEW.md
+20, -18
 1@@ -3,7 +3,7 @@
 2 ## 当前基线
 3 
 4 - 日期:`2026-03-28`
 5-- 主分支基线:`main@8ef82d8`
 6+- 主分支基线:`main@3c85eaf`
 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@@ -33,30 +33,35 @@
11 
12 ## 当前活跃任务与优先级
13 
14-当前根目录已没有活跃任务卡;这轮 `T-BUG-020`、`T-S037`、`T-S038` 都已完成并归档。
15+### P0(下一阶段主线)
16 
17-### P1
18+- **Artifact 静态服务**:[`../plans/ARTIFACT_STATIC_SERVICE.md`](../plans/ARTIFACT_STATIC_SERVICE.md)
19+  - 所有消息和执行结果全量入库 + 生成静态 URL
20+  - AI 通过 fetch URL 获取完整内容
21+  - 跨会话接续
22+  - 分支:`feat/artifact-static-service`(待创建)
23+
24+### P1(并行优化)
25 
26 - [`../bugs/OPT-002-executor-timeout.md`](../bugs/OPT-002-executor-timeout.md)
27-- [`../bugs/OPT-006-db-table-auto-cleanup.md`](../bugs/OPT-006-db-table-auto-cleanup.md)
28 
29-### P2
30+### P2(次级优化)
31 
32 - [`../bugs/OPT-003-policy-configurable.md`](../bugs/OPT-003-policy-configurable.md)
33 - [`../bugs/OPT-004-final-message-claude-sse-fallback.md`](../bugs/OPT-004-final-message-claude-sse-fallback.md)
34 - [`../bugs/OPT-005-normalize-parse-error-isolation.md`](../bugs/OPT-005-normalize-parse-error-isolation.md)
35 
36-## 当前 open bug / gap
37+### 已关闭
38 
39-当前没有 open `BUG-*` 或 `MISSING-*`;剩余 backlog 已全部收口为 `OPT-*` 优化项,见 [`../bugs/README.md`](../bugs/README.md)。
40+- ~~`OPT-006`~~:已关闭。新方案决定数据永不过期,不需要自动清理。
41 
42-说明:
43+## 当前 open bug / gap
44 
45-- `OPT-002` 和 `OPT-006` 现在是最值得继续推进的两项工程稳定性工作
46-- `OPT-003` / `OPT-004` / `OPT-005` 属于次一级优化,不再阻塞当前主线
47+当前没有 open `BUG-*` 或 `MISSING-*`;剩余 backlog 已收口为 `OPT-*` 优化项,见 [`../bugs/README.md`](../bugs/README.md)。
48 
49 ## 当前活跃需求文档
50 
51+- [`../plans/ARTIFACT_STATIC_SERVICE.md`](../plans/ARTIFACT_STATIC_SERVICE.md)(下一阶段主线)
52 - [`../plans/BAA_INSTRUCTION_SYSTEM.md`](../plans/BAA_INSTRUCTION_SYSTEM.md)
53 - [`../plans/BAA_INSTRUCTION_ROADMAP.md`](../plans/BAA_INSTRUCTION_ROADMAP.md)
54 - [`../plans/STATUS_SUMMARY.md`](../plans/STATUS_SUMMARY.md)
55@@ -67,16 +72,13 @@
56 
57 ## 当前主线判断
58 
59-这轮主线已经完成两件关键收口:
60-
61-- ChatGPT stale final-message replay 已被抑制
62-- browser delivery 已从默认 shell-page DOM 回写,收口到 proxy-first 的业务页回写链
63+Phase 1(浏览器主链)已完成收口。下一阶段主线是 **Artifact 静态服务**:
64 
65-下一步最值得继续推进的是工程稳定性,而不是再补一个 selector:
66+- 所有消息和执行结果全量入库 + 生成静态 URL
67+- AI 通过 fetch URL 获取完整内容,实现跨会话接续
68+- 详见 [`../plans/ARTIFACT_STATIC_SERVICE.md`](../plans/ARTIFACT_STATIC_SERVICE.md)
69 
70-- executor 超时保护
71-- DB 自动清理
72-- policy / relay / parse 的次级优化
73+并行推进 `OPT-002`(executor 超时保护)。
74 
75 ## 现在该读什么
76 
M tasks/task-doc-template.md
+105, -17
  1@@ -8,17 +8,18 @@
  2 
  3 - 给新对话一条可以直接复制的提示词
  4 - 把当前基线、写入范围、验收标准写清楚
  5-- 尽量减少并行任务之间的改动冲突
  6+- 每个任务强制使用独立分支和 worktree,避免代码冲突
  7+- AI 在执行过程中主动更新任务文档状态
  8 
  9 ## 使用方式
 10 
 11-如果是“帮我创建新的任务文档”,先读这个模板,再按当前需求生成任务 `md`。
 12+如果是"帮我创建新的任务文档",先读这个模板,再按当前需求生成任务 `md`。
 13 
 14 推荐提示词:
 15 
 16 - `读 /Users/george/code/baa-conductor/tasks/task-doc-template.md 任务模板,按当前需求创建新的任务 md 文档。`
 17 
 18-如果是“按某个任务文档开始开发”,推荐提示词:
 19+如果是"按某个任务文档开始开发",推荐提示词:
 20 
 21 - `读 /Users/george/code/baa-conductor/tasks/<当前任务文档>.md 任务文档,完成开发任务。`
 22 
 23@@ -27,12 +28,16 @@
 24 - 路径一律写绝对路径
 25 - 任务文档统一放在 `/Users/george/code/baa-conductor/tasks/`
 26 - 当前基线要写明 `main` 和具体提交
 27-- 开工要求必须明确写“先从当前 `main` 新建任务分支,再开始开发;禁止直接在 `main` 上改”
 28-- 功能任务分支名必须以 `feat/` 开头;缺陷任务分支名必须以 `bug/` 开头
 29+- **每个任务必须强制使用独立的新分支和新的 git worktree**,避免代码冲突
 30+- 功能任务分支名以 `feat/` 开头,缺陷任务以 `bug/` 开头
 31+- worktree 路径统一为 `/Users/george/code/baa-conductor-<short-branch-name>`
 32+- 禁止直接在 main 上修改代码
 33+- 禁止多个任务共用同一个 worktree
 34 - 能并行的任务优先拆开,并明确写清 `允许修改的目录`
 35 - 不要把背景、实现边界、验收标准混成一段
 36-- 验收标准必须能直接检查,不要只写“功能正常”
 37-- 如果有明确边界,不要只写“参考现有实现”,要写“尽量不要修改哪些目录”
 38+- 验收标准必须能直接检查,不要只写"功能正常"
 39+- 如果有明确边界,不要只写"参考现有实现",要写"尽量不要修改哪些目录"
 40+- 任务文档的"执行记录"区域创建时留空,由执行任务的 AI 填写
 41 
 42 ## 模板正文
 43 
 44@@ -41,9 +46,15 @@
 45 ```md
 46 # Task <编号>:<任务标题>
 47 
 48+## 状态
 49+
 50+- 当前状态:`待开始`
 51+- 规模预估:`S / M / L`
 52+- 依赖任务:无 / `<依赖的任务编号>`
 53+
 54 ## 直接给对话的提示词
 55 
 56-读 `</Users/george/code/baa-conductor/tasks/当前任务文档.md>` 任务文档,完成开发任务。
 57+读 `/Users/george/code/baa-conductor/tasks/<当前任务文档>.md` 任务文档,完成开发任务。
 58 
 59 如需补背景,再读:
 60 
 61@@ -55,11 +66,39 @@
 62 - 仓库:`/Users/george/code/baa-conductor`
 63 - 分支基线:`main`
 64 - 提交:`<当前 main 提交>`
 65-- 开工要求:必须先从当前 `main` 新建任务分支,再开始开发;禁止直接在 `main` 上修改。功能任务分支名必须以 `feat/` 开头,缺陷任务分支名必须以 `bug/` 开头。
 66 
 67-## 必须创建的新分支名
 68+## 分支与 worktree(强制)
 69+
 70+每个任务必须使用独立的分支和 worktree,禁止直接在 main 上修改,禁止多个任务共用同一个 worktree。
 71+
 72+- 分支名:`<feat/short-branch-name 或 bug/short-branch-name>`
 73+- worktree 路径:`/Users/george/code/baa-conductor-<short-branch-name>`
 74+
 75+开工步骤:
 76+
 77+1. `cd /Users/george/code/baa-conductor`
 78+2. `git worktree add ../baa-conductor-<short-branch-name> -b <分支名> main`
 79+3. `cd ../baa-conductor-<short-branch-name>`
 80+4. 在这个 worktree 目录里开发,不要回到主仓库目录
 81 
 82-- `<feat/short-branch-name 或 bug/short-branch-name>`
 83+完成后合并步骤:
 84+
 85+1. 在 worktree 里提交所有变更
 86+2. `cd /Users/george/code/baa-conductor`
 87+3. `git merge <分支名>`
 88+4. `git worktree remove ../baa-conductor-<short-branch-name>`
 89+
 90+合并冲突处理:
 91+
 92+1. 如果 `git merge` 报冲突,先 `git diff` 查看冲突文件
 93+2. 手动解决冲突后 `git add` 冲突文件
 94+3. `git merge --continue` 完成合并
 95+4. 不要用 `git merge --abort` 然后 force 覆盖
 96+
 97+命名规则:
 98+
 99+- 功能任务分支名以 `feat/` 开头
100+- 缺陷任务分支名以 `bug/` 开头
101 
102 ## 目标
103 
104@@ -122,6 +161,7 @@
105 - <兼容性约束>
106 - <不要破坏的旧行为>
107 - <本任务和其他并行任务的边界>
108+- 所有开发必须在 worktree 中进行,不要在主仓库目录修改代码
109 
110 ## 验收标准
111 
112@@ -135,12 +175,60 @@
113 - `<命令 2>`
114 - `<命令 3>`
115 
116-## 交付要求
117+## 执行记录
118+
119+> 以下内容由执行任务的 AI 填写,创建任务时留空。
120 
121-完成后请说明:
122+### 开始执行
123 
124-- 修改了哪些文件
125-- 核心实现思路是什么
126-- 跑了哪些测试
127-- 还有哪些剩余风险
128+- 执行者:<AI 名称和模型,如 Claude Opus 4.6>
129+- 开始时间:<ISO 时间>
130+- 状态变更:`待开始` → `进行中`
131+
132+### 完成摘要
133+
134+- 完成时间:<ISO 时间>
135+- 状态变更:`进行中` → `已完成`
136+- 修改了哪些文件:
137+  - <文件列表>
138+- 核心实现思路:
139+  - <简述>
140+- 跑了哪些测试:
141+  - <测试列表>
142+
143+### 剩余风险
144+
145+- <风险 1>
146+- <风险 2>
147+- 无已知风险
148 ```
149+
150+## AI 执行任务时的行为规范
151+
152+AI 收到任务文档后,必须按以下顺序操作:
153+
154+### 开工时
155+
156+1. 把任务文档的 `当前状态` 从 `待开始` 改为 `进行中`
157+2. 在"执行记录 > 开始执行"区域填写:
158+   - 执行者(AI 名称和模型)
159+   - 开始时间(ISO 格式)
160+3. 按"分支与 worktree"章节创建独立 worktree
161+4. 开始开发
162+
163+### 完成时
164+
165+1. 把任务文档的 `当前状态` 从 `进行中` 改为 `已完成`
166+2. 在"执行记录 > 完成摘要"区域填写:
167+   - 完成时间
168+   - 修改了哪些文件
169+   - 核心实现思路
170+   - 跑了哪些测试
171+3. 在"执行记录 > 剩余风险"区域填写风险点,如果没有写"无已知风险"
172+4. 提交所有变更(包括更新后的任务文档本身)
173+
174+### 失败或中断时
175+
176+1. 把任务文档的 `当前状态` 改为 `阻塞` 或 `失败`
177+2. 在"剩余风险"区域写明失败原因和卡点
178+3. 提交当前进度,不要丢弃已有工作