baa-conductor

git clone 

commit
9bc2519
parent
803c895
author
im_wower
date
2026-03-25 00:05:22 +0800 CST
chore: prune completed task docs
19 files changed,  +649, -1214
M README.md
+2, -2
 1@@ -19,7 +19,7 @@
 2 4. [`docs/api/README.md`](./docs/api/README.md)
 3 5. [`docs/runtime/README.md`](./docs/runtime/README.md)
 4 6. [`docs/ops/README.md`](./docs/ops/README.md)
 5-7. [`plans/TASK_OVERVIEW.md`](./plans/TASK_OVERVIEW.md)
 6+7. [`tasks/TASK_OVERVIEW.md`](./tasks/TASK_OVERVIEW.md)
 7 
 8 如果你关心“Codex 不再手工开 TUI,而是作为本地常驻代理工作”,再读:
 9 
10@@ -72,9 +72,9 @@ scripts/
11   runtime/
12 plans/
13   STATUS_SUMMARY.md
14-  TASK_OVERVIEW.md
15   WORKFLOW.md
16 tasks/
17+  TASK_OVERVIEW.md
18 bugs/
19 docs/
20   api/
D tasks/T-C001.md
+0, -92
 1@@ -1,92 +0,0 @@
 2----
 3-task_id: T-C001
 4-title: 本地 WS server
 5-status: done
 6-branch: feat/conductor-local-ws-server
 7-repo: /Users/george/code/baa-conductor
 8-base_ref: main@fdcc3fa
 9-depends_on: []
10-write_scope:
11-  - apps/conductor-daemon/**
12-  - docs/runtime/**
13-  - docs/api/**
14-updated_at: 2026-03-24
15----
16-
17-# 本地 WS server
18-
19-## 目标
20-
21-在 `mini` 本地 `conductor-daemon` 中增加正式 WS server,承接本地 Firefox 插件双向通讯。
22-
23-## 本任务包含
24-
25-- 在 `conductor-daemon` 本地 HTTP server 上增加正式 WebSocket 入口
26-- 为 Firefox 插件定义并实现最小双向消息面
27-- 复用本地 control plane 状态和 `pause` / `resume` / `drain` 写接口
28-- 补最小 WS smoke / 测试
29-- 更新 runtime / API 文档
30-
31-## 本任务不包含
32-
33-- 不修改 Firefox 插件
34-- 不修改 Cloudflare Worker
35-- 不把该 WS 作为公网通道
36-
37-## 建议起始文件
38-
39-- `apps/conductor-daemon/src/index.ts`
40-- `apps/conductor-daemon/src/local-api.ts`
41-- `apps/conductor-daemon/src/index.test.js`
42-- `docs/runtime/environment.md`
43-- `docs/api/README.md`
44-
45-## 交付物
46-
47-- `conductor-daemon` 本地 Firefox WS server
48-- 对应消息模型和监听配置文档
49-- 已回写状态的任务卡
50-
51-## 验收
52-
53-- `conductor-daemon` typecheck / build / test 通过
54-- 本地最小 WS smoke 或测试通过
55-- `git diff --check` 通过
56-
57-## files_changed
58-
59-- `tasks/T-C001.md`
60-- `apps/conductor-daemon/src/firefox-ws.ts`
61-- `apps/conductor-daemon/src/index.ts`
62-- `apps/conductor-daemon/src/local-api.ts`
63-- `apps/conductor-daemon/src/node-shims.d.ts`
64-- `apps/conductor-daemon/src/index.test.js`
65-- `docs/api/README.md`
66-- `docs/api/firefox-local-ws.md`
67-- `docs/runtime/README.md`
68-- `docs/runtime/environment.md`
69-
70-## commands_run
71-
72-- `npx --yes pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon typecheck`
73-- `npx --yes pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
74-- `npx --yes pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon test`
75-- `git -C /Users/george/code/baa-conductor diff --check`
76-
77-## result
78-
79-- 在 `conductor-daemon` 现有本地 HTTP listener 上新增正式 Firefox WS bridge,固定 path 为 `/ws/firefox`
80-- 新增最小双向消息面:`hello`、`state_request`、`state_snapshot`、`action_request` / `action_result`、`credentials`、`api_endpoints`
81-- `pause` / `resume` / `drain` 的 HTTP 写接口改为直接返回最新 system state,WS action 复用同一套本地 control plane 写入逻辑
82-- runtime snapshot、`/describe`、`/v1/capabilities` 都补充了 Firefox WS URL 和消息面说明
83-- 增加 Node 集成测试,覆盖 WS 握手、browser metadata push 和通过 WS 执行 `pause`
84-
85-## risks
86-
87-- 当前只实现了 Firefox bridge 的最小结构;旧 browser-proxy 风格的 `api_request` / `api_response` 仍明确返回 `not_implemented`
88-- browser 侧 `credentials` 只在服务端保留最小元数据快照,当前没有把原始 header 落盘;如果后续需要真正代理请求,还要补更细的权限和生命周期设计
89-
90-## next_handoff
91-
92-- 如果后续确实要恢复 browser request proxy,再在现有 WS bridge 上继续实现 `api_request` / `api_response`
93-- 如果 Firefox 插件准备切到 WS action,可以直接对接当前 `action_request` / `action_result` 和 `state_snapshot`
D tasks/T-C002.md
+0, -91
 1@@ -1,91 +0,0 @@
 2----
 3-task_id: T-C002
 4-title: Firefox 插件接本地 WS
 5-status: done
 6-branch: feat/firefox-local-ws-client
 7-repo: /Users/george/code/baa-conductor
 8-base_ref: main@0cdbd8a
 9-depends_on:
10-  - T-C001
11-write_scope:
12-  - plugins/baa-firefox/**
13-  - docs/firefox/**
14-updated_at: 2026-03-24
15----
16-
17-# Firefox 插件接本地 WS
18-
19-## 目标
20-
21-让 Firefox 插件默认自动连接 `mini` 本地 WS,并把管理页收口为 WS 状态、HTTP API 状态和控制按钮。
22-
23-## 本任务包含
24-
25-- 插件默认连接本地 `/ws/firefox`
26-- 保留远程 HTTP 控制状态同步
27-- 管理页只保留 WS 状态、HTTP 状态、暂停/恢复/排空按钮
28-- 去掉手工编辑 WS 地址和 API 地址
29-- 支持自动重连和服务端重启后恢复
30-- 更新 Firefox 使用文档和验证步骤
31-
32-## 本任务不包含
33-
34-- 不修改 `conductor-daemon`
35-- 不修改 Firefox 插件以外的业务逻辑
36-
37-## 建议起始文件
38-
39-- `plugins/baa-firefox/controller.js`
40-- `plugins/baa-firefox/background.js`
41-- `plugins/baa-firefox/controller.html`
42-- `plugins/baa-firefox/docs/conductor-control.md`
43-- `docs/firefox/README.md`
44-
45-## 交付物
46-
47-- 默认接入本地 WS 的 Firefox 插件
48-- 收口后的管理页 UI
49-- 已更新的 Firefox 文档和任务卡
50-
51-## 验收
52-
53-- `node --check` 覆盖插件脚本
54-- 说明如何验证 WS 连接、断线重连、按钮控制
55-- `git diff --check` 通过
56-
57-## files_changed
58-
59-- `tasks/T-C002.md`
60-- `plugins/baa-firefox/controller.js`
61-- `plugins/baa-firefox/controller.html`
62-- `plugins/baa-firefox/controller.css`
63-- `plugins/baa-firefox/manifest.json`
64-- `plugins/baa-firefox/README.md`
65-- `plugins/baa-firefox/docs/conductor-control.md`
66-- `docs/firefox/README.md`
67-
68-## commands_run
69-
70-- `node --check /Users/george/code/worktrees/baa-conductor-firefox-local-ws-client/plugins/baa-firefox/controller.js`
71-- `node --check /Users/george/code/worktrees/baa-conductor-firefox-local-ws-client/plugins/baa-firefox/background.js`
72-- `node --check /Users/george/code/worktrees/baa-conductor-firefox-local-ws-client/plugins/baa-firefox/content-script.js`
73-- `node --check /Users/george/code/worktrees/baa-conductor-firefox-local-ws-client/plugins/baa-firefox/page-interceptor.js`
74-- `git -C /Users/george/code/worktrees/baa-conductor-firefox-local-ws-client diff --check`
75-
76-## result
77-
78-- Firefox 插件默认固定连接本地 `ws://127.0.0.1:4317/ws/firefox`,不再允许手工修改地址
79-- 远程 HTTP control API 固定为 `https://conductor.makefile.so`,并继续按轮询加退避重试同步状态
80-- 管理页已收口为 WS 状态、HTTP 状态和 `暂停` / `恢复` / `排空` 按钮
81-- 本地 WS 已支持握手、快照展示、断线自动重连和本地服务重启后恢复
82-- Firefox 文档已更新为新的固定地址、简化 UI 和验证步骤
83-
84-## risks
85-
86-- 本次只做了静态校验;真实的 WS 握手、断线重连和 HTTP 控制按钮仍需在已运行的 `conductor-daemon` 与远程 `conductor.makefile.so` 上做人工联调
87-- 管理页不再展示标签页/凭证/端点细节;这些底层桥接能力仍然保留,但后续排障要看 WS 详情或浏览器扩展存储
88-
89-## next_handoff
90-
91-- 在装好插件的 Firefox 上手工验证三件事:本地 WS 首次连接、停服后自动重连、`暂停` / `恢复` / `排空` 的远程状态回写
92-- 如果需要更强可观测性,再考虑把当前被隐藏的桥接调试信息迁到单独调试页,而不是重新塞回主管理页
D tasks/T-C003.md
+0, -105
  1@@ -1,105 +0,0 @@
  2----
  3-task_id: T-C003
  4-title: 把 host-ops 接到 HTTP
  5-status: done
  6-branch: feat/conductor-host-ops-http
  7-repo: /Users/george/code/baa-conductor
  8-base_ref: main@0cdbd8a
  9-depends_on: []
 10-write_scope:
 11-  - packages/host-ops/**
 12-  - apps/conductor-daemon/**
 13-  - docs/api/**
 14-updated_at: 2026-03-24
 15----
 16-
 17-# 把 host-ops 接到 HTTP
 18-
 19-## 目标
 20-
 21-把 `@baa-conductor/host-ops` 真正挂到 `conductor-daemon` 的本地 HTTP 面,提供:
 22-
 23-- `POST /v1/exec`
 24-- `POST /v1/files/read`
 25-- `POST /v1/files/write`
 26-
 27-## 本任务包含
 28-
 29-- 为 `conductor-daemon` 增加 host-ops HTTP 路由
 30-- 明确 `cwd`、`timeoutMs`、`path`、`overwrite`、`createParents` 等输入语义
 31-- 保持结构化返回,复用 `@baa-conductor/host-ops` 的 success/failure union
 32-- 补充最小集成测试和 API 文档
 33-
 34-## 本任务不包含
 35-
 36-- 不修改 Firefox 插件
 37-- 不修改 `control-api-worker`
 38-- 不把这些能力暴露到公网控制面
 39-
 40-## 建议起始文件
 41-
 42-- `packages/host-ops/src/index.ts`
 43-- `apps/conductor-daemon/src/local-api.ts`
 44-- `apps/conductor-daemon/src/index.test.js`
 45-- `docs/api/local-host-ops.md`
 46-- `docs/api/README.md`
 47-
 48-## 交付物
 49-
 50-- `conductor-daemon` 上线的本地 host-ops HTTP 接口
 51-- 更新后的 host-ops 合同与 API 文档
 52-- 已回写状态的任务卡
 53-
 54-## 验收
 55-
 56-- `conductor-daemon` / `host-ops` 相关 typecheck / build / test 通过
 57-- 至少给出最小 curl 示例和本地验证
 58-- `git diff --check` 通过
 59-
 60-## files_changed
 61-
 62-- `tasks/T-C003.md`
 63-- `packages/host-ops/package.json`
 64-- `packages/host-ops/tsconfig.json`
 65-- `packages/host-ops/src/index.ts`
 66-- `packages/host-ops/src/index.test.js`
 67-- `apps/conductor-daemon/package.json`
 68-- `apps/conductor-daemon/src/local-api.ts`
 69-- `apps/conductor-daemon/src/index.test.js`
 70-- `docs/api/README.md`
 71-- `docs/api/local-host-ops.md`
 72-- `docs/api/business-interfaces.md`
 73-- `docs/api/control-interfaces.md`
 74-- `docs/api/hand-shell-migration.md`
 75-
 76-## commands_run
 77-
 78-- `npx --yes pnpm -C /Users/george/Desktop/baa-conductor-host-ops-http install`
 79-- `npx --yes pnpm -C /Users/george/Desktop/baa-conductor-host-ops-http -F @baa-conductor/host-ops typecheck`
 80-- `npx --yes pnpm -C /Users/george/Desktop/baa-conductor-host-ops-http -F @baa-conductor/host-ops build`
 81-- `npx --yes pnpm -C /Users/george/Desktop/baa-conductor-host-ops-http -F @baa-conductor/host-ops test`
 82-- `npx --yes pnpm -C /Users/george/Desktop/baa-conductor-host-ops-http -F @baa-conductor/conductor-daemon typecheck`
 83-- `npx --yes pnpm -C /Users/george/Desktop/baa-conductor-host-ops-http -F @baa-conductor/conductor-daemon build`
 84-- `npx --yes pnpm -C /Users/george/Desktop/baa-conductor-host-ops-http -F @baa-conductor/conductor-daemon test`
 85-- `curl -X POST http://127.0.0.1:43219/v1/exec ...`
 86-- `curl -X POST http://127.0.0.1:43219/v1/files/write ...`
 87-- `curl -X POST http://127.0.0.1:43219/v1/files/read ...`
 88-- `git -C /Users/george/Desktop/baa-conductor-host-ops-http diff --check`
 89-
 90-## result
 91-
 92-- `conductor-daemon` 新增 `POST /v1/exec`、`POST /v1/files/read`、`POST /v1/files/write`,直接复用 `@baa-conductor/host-ops`
 93-- HTTP 外层继续使用统一 success envelope;具体 host-op 成功或失败通过 `data.ok` 返回结构化 union
 94-- `files/write` 增加 `overwrite` 语义和 `FILE_ALREADY_EXISTS` 结构化错误;`createParents` / `overwrite` 都做了运行时校验
 95-- `/describe`、`/describe/control`、`/v1/capabilities` 现在会显式暴露 host-ops 能力、curl 示例和输入语义
 96-- 已补 package 级测试、handler 级测试和真实 HTTP listener 集成测试,并做过一次独立 curl 冒烟验证
 97-
 98-## risks
 99-
100-- 当前 host-ops 只在 `conductor-daemon` 本地 listener 上可用,没有额外鉴权层;依赖现有 local-network-only 部署边界
101-- HTTP 外层 `ok` 始终表示 conductor 路由处理成功;调用方必须继续检查 `data.ok` 才能判断 host-op 本身是否成功
102-
103-## next_handoff
104-
105-- 如果后续需要把同一能力暴露到远端控制面,再单独设计 `control-api-worker` 的鉴权、限流和审计策略
106-- 如果后续需要更强文件写保护,可以继续补路径白名单或 workspace sandbox,而不是把权限逻辑塞进当前最小 host-ops 层
D tasks/T-C004.md
+0, -121
  1@@ -1,121 +0,0 @@
  2----
  3-task_id: T-C004
  4-title: 删除 Worker / D1 / control-api 旧面
  5-status: done
  6-branch: feat/remove-worker-and-cutover
  7-repo: /Users/george/code/baa-conductor
  8-base_ref: main@70f8a64
  9-depends_on:
 10-  - T-C002
 11-  - T-C003
 12-write_scope:
 13-  - plugins/baa-firefox/**
 14-  - docs/**
 15-  - ops/nginx/**
 16-  - scripts/ops/**
 17-  - scripts/runtime/**
 18-  - apps/control-api-worker/**
 19-  - package.json
 20-  - pnpm-workspace.yaml
 21-updated_at: 2026-03-24
 22----
 23-
 24-# 删除 Worker / D1 / control-api 旧面
 25-
 26-## 目标
 27-
 28-把插件、运行脚本和文档默认口径统一到:
 29-
 30-- 本地 Firefox WS
 31-- `conductor.makefile.so`
 32-
 33-并删除:
 34-
 35-- `apps/control-api-worker`
 36-- Cloudflare Worker 旧部署面
 37-- D1 作为主控制面的描述
 38-
 39-## 本任务包含
 40-
 41-- 删除 workspace 内的 `control-api-worker` 应用目录
 42-- 把运行脚本默认 `BAA_CONTROL_API_BASE` 切到 `https://conductor.makefile.so`
 43-- 去掉插件和文档里的 `control-api.makefile.so` / Worker / D1 主路径表述
 44-- 保持 `status-api` 仅为本地只读观察面
 45-
 46-## 本任务不包含
 47-
 48-- 不删除 `conductor-daemon`
 49-- 不删除 `status-api`
 50-- 不删除 `worker-runner`
 51-- 不改动 write scope 以外的残留兼容代码
 52-
 53-## 建议起始文件
 54-
 55-- `plugins/baa-firefox/controller.html`
 56-- `plugins/baa-firefox/README.md`
 57-- `docs/api/README.md`
 58-- `docs/runtime/launchd.md`
 59-- `scripts/runtime/common.sh`
 60-- `scripts/runtime/install-mini.sh`
 61-
 62-## 交付物
 63-
 64-- 已删除的 `apps/control-api-worker`
 65-- 默认走 `conductor.makefile.so` 的运行脚本
 66-- 去掉旧主控制面表述后的插件/运行/运维文档
 67-
 68-## 验收
 69-
 70-- `pnpm -r build` 通过
 71-- 文档口径与脚本默认值一致
 72-- `git diff --check` 通过
 73-
 74-## files_changed
 75-
 76-- `tasks/T-C004.md`
 77-- `apps/control-api-worker/**`(已删除)
 78-- `scripts/runtime/common.sh`
 79-- `scripts/runtime/install-mini.sh`
 80-- `plugins/baa-firefox/controller.html`
 81-- `plugins/baa-firefox/README.md`
 82-- `plugins/baa-firefox/docs/conductor-control.md`
 83-- `docs/firefox/README.md`
 84-- `docs/api/README.md`
 85-- `docs/api/business-interfaces.md`
 86-- `docs/api/hand-shell-migration.md`
 87-- `docs/api/local-host-ops.md`
 88-- `docs/auth/README.md`
 89-- `docs/ops/README.md`
 90-- `docs/runtime/README.md`
 91-- `docs/runtime/environment.md`
 92-- `docs/runtime/launchd.md`
 93-- `docs/runtime/node-verification.md`
 94-- `docs/runtime/codexd.md`
 95-
 96-## commands_run
 97-
 98-- `git -C /Users/george/code/baa-conductor worktree add -b feat/remove-worker-and-cutover /Users/george/code/worktrees/baa-conductor-t-c004 main`
 99-- `npx --yes pnpm -r build`
100-- `npx --yes pnpm install --frozen-lockfile`
101-- `ln -s /Users/george/code/baa-conductor/node_modules /Users/george/code/worktrees/baa-conductor-t-c004/node_modules`
102-- `npx --yes pnpm -r build`
103-- `git -C /Users/george/code/worktrees/baa-conductor-t-c004 diff --check`
104-
105-## result
106-
107-- 删除了 `apps/control-api-worker` 整个应用目录,主线 workspace 不再包含 Cloudflare Worker 兼容实现
108-- runtime 脚本默认把兼容变量 `BAA_CONTROL_API_BASE` 收口到 `https://conductor.makefile.so`
109-- `install-mini.sh` 默认改读 `runtime-secrets.env`,仅在需要时回退到 legacy `control-api-worker.secrets.env`
110-- Firefox 插件文案、运行文档和 API/运维文档已统一为“本地 WS + conductor.makefile.so”,并明确 `status-api` 只保留本地只读角色
111-- 保留并恢复了 `codexd` 设计文档与入口,不再把这次删旧任务扩散成对 `codexd` 规划的回退
112-- `pnpm -r build` 与 `git diff --check` 已通过
113-
114-## risks
115-
116-- 仓库 write scope 之外仍有 legacy 残留,例如根 `README.md`、`ops/cloudflare/**`、`tests/control-api/**` 和部分 `apps/status-api` / `apps/conductor-daemon` 内部命名,当前任务未触碰
117-- 本次构建验证依赖主仓库现有 `node_modules`;原因是当前 `pnpm-lock.yaml` 本身已落后于仓库 package 定义,无法在 clean worktree 里直接 `pnpm install --frozen-lockfile`
118-
119-## next_handoff
120-
121-- 如果后续继续做全量删旧,优先处理 write scope 外的 `ops/cloudflare/**`、`tests/control-api/**` 和根文档残留
122-- 如需让 clean worktree 可直接安装依赖,应先单独修正现有 `pnpm-lock.yaml` 与 workspace package 定义不一致的问题
D tasks/T-L001.md
+0, -106
  1@@ -1,106 +0,0 @@
  2----
  3-task_id: T-L001
  4-title: 文档与切换方案收口
  5-status: done
  6-branch: feat/local-api-cutover-docs
  7-repo: /Users/george/code/baa-conductor
  8-base_ref: main@c9e1441
  9-depends_on: []
 10-write_scope:
 11-  - README.md
 12-  - DESIGN.md
 13-  - docs/api/**
 14-  - docs/ops/**
 15-  - docs/runtime/**
 16-  - plans/**
 17-  - tasks/T-L001.md
 18-updated_at: 2026-03-22
 19----
 20-
 21-# T-L001 文档与切换方案收口
 22-
 23-## 目标
 24-
 25-把仓库文档统一收口为以下口径:
 26-
 27-- `mini` 本地接口 `http://100.71.210.78:4317` 是唯一主接口
 28-- 对外统一使用 `https://conductor.makefile.so`
 29-- `control-api.makefile.so`、Cloudflare Worker、D1 不再作为默认控制面
 30-- `baa-hand` / `baa-shell` 只保留为参考,不再继续维护为主系统
 31-
 32-## 本任务包含
 33-
 34-- 更新顶层设计与 README
 35-- 更新 `docs/api`、`docs/ops`、`docs/runtime`
 36-- 更新 `plans` 里的协作和状态说明
 37-- 给后续 cutover 任务写清迁移顺序和删旧范围
 38-
 39-## 本任务不包含
 40-
 41-- 不修改 app 代码
 42-- 不修改 `plugins/baa-firefox/**`
 43-- 不实现新的 API 路由
 44-
 45-## 建议起始文件
 46-
 47-- `README.md`
 48-- `DESIGN.md`
 49-- `docs/api/README.md`
 50-- `docs/api/hand-shell-migration.md`
 51-- `docs/ops/README.md`
 52-- `docs/runtime/README.md`
 53-
 54-## 交付物
 55-
 56-- 一组自洽的 cutover 文档
 57-- 一张已回写状态的任务卡
 58-
 59-## 验收
 60-
 61-- 文档默认口径统一为 local API cutover
 62-- 明确 `conductor.makefile.so` / `100.71.210.78:4317`
 63-- 明确 legacy 兼容件与删旧范围
 64-- `git diff --check` 通过
 65-
 66-## files_changed
 67-
 68-- `README.md`
 69-- `DESIGN.md`
 70-- `docs/api/README.md`
 71-- `docs/api/hand-shell-migration.md`
 72-- `docs/ops/README.md`
 73-- `docs/runtime/README.md`
 74-- `docs/runtime/environment.md`
 75-- `docs/runtime/launchd.md`
 76-- `docs/runtime/node-verification.md`
 77-- `plans/TASK_OVERVIEW.md`
 78-- `plans/STATUS_SUMMARY.md`
 79-- `plans/WORKFLOW.md`
 80-- `tasks/T-L001.md`
 81-
 82-## commands_run
 83-
 84-- `git status --short --branch`
 85-- `git rev-parse --short HEAD`
 86-- `sed -n '1,260p' ...` 读取顶层、API、ops、runtime、plans 文档
 87-- `rg -n "control-api\\.makefile\\.so|Cloudflare Worker|D1|baa-hand|baa-shell|..." ...` 盘点旧口径
 88-- `git diff --stat`
 89-- `git diff --check`
 90-
 91-## result
 92-
 93-- 把仓库主文档统一收口为 `mini` 本地 `4317` 是唯一主接口、`conductor.makefile.so` 是唯一 canonical 公网入口
 94-- 明确把 `control-api.makefile.so`、Cloudflare Worker、D1 降级为迁移期兼容件
 95-- 明确把 `baa-hand` / `baa-shell` 降级为参考实现
 96-- 给后续任务写清了 cutover 顺序、删旧范围和 runtime 兼容残留
 97-
 98-## risks
 99-
100-- app/runtime 代码仍保留 `BAA_CONTROL_API_BASE` 和 legacy control-plane 依赖,文档收口不等于代码已完成切换
101-- 仓库里存在与本任务无关的未提交代码改动,提交时必须只选中文档范围文件
102-
103-## next_handoff
104-
105-- 先把 discovery / control / task / run 路由并到 `4317`
106-- 再去掉 `status-api`、launchd 模板和运行脚本对 `BAA_CONTROL_API_BASE` 的默认依赖
107-- 最后删除 `control-api.makefile.so`、Cloudflare Worker、D1 和 public `status-api` 角色
D tasks/T-L003.md
+0, -104
  1@@ -1,104 +0,0 @@
  2----
  3-task_id: T-L003
  4-title: conductor-daemon 本地接口面合并
  5-status: done
  6-branch: feat/conductor-local-api-surface
  7-repo: /Users/george/code/baa-conductor
  8-base_ref: main
  9-depends_on:
 10-  - T-L002
 11-write_scope:
 12-  - apps/conductor-daemon/**
 13-  - packages/db/**
 14-  - docs/api/**
 15-  - README.md
 16-updated_at: 2026-03-22
 17----
 18-
 19-# conductor-daemon 本地接口面合并
 20-
 21-## 目标
 22-
 23-把原来分散在 `control-api-worker` 的业务控制接口并入 `conductor-daemon` 本地 HTTP 服务,并直接读取本地真相源。
 24-
 25-## 本任务包含
 26-
 27-- 在 `conductor-daemon` 暴露本地 describe / health / version / capabilities 接口
 28-- 在 `conductor-daemon` 暴露 system、controllers、tasks、runs 相关只读/控制接口
 29-- 给本地接口接入本地 repository,而不是继续回源远端 `control-api`
 30-- 补最小验证、文档和 README
 31-
 32-## 本任务不包含
 33-
 34-- 恢复 Cloudflare Worker 路径
 35-- 修改 `plugins/baa-firefox/**`
 36-- 恢复历史主备切换设计
 37-
 38-## 建议起始文件
 39-
 40-- `apps/conductor-daemon/src/index.ts`
 41-- `apps/conductor-daemon/src/index.test.js`
 42-- `packages/db/src/index.ts`
 43-- `docs/api/README.md`
 44-- `README.md`
 45-
 46-## 交付物
 47-
 48-- conductor-daemon 本地 HTTP 面新增/迁移后的业务接口
 49-- 本地 repository 读写与日志查询能力
 50-- API 文档和任务卡更新
 51-
 52-## 验收
 53-
 54-- `apps/conductor-daemon` typecheck / build 通过
 55-- 本地启动后能用 `curl` 验证关键接口
 56-- `git diff --check` 通过
 57-
 58-## files_changed
 59-
 60-- `apps/conductor-daemon/src/index.ts`
 61-- `apps/conductor-daemon/src/index.test.js`
 62-- `apps/conductor-daemon/src/http-types.ts`
 63-- `apps/conductor-daemon/src/local-api.ts`
 64-- `apps/conductor-daemon/src/local-control-plane.ts`
 65-- `apps/conductor-daemon/src/node-shims.d.ts`
 66-- `apps/conductor-daemon/package.json`
 67-- `packages/db/src/index.ts`
 68-- `packages/db/src/index.test.js`
 69-- `packages/db/src/node-shims.d.ts`
 70-- `packages/db/package.json`
 71-- `packages/db/tsconfig.json`
 72-- `docs/api/README.md`
 73-- `README.md`
 74-
 75-## commands_run
 76-
 77-- `git checkout -b feat/conductor-local-api-surface`
 78-- `npx pnpm -C /Users/george/code/baa-conductor/packages/db build`
 79-- `npx pnpm -C /Users/george/code/baa-conductor/packages/db test`
 80-- `npx pnpm -C /Users/george/code/baa-conductor/apps/conductor-daemon typecheck`
 81-- `npx pnpm -C /Users/george/code/baa-conductor/apps/conductor-daemon build`
 82-- `npx pnpm -C /Users/george/code/baa-conductor/apps/conductor-daemon test`
 83-- `curl http://127.0.0.1:43179/describe`
 84-- `curl http://127.0.0.1:43179/v1/system/state`
 85-- `curl -X POST http://127.0.0.1:43179/v1/system/pause`
 86-- `curl http://127.0.0.1:43179/v1/controllers`
 87-- `git diff --check`
 88-
 89-## result
 90-
 91-- `conductor-daemon` 现在默认创建本地 SQLite control-plane,并让 lease/heartbeat/system state 直接落本地真相源
 92-- 本地 HTTP 面已承接 `/describe`、`/health`、`/version`、`/v1/capabilities`、`/v1/system/state`
 93-- 本地 HTTP 面已承接 `/v1/system/pause`、`/v1/system/resume`、`/v1/system/drain`
 94-- 本地 HTTP 面已承接 `/v1/controllers`、`/v1/tasks`、`/v1/tasks/:task_id`、`/v1/tasks/:task_id/logs`、`/v1/runs`、`/v1/runs/:run_id`
 95-- `packages/db` 新增 SQLite D1 适配和 task log 列表查询,供 daemon 直接复用
 96-- 文档已更新为本地 API 真相源视角
 97-
 98-## risks
 99-
100-- `status-api` 和部分运行文档仍有旧的 `BAA_CONTROL_API_BASE`/control-api 描述,后续还需要继续 cutover
101-- 当前本地 API 仍是 local-network 信任模型,没有单独再叠加 bearer 鉴权
102-
103-## next_handoff
104-
105-- 继续把 `status-api` 和剩余运维脚本切到 `conductor-daemon local-api` 作为唯一业务真相源
D tasks/T-L004.md
+0, -95
 1@@ -1,95 +0,0 @@
 2----
 3-task_id: T-L004
 4-title: 本机能力层基础包
 5-status: done
 6-branch: feat/local-host-ops-package
 7-repo: /Users/george/code/baa-conductor
 8-base_ref: main@c9e1441
 9-depends_on:
10-  - T-L003
11-write_scope:
12-  - packages/host-ops/**
13-  - docs/api/**
14-updated_at: 2026-03-22
15----
16-
17-# 本机能力层基础包
18-
19-## 目标
20-
21-参考 `baa-shell`,在当前项目里落一个本地能力层包,承接:
22-
23-- `exec`
24-- `files/read`
25-- `files/write`
26-
27-这一步先不要求把接口直接挂到 `conductor-daemon` 上,先把底层能力和结构化返回做出来。
28-
29-## 本任务包含
30-
31-- 新建 `@baa-conductor/host-ops`
32-- 补 `exec` / `files/read` / `files/write` 的结构化合同
33-- 补最小 Node 实现
34-- 补最小 smoke / test
35-- 更新迁移文档,标记 host-ops 已经落地为后续 HTTP 接口基础层
36-
37-## 本任务不包含
38-
39-- 不把接口直接挂到 `conductor-daemon`
40-- 不修改 Firefox 插件
41-- 不恢复 Cloudflare Worker 路径
42-
43-## 建议起始文件
44-
45-- `packages/host-ops/package.json`
46-- `packages/host-ops/src/index.ts`
47-- `packages/host-ops/src/index.test.js`
48-- `docs/api/local-host-ops.md`
49-- `docs/api/hand-shell-migration.md`
50-
51-## 交付物
52-
53-- `@baa-conductor/host-ops` 包
54-- `docs/api/local-host-ops.md`
55-- 已回写状态的任务卡
56-
57-## 验收
58-
59-- `@baa-conductor/host-ops` typecheck / build / test 通过
60-- `git diff --check` 通过
61-
62-## files_changed
63-
64-- `tasks/T-L004.md`
65-- `packages/host-ops/package.json`
66-- `packages/host-ops/tsconfig.json`
67-- `packages/host-ops/src/index.ts`
68-- `packages/host-ops/src/index.test.js`
69-- `packages/host-ops/src/node-shims.d.ts`
70-- `docs/api/local-host-ops.md`
71-- `docs/api/hand-shell-migration.md`
72-
73-## commands_run
74-
75-- `npx --yes pnpm --filter @baa-conductor/host-ops typecheck`
76-- `npx --yes pnpm --filter @baa-conductor/host-ops build`
77-- `npx --yes pnpm --filter @baa-conductor/host-ops test`
78-- `git diff --check`
79-
80-## result
81-
82-- 新增 `@baa-conductor/host-ops`,提供 `executeCommand`、`readTextFile`、`writeTextFile`、`runHostOperation`
83-- 为 `exec` / `files/read` / `files/write` 定义了结构化 success / failure contract
84-- 增加了最小 Node 实现和 smoke test
85-- 增加 `docs/api/local-host-ops.md` 作为后续 `/v1/exec`、`/v1/files/read`、`/v1/files/write` 的合同文档
86-- 在迁移文档里记录 host-ops 已经落地,但尚未挂到 `conductor-daemon`
87-
88-## risks
89-
90-- 目前只是底层能力层,HTTP 路由还没接到 `conductor-daemon`
91-- 现在没有额外权限边界;后续挂 HTTP 时还需要明确路径限制和输入校验策略
92-
93-## next_handoff
94-
95-- 把 `@baa-conductor/host-ops` 接到 `conductor-daemon` 的 `/v1/exec`、`/v1/files/read`、`/v1/files/write`
96-- 给这些接口补 curl 示例和最小集成 smoke
A tasks/T-S001.md
+159, -0
  1@@ -0,0 +1,159 @@
  2+---
  3+task_id: T-S001
  4+title: 修复 codexd turn 完成状态
  5+status: todo
  6+branch: fix/codexd-turn-completion-state
  7+repo: /Users/george/code/baa-conductor
  8+base_ref: main@803c895
  9+depends_on: []
 10+write_scope:
 11+  - apps/codexd/**
 12+  - packages/codex-app-server/**
 13+  - docs/runtime/codexd.md
 14+  - bugs/BUG-008-codexd-second-thread-turn-timeout.md
 15+  - bugs/BUG-010-codexd-turn-status-stuck-inprogress.md
 16+updated_at: 2026-03-24
 17+---
 18+
 19+# Task T-S001:修复 codexd turn 完成状态
 20+
 21+## 直接给对话的提示词
 22+
 23+读 `/Users/george/code/baa-conductor/tasks/T-S001.md` 任务文档,完成开发任务。
 24+
 25+如需补背景,再读:
 26+
 27+- `/Users/george/code/baa-conductor/bugs/BUG-010-codexd-turn-status-stuck-inprogress.md`
 28+- `/Users/george/code/baa-conductor/bugs/BUG-008-codexd-second-thread-turn-timeout.md`
 29+- `/Users/george/code/baa-conductor/apps/codexd/src/daemon.ts`
 30+- `/Users/george/code/baa-conductor/apps/codexd/src/app-server-transport.ts`
 31+- `/Users/george/code/baa-conductor/apps/codexd/src/index.test.js`
 32+- `/Users/george/code/baa-conductor/docs/runtime/codexd.md`
 33+
 34+## 建议分支名
 35+
 36+- `fix/codexd-turn-completion-state`
 37+
 38+## 目标
 39+
 40+修复 codexd 在 turn 实际完成后 `session.lastTurnStatus` 仍停留在 `inProgress` 的问题,并把它和 `BUG-008` 的关系收口清楚。
 41+
 42+## 背景
 43+
 44+- 当前 `BUG-010` 表现是:agent 已经产出最终消息,但 codexd 侧 session / turn 状态没有完成收尾。
 45+- `BUG-008` 已经部分缓解,但两者都落在 codexd 的 transport / lifecycle / turn 状态处理上,容易互相影响。
 46+- 这会直接破坏 codexd 作为多 session / thread 代理的稳定性,也会让上游调用方无法可靠判断 turn 是否完成。
 47+
 48+## 涉及仓库
 49+
 50+- `/Users/george/code/baa-conductor`
 51+
 52+## 范围
 53+
 54+- 修复 codexd turn 完成态收口逻辑
 55+- 增加能稳定覆盖问题与修复的测试
 56+- 在 runtime 文档和 bug 文档里补齐当前行为结论
 57+
 58+## 路径约束
 59+
 60+- 只在 `apps/codexd/**`、`packages/codex-app-server/**`、`docs/runtime/codexd.md` 和对应 bug 文档内工作。
 61+- 如果需要补测试,优先落在现有 `apps/codexd/src/index.test.js` 或同目录最小新增文件里。
 62+
 63+## 推荐实现边界
 64+
 65+建议优先检查:
 66+
 67+- `codexd` 对 app-server 消息流结束、turn 完成、session 状态回写的边界
 68+- `app-server-transport` 的 close / reconnect / detach 触发条件
 69+- 第二个 session / thread 与第一个 session 完成后的状态复用问题
 70+
 71+## 允许修改的目录
 72+
 73+- `/Users/george/code/baa-conductor/apps/codexd/`
 74+- `/Users/george/code/baa-conductor/packages/codex-app-server/`
 75+- `/Users/george/code/baa-conductor/docs/runtime/codexd.md`
 76+- `/Users/george/code/baa-conductor/bugs/BUG-008-codexd-second-thread-turn-timeout.md`
 77+- `/Users/george/code/baa-conductor/bugs/BUG-010-codexd-turn-status-stuck-inprogress.md`
 78+
 79+## 尽量不要修改
 80+
 81+- `/Users/george/code/baa-conductor/apps/conductor-daemon/`
 82+- `/Users/george/code/baa-conductor/apps/status-api/`
 83+- `/Users/george/code/baa-conductor/bugs/README.md`
 84+
 85+## 必须完成
 86+
 87+### 1. 修复 turn 完成态收口
 88+
 89+- 让 codexd 在收到最终完成信号后可靠把 `lastTurnStatus` 从 `inProgress` 推进到完成态
 90+- 不要靠超时、重试或额外轮询掩盖问题
 91+
 92+### 2. 覆盖多 session / thread 场景
 93+
 94+- 至少覆盖第一个 session 完成后,第二个 session / thread 继续发 turn 的稳定路径
 95+- 明确 `BUG-008` 现在是仍独立存在,还是已随本次修复一并消失
 96+
 97+### 3. 回写文档和 bug 状态
 98+
 99+- 更新 `docs/runtime/codexd.md`,说明当前完成态行为
100+- 在 `BUG-008` / `BUG-010` 文档里写清楚根因关系、当前状态和剩余风险
101+
102+## 需要特别注意
103+
104+- 不要恢复旧的 codex exec 正式模式
105+- 不要顺手做大重构,优先最小修复
106+- 本任务与其它并行任务边界明确,不要修改 `apps/conductor-daemon/**` 或 `apps/status-api/**`
107+
108+## 验收标准
109+
110+- codexd turn 完成后,状态不会再卡在 `inProgress`
111+- 至少有一个测试稳定覆盖修复前会失败、修复后通过的路径
112+- 能明确说明 `BUG-008` 和 `BUG-010` 当前各自状态
113+- `git diff --check` 通过
114+
115+## 推荐验证命令
116+
117+- `npx --yes pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/codexd typecheck`
118+- `npx --yes pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/codexd build`
119+- `node --test /Users/george/code/baa-conductor/apps/codexd/src/index.test.js`
120+- `git -C /Users/george/code/baa-conductor diff --check`
121+
122+## 交付要求
123+
124+完成后请说明:
125+
126+- 修改了哪些文件
127+- 根因是什么
128+- 修复点落在哪些 lifecycle / transport / session 状态逻辑
129+- 跑了哪些测试
130+- `BUG-008`、`BUG-010` 现在各自状态
131+
132+## 更新要求
133+
134+开始时更新 frontmatter 的:
135+
136+- `status`
137+- `base_ref`
138+- `updated_at`
139+
140+完成后补充下面这些内容:
141+
142+## files_changed
143+
144+- 待完成
145+
146+## commands_run
147+
148+- 待完成
149+
150+## result
151+
152+- 待完成
153+
154+## risks
155+
156+- 待完成
157+
158+## next_handoff
159+
160+- 待完成
A tasks/T-S002.md
+158, -0
  1@@ -0,0 +1,158 @@
  2+---
  3+task_id: T-S002
  4+title: 清理 control-api-worker 残留与坏测试
  5+status: todo
  6+branch: chore/remove-control-api-worker-residuals
  7+repo: /Users/george/code/baa-conductor
  8+base_ref: main@803c895
  9+depends_on: []
 10+write_scope:
 11+  - apps/control-api-worker/**
 12+  - tests/control-api/**
 13+  - ops/cloudflare/**
 14+  - scripts/cloudflare/**
 15+updated_at: 2026-03-24
 16+---
 17+
 18+# Task T-S002:清理 control-api-worker 残留与坏测试
 19+
 20+## 直接给对话的提示词
 21+
 22+读 `/Users/george/code/baa-conductor/tasks/T-S002.md` 任务文档,完成开发任务。
 23+
 24+如需补背景,再读:
 25+
 26+- `/Users/george/code/baa-conductor/tests/control-api/control-api-smoke.test.mjs`
 27+- `/Users/george/code/baa-conductor/apps/control-api-worker`
 28+- `/Users/george/code/baa-conductor/ops/cloudflare/README.md`
 29+- `/Users/george/code/baa-conductor/ops/cloudflare/deploy-control-api-worker.sh`
 30+- `/Users/george/code/baa-conductor/ops/cloudflare/apply-control-api-d1-migrations.sh`
 31+- `/Users/george/code/baa-conductor/scripts/cloudflare/prepare-control-api-local-db.mjs`
 32+- `/Users/george/code/baa-conductor/README.md`
 33+
 34+## 建议分支名
 35+
 36+- `chore/remove-control-api-worker-residuals`
 37+
 38+## 目标
 39+
 40+让仓库不再同时处于“README 说 control-api-worker 已移除,但目录、脚本和测试仍继续引用”的矛盾状态,并修掉当前直接坏掉的 `tests/control-api`。
 41+
 42+## 背景
 43+
 44+- `tests/control-api/control-api-smoke.test.mjs` 当前会因为缺少 `apps/control-api-worker/local/harness.mjs` 直接失败。
 45+- `ops/cloudflare/**` 和 `scripts/cloudflare/**` 还在继续按已删除 Worker 的部署方式写脚本和文档。
 46+- 主线已经转向 `conductor-daemon + codexd + 本地浏览器桥`,旧 Worker 相关残留应该收干净,而不是继续假装还能工作。
 47+
 48+## 涉及仓库
 49+
 50+- `/Users/george/code/baa-conductor`
 51+
 52+## 范围
 53+
 54+- 处理 `apps/control-api-worker/**` 的残留目录或产物
 55+- 修正、删除或替换 `tests/control-api/**`
 56+- 清理 `ops/cloudflare/**` 和 `scripts/cloudflare/**` 中对旧 Worker 的错误引用
 57+
 58+## 路径约束
 59+
 60+- 本任务只清 legacy Worker / D1 残留,不处理 `status-api` 的主接口切换。
 61+- 优先在已有残留文件范围内收口,不把修改扩散到运行时主路径。
 62+
 63+## 推荐实现边界
 64+
 65+建议优先做:
 66+
 67+- 明确 `apps/control-api-worker` 目录里还有哪些内容是真残留,哪些只是构建垃圾
 68+- 决定 `tests/control-api/**` 是删掉、替换为静态约束,还是改成新主线接口的测试
 69+- 清掉已经不再成立的 Cloudflare / D1 操作说明和脚本入口
 70+
 71+## 允许修改的目录
 72+
 73+- `/Users/george/code/baa-conductor/apps/control-api-worker/`
 74+- `/Users/george/code/baa-conductor/tests/control-api/`
 75+- `/Users/george/code/baa-conductor/ops/cloudflare/`
 76+- `/Users/george/code/baa-conductor/scripts/cloudflare/`
 77+
 78+## 尽量不要修改
 79+
 80+- `/Users/george/code/baa-conductor/README.md`
 81+- `/Users/george/code/baa-conductor/plans/`
 82+- `/Users/george/code/baa-conductor/apps/status-api/`
 83+- `/Users/george/code/baa-conductor/scripts/runtime/`
 84+- `/Users/george/code/baa-conductor/ops/launchd/`
 85+
 86+## 必须完成
 87+
 88+### 1. 清掉已失效的 Worker 残留
 89+
 90+- 明确删掉或收口 `apps/control-api-worker/**` 中不该继续保留的内容
 91+- 不要留下“目录还在,但实际完全不可用”的假象
 92+
 93+### 2. 处理坏掉的 control-api 测试
 94+
 95+- 让 `tests/control-api/**` 不再引用不存在的 harness
 96+- 如果选择删除或替换测试,要在结果里说明理由
 97+
 98+### 3. 收口 Cloudflare / D1 残留
 99+
100+- 修正或删除 `ops/cloudflare/**`、`scripts/cloudflare/**` 中已不成立的入口
101+- 让这些路径至少与当前仓库现实保持一致
102+
103+## 需要特别注意
104+
105+- 不要顺手改 `status-api` 或 `conductor-daemon`
106+- 不要把 legacy 清理变成新功能开发
107+- 本任务与并行的 `status-api` cutover、codexd bug 修复应保持零重叠
108+
109+## 验收标准
110+
111+- `tests/control-api/**` 不再因为引用缺失文件而直接爆炸
112+- `apps/control-api-worker/**`、`ops/cloudflare/**`、`scripts/cloudflare/**` 的状态与当前仓库口径一致
113+- 最终结果里能明确说明删了什么、保留了什么
114+- `git diff --check` 通过
115+
116+## 推荐验证命令
117+
118+- `node --test /Users/george/code/baa-conductor/tests/control-api/control-api-smoke.test.mjs`
119+- `git -C /Users/george/code/baa-conductor diff --check`
120+
121+## 交付要求
122+
123+完成后请说明:
124+
125+- 修改了哪些文件
126+- 删除了哪些残留
127+- `tests/control-api` 最终是修复、替换还是删除
128+- 跑了哪些验证
129+- 还保留了哪些兼容件
130+
131+## 更新要求
132+
133+开始时更新 frontmatter 的:
134+
135+- `status`
136+- `base_ref`
137+- `updated_at`
138+
139+完成后补充下面这些内容:
140+
141+## files_changed
142+
143+- 待完成
144+
145+## commands_run
146+
147+- 待完成
148+
149+## result
150+
151+- 待完成
152+
153+## risks
154+
155+- 待完成
156+
157+## next_handoff
158+
159+- 待完成
A tasks/T-S003.md
+161, -0
  1@@ -0,0 +1,161 @@
  2+---
  3+task_id: T-S003
  4+title: 切换 status-api 到 conductor 主接口
  5+status: todo
  6+branch: feat/status-api-local-truth-cutover
  7+repo: /Users/george/code/baa-conductor
  8+base_ref: main@803c895
  9+depends_on: []
 10+write_scope:
 11+  - apps/status-api/**
 12+  - scripts/runtime/**
 13+  - ops/launchd/**
 14+  - docs/runtime/**
 15+  - docs/api/README.md
 16+updated_at: 2026-03-24
 17+---
 18+
 19+# Task T-S003:切换 status-api 到 conductor 主接口
 20+
 21+## 直接给对话的提示词
 22+
 23+读 `/Users/george/code/baa-conductor/tasks/T-S003.md` 任务文档,完成开发任务。
 24+
 25+如需补背景,再读:
 26+
 27+- `/Users/george/code/baa-conductor/apps/status-api/src/data-source.ts`
 28+- `/Users/george/code/baa-conductor/apps/status-api/src/service.ts`
 29+- `/Users/george/code/baa-conductor/docs/runtime/README.md`
 30+- `/Users/george/code/baa-conductor/docs/runtime/environment.md`
 31+- `/Users/george/code/baa-conductor/scripts/runtime/install-launchd.sh`
 32+- `/Users/george/code/baa-conductor/scripts/runtime/check-launchd.sh`
 33+- `/Users/george/code/baa-conductor/ops/launchd/so.makefile.baa-status-api.plist`
 34+- `/Users/george/code/baa-conductor/docs/api/README.md`
 35+
 36+## 建议分支名
 37+
 38+- `feat/status-api-local-truth-cutover`
 39+
 40+## 目标
 41+
 42+让 `status-api` 默认真相源切到当前 `conductor` 主接口,并把运行脚本、launchd 模板和文档里对 `BAA_CONTROL_API_BASE` 的口径降到兼容变量,而不是 legacy truth source。
 43+
 44+## 背景
 45+
 46+- 当前主线 canonical local API 已经是 `http://100.71.210.78:4317`。
 47+- `status-api` 仍默认经由 `BAA_CONTROL_API_BASE` 指向 `https://control-api.makefile.so`,这和现状不一致。
 48+- 运行文档、launchd 模板和检查脚本里也还保留类似口径,容易让后续维护继续沿着旧 control plane 走偏。
 49+
 50+## 涉及仓库
 51+
 52+- `/Users/george/code/baa-conductor`
 53+
 54+## 范围
 55+
 56+- 修改 `apps/status-api/**` 的默认数据源
 57+- 更新 `scripts/runtime/**` 和 `ops/launchd/**` 的默认配置口径
 58+- 回写 `docs/runtime/**` 和 `docs/api/README.md`
 59+
 60+## 路径约束
 61+
 62+- 只处理 `status-api` 与其运行文档/模板,不修改 `conductor-daemon` 的 HTTP 行为。
 63+- `BAA_CONTROL_API_BASE` 可以保留兼容入口,但不能继续被描述成 canonical truth source。
 64+
 65+## 推荐实现边界
 66+
 67+建议优先收口:
 68+
 69+- `status-api` 默认读取的上游地址与描述文本
 70+- launchd 安装、检查脚本和 plist 模板里的默认值
 71+- 运行文档里对本地 `4317`、公网 `conductor.makefile.so`、legacy control-api 的关系说明
 72+
 73+## 允许修改的目录
 74+
 75+- `/Users/george/code/baa-conductor/apps/status-api/`
 76+- `/Users/george/code/baa-conductor/scripts/runtime/`
 77+- `/Users/george/code/baa-conductor/ops/launchd/`
 78+- `/Users/george/code/baa-conductor/docs/runtime/`
 79+- `/Users/george/code/baa-conductor/docs/api/README.md`
 80+
 81+## 尽量不要修改
 82+
 83+- `/Users/george/code/baa-conductor/apps/conductor-daemon/`
 84+- `/Users/george/code/baa-conductor/tests/control-api/`
 85+- `/Users/george/code/baa-conductor/ops/cloudflare/`
 86+- `/Users/george/code/baa-conductor/bugs/`
 87+
 88+## 必须完成
 89+
 90+### 1. 切换 status-api 默认真相源
 91+
 92+- 让 `status-api` 默认读取当前主线 `conductor` 接口
 93+- 不再默认依赖 `control-api.makefile.so`
 94+
 95+### 2. 收口运行脚本和 launchd 模板
 96+
 97+- 让安装、检查脚本和 plist 模板与新的默认真相源保持一致
 98+- 如果保留兼容变量,要明确其兼容性质
 99+
100+### 3. 回写文档
101+
102+- 更新 runtime 文档和 API 入口文档
103+- 明确现在默认读哪里、什么时候才需要 legacy 兼容变量
104+
105+## 需要特别注意
106+
107+- 不要顺手处理 `ops/cloudflare/**` 或 `tests/control-api/**`
108+- 不要把本任务扩展成 `status-api` 的功能重构
109+- 本任务会改文档和运行脚本,注意与其它并行任务的写范围隔离
110+
111+## 验收标准
112+
113+- `status-api` 默认不再把 legacy control-api 当作真相源
114+- 运行脚本、launchd 模板、文档口径与当前主线一致
115+- 最终结果里能明确说明哪些地方仍保留兼容变量
116+- `git diff --check` 通过
117+
118+## 推荐验证命令
119+
120+- `npx --yes pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/status-api build`
121+- `npx --yes pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/status-api smoke`
122+- `git -C /Users/george/code/baa-conductor diff --check`
123+
124+## 交付要求
125+
126+完成后请说明:
127+
128+- 修改了哪些文件
129+- `status-api` 默认现在读哪里
130+- 哪些地方仍保留 `BAA_CONTROL_API_BASE` 兼容入口
131+- 跑了哪些验证
132+- 还有哪些 legacy 没清完
133+
134+## 更新要求
135+
136+开始时更新 frontmatter 的:
137+
138+- `status`
139+- `base_ref`
140+- `updated_at`
141+
142+完成后补充下面这些内容:
143+
144+## files_changed
145+
146+- 待完成
147+
148+## commands_run
149+
150+- 待完成
151+
152+## result
153+
154+- 待完成
155+
156+## risks
157+
158+- 待完成
159+
160+## next_handoff
161+
162+- 待完成
A tasks/T-S004.md
+151, -0
  1@@ -0,0 +1,151 @@
  2+---
  3+task_id: T-S004
  4+title: 修复 conductor-daemon 测试 listener 泄漏
  5+status: todo
  6+branch: fix/conductor-daemon-test-listener-leak
  7+repo: /Users/george/code/baa-conductor
  8+base_ref: main@803c895
  9+depends_on: []
 10+write_scope:
 11+  - apps/conductor-daemon/src/index.test.js
 12+  - apps/conductor-daemon/src/index.ts
 13+  - bugs/BUG-009-conductor-daemon-index-test-leaks-local-listener.md
 14+updated_at: 2026-03-24
 15+---
 16+
 17+# Task T-S004:修复 conductor-daemon 测试 listener 泄漏
 18+
 19+## 直接给对话的提示词
 20+
 21+读 `/Users/george/code/baa-conductor/tasks/T-S004.md` 任务文档,完成开发任务。
 22+
 23+如需补背景,再读:
 24+
 25+- `/Users/george/code/baa-conductor/bugs/BUG-009-conductor-daemon-index-test-leaks-local-listener.md`
 26+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
 27+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.ts`
 28+
 29+## 建议分支名
 30+
 31+- `fix/conductor-daemon-test-listener-leak`
 32+
 33+## 目标
 34+
 35+修复 `conductor-daemon` 测试在异常路径下遗留本地 HTTP listener、导致 `node --test` 挂住的问题,并把 cleanup 边界收紧到稳定可复现的最小修复。
 36+
 37+## 背景
 38+
 39+- `BUG-009` 指向的是测试层资源清理不完整,而不是运行时主功能错误。
 40+- 这类问题容易让 CI 或本地回归在失败后卡住,浪费排查时间。
 41+- 当前优先需要的是让测试 fixture / setup / teardown 在异常路径下也能可靠释放 listener。
 42+
 43+## 涉及仓库
 44+
 45+- `/Users/george/code/baa-conductor`
 46+
 47+## 范围
 48+
 49+- 修复 `apps/conductor-daemon/src/index.test.js` 的 cleanup 路径
 50+- 只在必要时微调 `apps/conductor-daemon/src/index.ts`
 51+- 更新 `BUG-009` 文档说明
 52+
 53+## 路径约束
 54+
 55+- 优先用 `try/finally`、fixture helper 或统一 teardown 收口。
 56+- 不做无关重构,不扩散到其它测试文件。
 57+
 58+## 推荐实现边界
 59+
 60+建议优先检查:
 61+
 62+- 测试里创建本地 listener 的 helper 是否总能进入 cleanup
 63+- 失败断言、提前 return、异常抛出路径是否绕过了关闭动作
 64+- 是否需要把 cleanup 责任从测试调用点移到更稳定的 helper 包装里
 65+
 66+## 允许修改的目录
 67+
 68+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
 69+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.ts`
 70+- `/Users/george/code/baa-conductor/bugs/BUG-009-conductor-daemon-index-test-leaks-local-listener.md`
 71+
 72+## 尽量不要修改
 73+
 74+- `/Users/george/code/baa-conductor/apps/codexd/`
 75+- `/Users/george/code/baa-conductor/apps/status-api/`
 76+- `/Users/george/code/baa-conductor/bugs/README.md`
 77+
 78+## 必须完成
 79+
 80+### 1. 修复测试 cleanup
 81+
 82+- 让异常路径下的 listener 也一定能关闭
 83+- 避免依赖人工排查或二次运行才能释放资源
 84+
 85+### 2. 覆盖复现路径
 86+
 87+- 至少用现有测试或新增最小测试证明挂住问题已被覆盖
 88+- 最好能重复运行同一组测试而不残留 listener
 89+
 90+### 3. 回写 bug 文档
 91+
 92+- 在 `BUG-009` 里写清根因、修复方式和剩余风险
 93+
 94+## 需要特别注意
 95+
 96+- 不要顺手改 codexd 或 status-api
 97+- 这是测试稳定性修复,不要把任务扩展成运行时架构调整
 98+- 与并行任务共享 `bugs/` 目录时,只改自己的 bug 文档
 99+
100+## 验收标准
101+
102+- `conductor-daemon` 测试不再因本地 listener 残留而挂住
103+- 重复运行指定测试时没有资源泄漏迹象
104+- `BUG-009` 文档已回写根因与修复结果
105+- `git diff --check` 通过
106+
107+## 推荐验证命令
108+
109+- `npx --yes pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon test`
110+- `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
111+- `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
112+- `git -C /Users/george/code/baa-conductor diff --check`
113+
114+## 交付要求
115+
116+完成后请说明:
117+
118+- 修改了哪些文件
119+- 泄漏根因是什么
120+- 你如何保证 cleanup 一定执行
121+- 跑了哪些验证
122+- 还存在哪些残余风险
123+
124+## 更新要求
125+
126+开始时更新 frontmatter 的:
127+
128+- `status`
129+- `base_ref`
130+- `updated_at`
131+
132+完成后补充下面这些内容:
133+
134+## files_changed
135+
136+- 待完成
137+
138+## commands_run
139+
140+- 待完成
141+
142+## result
143+
144+- 待完成
145+
146+## risks
147+
148+- 待完成
149+
150+## next_handoff
151+
152+- 待完成
R plans/TASK_OVERVIEW.md => tasks/TASK_OVERVIEW.md
+18, -8
 1@@ -8,15 +8,22 @@
 2 - canonical public host: `https://conductor.makefile.so`
 3 - `control-api.makefile.so`、Cloudflare Worker、D1 只剩迁移期兼容残留
 4 - `baa-hand` / `baa-shell` 只保留为接口语义参考,不再作为主系统维护
 5-- 活动任务见 [`tasks/`](../tasks/)
 6+- 当前任务卡都放在本目录
 7 
 8-## 当前建议
 9+## 当前活动任务
10 
11-如果还要继续维护这个仓库,当前优先顺序是:
12+按优先级和可并行性,当前活动任务是:
13 
14-1. 去掉 `status-api`、launchd 模板和运行文档对 `BAA_CONTROL_API_BASE` 的 legacy 真相源依赖
15-2. 清理 `tests/control-api/**`、`ops/cloudflare/**` 和其它 write scope 外的删旧残留
16-3. 修复并关闭当前活跃 bug,尤其是 `BUG-009`、`BUG-010`
17+1. [`T-S001.md`](./T-S001.md):修复 codexd turn 完成状态
18+2. [`T-S002.md`](./T-S002.md):清理 `control-api-worker` 残留与坏测试
19+3. [`T-S003.md`](./T-S003.md):切换 `status-api` 到 `conductor` 主接口
20+4. [`T-S004.md`](./T-S004.md):修复 `conductor-daemon` 测试 listener 泄漏
21+
22+并行建议:
23+
24+- `T-S001`、`T-S002` 优先,且可以并行
25+- `T-S003`、`T-S004` 也可以并行,但优先级略低于前两项
26+- 新任务继续按 `write_scope` 尽量拆成零重叠目录
27 
28 ## 现在该读什么
29 
30@@ -24,11 +31,14 @@
31 2. [`../docs/api/README.md`](../docs/api/README.md)
32 3. [`../docs/runtime/README.md`](../docs/runtime/README.md)
33 4. [`../docs/ops/README.md`](../docs/ops/README.md)
34-5. [`STATUS_SUMMARY.md`](./STATUS_SUMMARY.md)
35+5. [`../plans/STATUS_SUMMARY.md`](../plans/STATUS_SUMMARY.md)
36+6. 对应的任务卡
37 
38 ## 如需新任务
39 
40-- 直接在 `tasks/` 新建任务卡
41+- 直接在当前 `tasks/` 目录新建任务卡
42 - 所有新任务默认以 `100.71.210.78:4317` 和 `conductor.makefile.so` 为 canonical 接口面
43 - `control-api.makefile.so` 只允许作为删旧前的兼容背景出现
44+- 当前任务编号继续使用 `T-S***`
45+- 能并行的任务优先拆开,并明确写清 `write_scope`
46 - 不再恢复旧 wave 文档;历史内容继续靠 tag `ha-failover-archive-2026-03-22` 回溯
D tasks/browser-control/README.md
+0, -66
 1@@ -1,66 +0,0 @@
 2-# baa-conductor 浏览器控制当前任务
 3-
 4-## 最短用法
 5-
 6-以后如果还要继续扩浏览器控制,直接让 Codex 先读本目录 README 和对应任务卡;不要再引用已经迁走的桌面临时目录。
 7-
 8-现有任务卡已经包含:
 9-
10-- 仓库和基线要求
11-- 分支 / worktree 约束
12-- 修改范围限制
13-- 验收标准
14-- 结束时必须说明的内容
15-
16-## 当前状态
17-
18-- `T-BRW001` 已完成并在 `main`
19-- `T-BRW002` 已完成并在 `main`
20-- `T-BRW003` 已完成并在 `main`
21-- `T-BRW004` 已完成并在 `main`
22-- `VERIFY-BROWSER-CONNECTION` 已完成
23-- 当前没有活跃中的 browser-control 子任务
24-
25-## 当前可执行顺序
26-
27-1. 浏览器控制主线已经收口到当前 `main`
28-2. 如需继续开发,先确认是补新平台能力,还是处理 legacy cleanup / bugfix
29-3. 不要再按旧顺序把 `T-BRW002`、`T-BRW003`、`T-BRW004` 当成未开始任务
30-
31-当前唯一有效基线:
32-
33-- 仓库:`/Users/george/code/baa-conductor`
34-- 分支:`main`
35-- 提交:以当前 `main` 为准
36-
37-目标:
38-
39-- 让 `conductor` 通过本地 Firefox WS bridge 控制浏览器插件
40-- 增加网页控制能力:
41-  - 打开/聚焦标签页
42-  - 请求凭证刷新
43-  - 代理页面 API 请求
44-  - 发起 Claude 网页对话
45-  - 读取当前对话内容
46-- 外部调用方只控制 `conductor` HTTP;不直接控制插件
47-
48-约束:
49-
50-- `Firefox` 插件仍然只跑在 `mini`
51-- 本地双向通讯用 `/ws/firefox`
52-- 远程/CLI/网页 AI 只打 `conductor` HTTP
53-- 先做 `Claude` 页面能力,`ChatGPT/Gemini` 只保留现有监测/凭证逻辑
54-- 不把 `/ws/firefox` 暴露成公网入口
55-
56-当前主线已经具备:
57-
58-- `conductor` 侧 `/v1/browser/*`
59-- 本地 `/ws/firefox` bridge
60-- Firefox 插件 Claude 页面内 HTTP 代理链路
61-- browser-control e2e smoke
62-
63-剩余工作不在本目录继续拆分,优先看仓库级残留:
64-
65-- legacy cleanup
66-- `status-api` cutover
67-- 现有 bug 卡
D tasks/browser-control/T-BRW001.md
+0, -77
 1@@ -1,77 +0,0 @@
 2-你在仓库 `/Users/george/code/baa-conductor` 工作。
 3-
 4-必须从当前 `main` 基线开始:`main@8a3a964`。
 5-不要从其他任务分支切出。
 6-如果本地已有旧 worktree/分支,不要复用,重新从 `main` 建干净 worktree。
 7-
 8-任务:Firefox WS bridge server command surface
 9-建议分支:`feat/browser-ws-command-surface`
10-
11-先读:
12-1. `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-ws.ts`
13-2. `/Users/george/code/baa-conductor/docs/api/firefox-local-ws.md`
14-3. `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
15-4. `/Users/george/code/baa-conductor/docs/firefox/README.md`
16-
17-背景:
18-- 现在 Firefox WS 已支持:
19-  - `state_snapshot`
20-  - `action_request`
21-  - `credentials`
22-  - `api_endpoints`
23-- 插件端其实已经能处理服务端下发的:
24-  - `open_tab`
25-  - `api_request`
26-  - `request_credentials`
27-  - `reload`
28-- 但 `conductor-daemon` 现在还没有正式把这些 server -> client 命令做成可调用面,`api_request` 仍然是 `not_implemented`
29-
30-目标:
31-- 先把 Firefox WS bridge 的服务端“命令面”补齐
32-- 让 `conductor` 具备向插件发消息、等待回包、管理请求生命周期的基础能力
33-- 这一步先做 transport / registry / request-response,不做 Claude 页面业务路由
34-
35-要求:
36-- 只在这些范围内工作:
37-  - `apps/conductor-daemon/**`
38-  - `docs/api/**`
39-  - `docs/firefox/**`
40-- 不要修改 `plugins/baa-firefox/**`
41-- 不要改 `codexd`
42-- 不要做最终 `/v1/browser/*` HTTP 产品面
43-
44-需要完成:
45-1. 在 `firefox-ws.ts` 中增加 server -> client 命令发送基础设施
46-   - 能按 `clientId` 或默认活跃 client 发送命令
47-   - 能跟踪 request id
48-   - 能等待 `api_response`
49-   - 能处理超时、client disconnect、replacement
50-
51-2. 正式支持这些 outbound 命令
52-   - `open_tab`
53-   - `request_credentials`
54-   - `reload`
55-   - `api_request`
56-
57-3. 增加一个最小 bridge 服务层
58-   - 例如 `FirefoxBridgeService` / `FirefoxCommandBroker`
59-   - 不要把复杂逻辑塞满 `firefox-ws.ts`
60-
61-4. 文档更新
62-   - `docs/api/firefox-local-ws.md`
63-   - 写清哪些消息已经正式双向支持
64-
65-验收标准:
66-- 有可测试的 server -> client request/response 基础能力
67-- `api_request` 不再是 `not_implemented`
68-- `node --test apps/conductor-daemon/src/index.test.js` 通过
69-- `pnpm -F @baa-conductor/conductor-daemon typecheck` 通过
70-- `pnpm -F @baa-conductor/conductor-daemon build` 通过
71-- `git diff --check` 通过
72-
73-结束时:
74-- 提交并推送该分支
75-- 在最终回复里明确说明:
76-  - 新增了哪些 WS outbound 命令
77-  - request-response 生命周期怎么做
78-  - 还没做哪些 HTTP 产品接口
D tasks/browser-control/T-BRW002.md
+0, -104
  1@@ -1,104 +0,0 @@
  2-## 最短提示词
  3-
  4-```text
  5-读 /Users/george/code/baa-conductor/tasks/browser-control/T-BRW002.md,完成任务。
  6-```
  7-
  8-上面这一句就够了;本文件已经包含完整约束、修改范围、验收标准和结束要求。
  9-
 10-你在仓库 `/Users/george/code/baa-conductor` 工作。
 11-
 12-必须从当前 `main` 基线开始:`main@667fc6a`。
 13-不要从其他任务分支切出。
 14-如果本地已有旧 worktree/分支,不要复用,重新从 `main` 建干净 worktree。
 15-
 16-任务:Firefox 插件 Claude HTTP 代理能力
 17-建议分支:`feat/firefox-claude-page-automation`
 18-
 19-先读:
 20-1. `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
 21-2. `/Users/george/code/baa-conductor/plugins/baa-firefox/content-script.js`
 22-3. `/Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js`
 23-4. `/Users/george/code/baa-conductor/docs/firefox/README.md`
 24-5. `/Users/george/code/baa/baa-firefox/README.md`
 25-6. `/Users/george/code/baa/baa-extension/background.js`
 26-7. `/Users/george/code/baa/baa-extension/page-interceptor.js`
 27-
 28-背景:
 29-- 现在插件已有:
 30-  - Claude 页面右下角浮层
 31-  - controller 页
 32-  - request hook / credential / endpoint 监测
 33-- 页面内代理链路其实已经存在:
 34-  - service/controller 能收到 `api_request`
 35-  - content script 能把请求转到页面上下文
 36-  - page interceptor 能在页面里用真实凭证发 `fetch`
 37-- 参考仓库 `baa-firefox` / `baa-extension` 的主线也不是 DOM 自动化,而是:
 38-  - 拦截真实请求
 39-  - 学习凭证和 endpoint
 40-  - 在页面上下文里直接代发 HTTP 请求
 41-
 42-目标:
 43-- 先只做 `Claude` 页面
 44-- 让插件本地具备:
 45-  - 基于已捕获的凭证和 endpoint 发起一轮 Claude HTTP 对话
 46-  - 基于 API 响应 / SSE 读取当前对话内容
 47-  - 给后续服务端暴露最小页面状态
 48-- 这些能力后续会通过 `conductor` 的 WS bridge 被调用
 49-- 本任务主线是 HTTP-first,不是 DOM-first
 50-
 51-要求:
 52-- 只在这些范围内工作:
 53-  - `plugins/baa-firefox/**`
 54-  - `docs/firefox/**`
 55-- 不要改 `apps/conductor-daemon/**`
 56-- 不要做 ChatGPT/Gemini 自动化
 57-- 保持当前中文 UI
 58-- 不要把“解析输入框、点击发送按钮”当主方案
 59-- 只有 API 无法提供的信息,才允许加最小 DOM 兜底
 60-
 61-需要完成:
 62-1. 基于当前代理链路补齐 Claude HTTP 能力
 63-   - 复用已捕获的 `credentials`
 64-   - 复用已发现的 Claude endpoint
 65-   - 能在页面上下文里代发 Claude 请求
 66-   - 能把 HTTP 响应和 SSE 结果整理成可消费结果
 67-
 68-2. 增加或收口插件内部消息协议
 69-   - 例如:
 70-     - `claude_send`
 71-     - `claude_read_conversation`
 72-     - `claude_read_state`
 73-   - 这些消息优先驱动 HTTP 代理,不要求模拟真实 DOM 点击
 74-
 75-3. 结果结构要适合后续服务端消费
 76-   - 当前对话标题(如果可取)
 77-   - 最近消息列表
 78-   - role/content/timestamp(能取多少取多少)
 79-   - 页面 busy 状态
 80-   - 当前 URL
 81-
 82-4. 文档更新
 83-   - `docs/firefox/README.md`
 84-   - 写清当前只支持 Claude
 85-   - 写清当前主线是凭证抓取 + endpoint 发现 + 页面内 HTTP 代理
 86-   - 明确哪些信息来自 API / SSE,哪些是 DOM 兜底
 87-
 88-验收标准:
 89-- 插件端可以通过 runtime message:
 90-  - 发送 Claude prompt
 91-  - 读取当前对话内容
 92-  - 读取当前页面状态
 93-- `node --check plugins/baa-firefox/controller.js`
 94-- `node --check plugins/baa-firefox/background.js`
 95-- `node --check plugins/baa-firefox/content-script.js`
 96-- `node --check plugins/baa-firefox/page-interceptor.js`
 97-- `git diff --check`
 98-
 99-结束时:
100-- 提交并推送该分支
101-- 在最终回复里明确说明:
102-  - Claude 能力是如何基于凭证、endpoint 和页面内 HTTP 代理实现的
103-  - 提供了哪些 runtime message
104-  - 哪些信息来自 API / SSE,哪些信息仍依赖最小 DOM 兜底
105-  - 当前有哪些已知限制
D tasks/browser-control/T-BRW003.md
+0, -87
 1@@ -1,87 +0,0 @@
 2-## 最短提示词
 3-
 4-```text
 5-读 /Users/george/code/baa-conductor/tasks/browser-control/T-BRW003.md,完成任务。
 6-```
 7-
 8-上面这一句就够了;本文件已经包含完整约束、修改范围、验收标准和结束要求。
 9-
10-你在仓库 `/Users/george/code/baa-conductor` 工作。
11-
12-必须从当前 `main` 基线开始:`main@667fc6a`。
13-不要从其他无关任务分支切出。
14-如果本地已有旧 worktree/分支,不要复用,重新建干净 worktree。
15-
16-任务:conductor 浏览器 HTTP 接口
17-建议分支:`feat/conductor-browser-http-surface`
18-
19-先读:
20-1. `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
21-2. `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-ws.ts`
22-3. `/Users/george/code/baa-conductor/docs/api/README.md`
23-4. `/Users/george/code/baa-conductor/docs/api/firefox-local-ws.md`
24-5. `/Users/george/code/baa-conductor/docs/firefox/README.md`
25-
26-背景:
27-- 目标是:外部调用方只打 `conductor` HTTP
28-- `conductor` 再通过本地 `/ws/firefox` 控制 Firefox 插件
29-- 当前还没有正式的 `/v1/browser/*` 产品面
30-- 插件侧 Claude 主线应以“页面内 HTTP 代理”能力为主,而不是 DOM 自动化
31-
32-目标:
33-- 增加最小但正式的浏览器 HTTP 接口
34-- 让 CLI / 网页 AI / 其他调用方可以通过 `conductor`:
35-  - 打开 Claude 页面
36-  - 发起 Claude 对话
37-  - 读取当前 Claude 对话内容
38-  - 读取浏览器 bridge 状态
39-
40-要求:
41-- 只在这些范围内工作:
42-  - `apps/conductor-daemon/**`
43-  - `docs/api/**`
44-  - `README.md`
45-- 不要修改 `plugins/baa-firefox/**`
46-- 不要引入公网暴露 `/ws/firefox`
47-- 当前先只做 Claude
48-
49-建议接口:
50-1. `GET /v1/browser`
51-   - bridge 状态摘要
52-   - 当前 client
53-   - Claude 页基本状态(如果能读到)
54-
55-2. `POST /v1/browser/claude/open`
56-   - 打开或聚焦 Claude 标签页
57-
58-3. `POST /v1/browser/claude/send`
59-   - 发送一轮 prompt
60-
61-4. `GET /v1/browser/claude/current`
62-   - 读取当前 Claude 对话内容和页面状态
63-
64-5. 可选:
65-   - `POST /v1/browser/claude/reload`
66-   - `POST /v1/browser/credentials/request`
67-
68-接口原则:
69-- 先本地可用
70-- 返回 JSON
71-- 出错结构统一
72-- 如果当前没有活跃 Firefox client,要返回清晰的 `503` / `409` 风格错误
73-- Claude 动作优先通过本地 WS 转发到插件已有的 HTTP 代理能力
74-
75-验收标准:
76-- `conductor` 有正式 `/v1/browser/*` 接口
77-- 至少具备 open / send / current 这 3 个动作
78-- `pnpm -F @baa-conductor/conductor-daemon typecheck`
79-- `pnpm -F @baa-conductor/conductor-daemon build`
80-- `node --test apps/conductor-daemon/src/index.test.js`
81-- `git diff --check`
82-
83-结束时:
84-- 提交并推送该分支
85-- 在最终回复里明确说明:
86-  - 新增了哪些 `/v1/browser/*` 接口
87-  - 哪些动作通过本地 WS 转发给插件的页面内 HTTP 代理
88-  - 当前只支持哪些平台
D tasks/browser-control/T-BRW004.md
+0, -75
 1@@ -1,75 +0,0 @@
 2-## 最短提示词
 3-
 4-```text
 5-读 /Users/george/code/baa-conductor/tasks/browser-control/T-BRW004.md,完成任务。
 6-```
 7-
 8-上面这一句就够了;本文件已经包含完整约束、修改范围、验收标准和结束要求。
 9-
10-你在仓库 `/Users/george/code/baa-conductor` 工作。
11-
12-必须从当前 `main` 基线开始。
13-开始前先确认:
14-
15-- `T-BRW002` 已经合进主线
16-- `T-BRW003` 已经合进主线
17-
18-如果这两个条件有任意一个不满足,不要开始本任务。
19-
20-不要从其他任务分支切出。
21-
22-任务:浏览器控制文档与 e2e smoke 收口
23-建议分支:`feat/browser-control-e2e-smoke`
24-
25-先读:
26-1. `/Users/george/code/baa-conductor/docs/api/README.md`
27-2. `/Users/george/code/baa-conductor/docs/firefox/README.md`
28-3. `/Users/george/code/baa-conductor/docs/api/firefox-local-ws.md`
29-4. `/Users/george/code/baa-conductor/plugins/baa-firefox/docs/conductor-control.md`
30-
31-目标:
32-- 在功能分支都合入后,做一轮最小闭环:
33-  - `conductor HTTP`
34-  - `/ws/firefox`
35-  - 插件
36-  - Claude 页面
37-- 并把文档、curl 示例、smoke 脚本收口
38-- Claude 侧闭环以“页面内 HTTP 代理”链路为准,不要求 DOM 自动化冒充用户点击
39-
40-要求:
41-- 只在这些范围内工作:
42-  - `docs/**`
43-  - `scripts/runtime/**`
44-  - `tests/**`
45-- 不要继续大改业务代码
46-- 重点是收口和验证
47-
48-需要完成:
49-1. 增加最小 smoke
50-   - 打开 Claude 页
51-   - 读 bridge 状态
52-   - 发一轮 prompt
53-   - 读取当前对话内容
54-
55-2. 更新文档
56-   - AI/CLI 先读哪个 describe
57-   - 浏览器控制接口怎么调
58-   - 哪些能力只在本地可用
59-
60-3. 给出最小 curl 示例
61-   - `/v1/browser`
62-   - `/v1/browser/claude/open`
63-   - `/v1/browser/claude/send`
64-   - `/v1/browser/claude/current`
65-
66-验收标准:
67-- 至少有一条 smoke 脚本或测试能跑通整个链路
68-- 文档和实际接口一致
69-- `git diff --check`
70-
71-结束时:
72-- 提交并推送该分支
73-- 在最终回复里明确说明:
74-  - smoke 覆盖了哪些步骤
75-  - 文档入口在哪
76-  - 还有哪些平台暂未支持
D tasks/browser-control/VERIFY-BROWSER-CONNECTION.md
+0, -81
 1@@ -1,81 +0,0 @@
 2-你在仓库 `/Users/george/code/baa-conductor` 工作。
 3-
 4-必须基于当前主线验证,不要新建功能分支,不要修改代码。
 5-当前基线:`main@8a3a964`
 6-
 7-当前状态:此任务已完成,保留为归档验证卡;除非需要重新验证当前 live 环境,否则不要重复执行。
 8-
 9-任务:验证 Firefox 插件与本地 `conductor` / `codexd` 的连接状态,确认当前连接问题到底在服务端、插件端,还是页面端。
10-
11-先读:
12-1. `/Users/george/code/baa-conductor/docs/firefox/README.md`
13-2. `/Users/george/code/baa-conductor/docs/api/firefox-local-ws.md`
14-3. `/Users/george/code/baa-conductor/docs/api/README.md`
15-4. `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
16-5. `/Users/george/code/baa-conductor/plugins/baa-firefox/background.js`
17-
18-目标:
19-- 不改代码,只做一次清晰的连接验证
20-- 给出当前链路每一段是否正常:
21-  - `conductor`
22-  - `status-api`
23-  - `codexd`
24-  - Firefox 本地 HTTP
25-  - Firefox 本地 WS
26-  - `controller.html` 是否只保留一个
27-- 如果有失败,要明确定位在哪一层
28-
29-需要验证的内容:
30-
31-1. 服务端健康
32-- `http://100.71.210.78:4317/healthz`
33-- `http://100.71.210.78:4317/rolez`
34-- `http://100.71.210.78:4318/v1/status`
35-- `http://127.0.0.1:4319/healthz`
36-- `http://127.0.0.1:4319/describe`
37-- `http://100.71.210.78:4317/v1/codex`
38-
39-2. Firefox WS 握手
40-- 验证 `ws://100.71.210.78:4317/ws/firefox`
41-- 至少确认:
42-  - 能连接
43-  - 能收到 `state_snapshot`
44-  - 如果用相同 `clientId` 建第二个连接,旧连接会被替换
45-
46-3. 插件默认配置
47-- 核对插件默认值是否是:
48-  - `Control API = http://100.71.210.78:4317`
49-  - `Local API = http://100.71.210.78:4317`
50-  - `WS = ws://100.71.210.78:4317/ws/firefox`
51-
52-4. 浏览器侧状态
53-- 当前是否只存在一个 `controller.html`
54-- 如果开了多个,确认插件现在是否会自动收敛成一个
55-- 如果 Firefox 已加载插件,确认管理页里:
56-  - 本地 WS 是否显示已连接
57-  - 本地 HTTP 是否显示已连接
58-  - 最近错误是否为空
59-
60-5. 结果判定
61-- 明确给出:
62-  - 服务端 OK / 不 OK
63-  - WS OK / 不 OK
64-  - HTTP 同步 OK / 不 OK
65-  - 插件 UI OK / 不 OK
66-  - 如果不 OK,最可能的根因是什么
67-
68-建议命令:
69-- `curl`
70-- 本地 node/ws 最小握手脚本
71-- 如有必要,可用浏览器/插件状态检查
72-
73-不要做的事:
74-- 不修改代码
75-- 不提交任何变更
76-- 不新建分支
77-
78-最终回复必须包含:
79-1. 你实际跑了哪些验证命令
80-2. 每一层的结果
81-3. 如果有问题,问题在服务端、插件端还是页面端
82-4. 下一步最小修复建议