本文档是
VibeTradingOpenCodeWorker仓库的实施路线图。当前阶段(2026-05-22 更新):
Phase 状态 摘要 Phase 0 ✅ 已归档 基线 + ADR-001~006 全部 Accepted Phase 1 ✅ 已归档 Worker Contract + API 骨架(§1.4 smoke test 通过) Phase 2 ✅ 已归档 Docker Sandbox + Workspace;镜像 + 安全回归 7/7 PASS。Broker 三件套(P0-1/2/3)⏸ 推迟 Phase 7(详见 §H1b 与 ADR-004) Phase 3 ✅ 已归档 OpenCode HTTP Adapter + oh-my agent 路由 + HITL;E2E 跑通 Phase 5 ✅ 已归档 HITL 闭环、超时事件、mode escalation、断线重连 Phase 6 🟡 收尾中 可观测性 + 单测 245+;T1(HITL 时序 E2E)+ T2(终态 E2E)✅ 闭环(§9.B);剩 T3 安全回归脚本化 + T4 Contract JSON Schema Phase X1(worker side) ✅ 本仓闭环 W1(5 项前置)✅;W2-1 基类 ✅;W2-2/3/4 三个拦截器 ✅;W-DoD smoke + usage-guide ✅(§9.A);本仓退出门 100%,剩余跨团队依赖(U5 callback / X1 acceptance run)见 §9.E Worker Client SDK ✅ 0.1.0 落地 src/worker_sdk/全量公开接口实装(HTTP + SSE + 自动重连 + HITL + artifact 下载 + 兼容性矩阵);48 单测 / 93% coverage(§9.C)Phase 7 ⬜ 规划中 多租户 / 加密 / 跨节点 / broker 完整交付 Sprint 0/1 P0/P1 闭环情况见 §8; W1 + W2-1/W2-2 闭环情况见 archive/w1-w2-progress-2026-05-20.md; W2-3/4 + W-DoD + Phase 6 T1/T2 + SDK 0.1.0 闭环情况见 archive/w2-phase6-sdk-progress-2026-05-22.md。 逐项证据见 archive/code-review-2026-05-14.md (2026-05-14 全量 review,已归档;含 8 P0 + 12 P1 + 8 P2 + 测试缺口)。
§1.3 / §1.4 保留 2026-05-13 的本机自检与骨架验证记录。 后续若执行中出现新的人工决策点,按
🟠 HITL标注追加。
封装一个通用的、安全的 OpenCode Worker 模块,供更上游的 agent runtime 调用。
- 上游 agent runtime 负责:用户对话、调研进度维护、任务上下文准备(含
AGENTS.md)、最终用户 HITL UI、业务 skills/MCP 接入。 - 本仓库(Worker)负责:接收任务 → 启动隔离 Docker 沙箱 → 驱动 opencode + oh-my-opencode → 流式回传事件 → 暴露 HITL 决策点 → 输出 artifacts/logs。
- vibe-trading 等业务逻辑不在本仓库,由上游 runtime 通过 MCP/skills 注入。
| 维度 | 决策 |
|---|---|
| Host Broker | MVP 阶段不交付完整 broker 出口代理:CONNECT 隧道与 broker 进程启停推迟到 Phase 7(详见 ADR-004 / code-review-2026-05-14 P0-1/2/3);src/broker/policy.py 与 HTTP forward proxy 已实装但 lifespan 未启动;MVP 默认 WORKER_BROKER_ENABLED=false、internal=False,容器可直连外网 |
| MCP 形态 | MVP 内所有 MCP 均为 stdio 本地服务并打包进镜像(与 opencode/oh-my-opencode 一起版本 pin),不引入 HTTP/SSE MCP |
| 出网策略 | 域名级白名单 + 按 task 动态下发(TaskRequest.broker_policy.allow_egress_hosts);MVP 默认空,必须显式放行 |
| LLM 凭据 | 容器 env 注入 provider API key;容器启动时基于 env 生成 opencode 配置文件,不挂载宿主登录态;零密钥/broker 凭据代理移 Phase 7 |
| 上游协议 | HTTP + SSE 单协议 |
| Worker API 鉴权 | 静态 Bearer token(env 配置) |
| Workspace bundle | tar.gz(流式上传 / 引用 URL)+ git url + commit sha |
| 并发模型 | 单 worker 进程 + 内置任务队列,每任务一容器 |
| 基础镜像 | ubuntu:24.04(本地离线构建),当前 pin opencode 1.15.0 / oh-my-openagent 4.1.2 / MCP 版本;本地构建 + GHCR 私有 tag,不签名 |
| 任务模式 | 仅 plan_first / direct_execute,去掉 auto_recommend;direct_execute 失败仅发 mode_escalation_suggested 事件,不自动升级 |
| Safe-explore 模式 | 不提供(移 Phase 7) |
| Debug 模式 | 不开放 --debug-no-sandbox;集成测试通过 stub opencode HTTP server |
| 可观测性 | 仅暴露 /metrics(Prometheus 风格)+ OTLP hook,不锁定后端栈 |
| 崩溃恢复 | Worker 重启后进行中任务标 failed(orphaned),不做跨重启续跑(移 Phase 7) |
| 数据保留 | workspace 任务终态后立即删除;artifact 默认保留 7 天;提供 DELETE /tasks/:id 硬删除接口;不做静态加密(移 Phase 7) |
| 实现语言 | Python(FastAPI + httpx + docker SDK,复用 legonanobot conda 环境) |
| 文档落点 | docs/roadmap/opencode-worker.md(建 docs/ 结构) |
- 多租户、计费、RBAC、团队权限矩阵、客户登录。
- 不可篡改审计链、合规留痕、第三方时间戳。
- Kubernetes 调度、跨节点容器池、PostgreSQL/Redis 集群状态。
- 业务层:vibe-trading skills、数据源 MCP、策略/回测/交易执行。
- 订阅态 LLM 登录(Claude Code / Codex / Gemini CLI),仅支持 API key。
- 容器自由外网访问;仅允许通过宿主 broker 的域名白名单。
⚠️ 2026-05-14 修订:MVP 阶段此条未达成——broker CONNECT 隧道与进程启停推迟到 Phase 7,容器实际可直连任意外网。详见 ADR-004 与 README §MVP 安全模型现状。 §H1b(域名级白名单)实现推迟到 broker 联通之后——白名单代码 (src/broker/policy.py) 已就位,但在 broker 真正接管出站流量前不会实际生效。 - 挂载用户主目录或宿主项目根目录为可写。
- HTTP/SSE 远程 MCP;MCP 全部 stdio + 随镜像发布。
- Broker 零密钥凭据代理、MCP server spawn/kill、跨重启任务续跑、
safe_explore只读模式、静态加密、cosign 镜像签名。
| 验证项 | 结论 |
|---|---|
opencode 1.15.0 serve endpoints |
health / agent / plugin load 在 arm64 验证镜像中实测通过;其余 HTTP adapter endpoints 仍沿用 1.14.30 基线验证 |
OPENCODE_CONFIG_CONTENT + {env:X} 注入 |
当前链路为 env 注入 + materialize 到 ~/.config/opencode/opencode.json;GET /config 可校验配置 |
OPENCODE_PERMISSION 注入 |
实测有效,白名单注入正常 |
OPENCODE_DISABLE_AUTOUPDATE=1 |
验证有效,双层禁用已写入 ADR-002 |
oh-my-opencode 4.1.2 CLI |
latest 版本已确认;本次修复未重跑宿主机 CLI smoke |
| 容器内 oh-my-openagent 加载 | GET /agent 实测:1.15.0 + 4.1.2 在 arm64 镜像中已成功加载,健康检查后约 12 秒出现 Prometheus / Sisyphus |
| arm64 验证镜像(1.15.0 / 4.1.2) | 镜像重建成功;entrypoint 通过 /agent 校验并输出 verified oh-my-openagent agents loaded |
| Phase 1 API 骨架 smoke test | 10 端点全部通过(2026-05-13) |
详细 spike 实测记录已归档,可通过 git history 查阅。
┌─────────────────────────────────────────────────────────┐
│ Upstream Agent Runtime (HTTP + SSE, Bearer auth) │
└──────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────┐
│ Worker API (FastAPI) │
│ - /tasks, /tasks/:id/events (SSE), /tasks/:id/decisions│
│ - /tasks/:id/messages, /tasks/:id/abort │
│ - /tasks/:id/artifacts │
├─────────────────────────────────────────────────────────┤
│ Task Orchestrator │
│ - 状态机 / 队列 / 并发上限 / 崩溃恢复 │
│ - Mode Router (plan_first | direct_execute) │
│ - HITL Gateway (event ↔ decision) │
│ - Event Bus (cursor + replay) │
├─────────────────────────────────────────────────────────┤
│ OpenCode Adapter │
│ - 主路径:`opencode serve` HTTP/SSE │
│ - 备路径:`opencode CLI + tmux/PTY`(POC,不进 MVP 默认)│
│ - 事件归一化、permission ↔ DecisionRequest 映射 │
├─────────────────────────────────────────────────────────┤
│ Sandbox Manager (docker SDK) │
│ - 一任务一容器、reaper、镜像 pin │
│ - 非 root / cap-drop / no-new-privileges / tmpfs │
│ - MVP:可直连外网(broker 推迟到 Phase 7,见 ADR-004) │
├─────────────────────────────────────────────────────────┤
│ Workspace Manager │
│ - tar.gz / git 解包、symlink/zip-slip 防护 │
│ - diff / snapshot / logs / custom artifacts 输出 │
├─────────────────────────────────────────────────────────┤
│ Storage Lite (SQLite + 本地文件) │
│ - tasks / events / decisions / artifacts / secrets refs│
└──────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────┐
│ Host Broker (Phase 7 交付,MVP 不联通) │
│ - HTTP egress 代理(域名白名单 + 审计 hook) │
│ - 不管理 MCP 生命周期;MVP MCP 为容器内 stdio 服务 │
│ - ACL / rate-limit / audit hook │
│ ⚠️ MVP 阶段此组件未在 lifespan 启动;容器直连外网 │
└─────────────────────────────────────────────────────────┘
task_created · task_queued · task_started · container_started · opencode_ready
· assistant_delta · tool_call_started · tool_call_finished
· plan_ready · hitl_required · decision_received
· execution_started · artifact_ready
· task_completed · task_failed · task_aborted
· heartbeat(SSE keep-alive)
每个事件包含 event_id、task_id、ts、kind、payload、cursor。
// hitl_required 事件 payload
{
"decision_id": "uuid",
"kind": "plan_approval | tool_permission | file_write | broker_egress | continue_long_task | custom",
"summary": "...",
"options": ["approve","reject","revise","abort"],
"default_on_timeout": "abort",
"expires_at": "2026-05-13T12:00:00Z",
"context": { /* 计划文本 / 命令 / 文件 diff / URL 等 */ }
}
// POST /tasks/:id/decisions
{
"decision_id": "uuid",
"choice": "approve | reject | revise | abort",
"feedback": "可选文本",
"patch": { /* 可选:修改后的命令 / 计划 */ },
"idempotency_key": "uuid"
}type ∈ {workspace_snapshot, diff, plan, log, stdout, stderr, transcript, report, custom}
统一通过 GET /tasks/:id/artifacts 列表 + GET /tasks/:id/artifacts/:artifact_id 下载。
invalid_request · unauthorized · quota_exceeded
· workspace_prepare_failed · sandbox_start_failed · opencode_start_failed
· opencode_failed · broker_denied · hitl_timeout
· task_cancelled · resource_exhausted · artifact_too_large · internal_error
每类错误标注:retryable、requires_hitl、counts_against_quota、user_visible_message。
pending
→ queued
→ preparing_workspace
→ starting_container
→ starting_opencode
→ planning (plan_first)
→ awaiting_human ←→ revising
→ executing (direct_execute 或 plan 批准后)
→ collecting_artifacts
→ completed | failed | aborted | timed_out
崩溃恢复:worker 重启后,所有非终态任务标记为 failed(orphaned),关联容器由 reaper 清理;终态任务可继续查询/下载 artifact。
交付物:ADR-001~006 全部落地;Spike 1a/1b/3 完成(证据见 §1.3)。Spike 4/5(env 注入完整流程、Broker 原型)推迟至 Phase 7。
| Spike | 结论 |
|---|---|
| Spike 1a — serve endpoints | HTTP Server 路径完整验证;CLI+tmux 已由 ADR-001 关闭 |
| Spike 1b — runtime config | OPENCODE_CONFIG_CONTENT + {env:X} 纯 env 注入;ADR-003 升级 |
| Spike 2 — PTY POC | 已取消(ADR-001) |
| Spike 3 — 容器镜像 | Phase 2.5 历史镜像已归档;2026-05-16 已升级并验证 opencode 1.15.0 + oh-my-openagent 4.1.2 |
| ADR-001~006 | 全部 Accepted,见 docs/adr/ |
交付物:src/worker/ 项目骨架完整初始化;Pydantic contract schemas(TaskRequest/TaskEvent/Decision/Artifact/Error);FastAPI 10 端点含 Bearer token 中间件、SSE Last-Event-ID 回放、asyncio 任务队列、SQLite 4 表存储;smoke test 10/10 PASS(2026-05-13)。
状态:✅ 已归档(Phase 2 代码 commit df01b23;Phase 2.5 镜像构建 + 安全回归 2026-05-14;运行时 baseline 已于 2026-05-16 升级到 opencode 1.15.0 / oh-my-openagent 4.1.2)
关联 review 项:P0-1 / P0-2 / P0-3(broker 三件套)⏸ 推迟 Phase 7;P0-4(local workspace)✅ 已加
WORKER_ALLOW_HOST_MOUNTgate。详见 archive/code-review-2026-05-14.md。
主要交付:Dockerfile(ubuntu:24.04 + opencode / oh-my-openagent 离线制品,sandbox uid 1000,--read-only/cap-drop/pids-limit);sandbox/manager.py 完整生命周期;workspace/handler.py(zip-slip/symlink 防逃逸);broker/proxy.py 域名白名单 SSRF 防护;Orchestrator 全链路(workspace→network→policy→container→cleanup);安全回归 7/7 PASS(commit df01b23)。2026-05-16 已将运行时 baseline 升级到 1.15.0 / 4.1.2。
状态:✅ 已归档(commit e32c5e5,2026-05-14;E2E 天齐锂业分析跑通)
关联 review 项:P0-5 / P0-6 / P0-7(agent 名 + 终态事件)✅ 已于 2026-05-16 修复;P1-15(reject 阈值)✅ 已于 2026-05-18 修复。详见 archive/code-review-2026-05-14.md。
主要交付:adapters/opencode/client.py(health/SSE/session/message/prompt_async/permission/diff/abort 全链路);event_stream.py opencode↔TaskEvent 映射;plan_first(Prometheus)与 direct_execute(Sisyphus)双模式;_handle_plan_approval + _handle_permission HITL 路径;artifact 收集(diff + transcript);E2E 天齐锂业分析跑通(commit e32c5e5)。
⚠️ Phase 4(oh-my Mode Adapter)已由 ADR-001 合并入 Phase 3,不再单独存在。
状态:✅ 已归档(commit fbaa13b,2026-05-14)
关联 review 项:P1-13(HITL on_timeout)✅ 2026-05-16;P1-14(auto_approve)/ P1-10(event_id race)✅ 2026-05-18。详见 archive/code-review-2026-05-14.md。
主要交付:统一 DecisionRequest(plan approval/tool permission/file write/broker egress/long-task continue);HITL 超时 default_on_timeout=abort(hitl_timeout 事件 + expire_decision DB + abort + 容器 stop);SSE Last-Event-ID 断线续传;Decision 幂等;mode_escalation_suggested(权限请求 ≥3 次触发);重启后孤儿任务标 failed(orphaned)(commit fbaa13b)。
状态:🟡 部分完成,待收尾
关联 review 项:P1-9(WAL)/ P1-11(metrics callsites)/ P1-12(SSE 事件驱动)✅ 已于 2026-05-18 修复。集成测试(HITL 时序、安全回归脚本化)仍 pending —— 现仅有
tests/fixtures/stub_opencode_server.py未串到 integration 用例。详见 archive/code-review-2026-05-14.md。
- 测试矩阵:
- 单元:state machine(test_state_machine.py)、event mapper(test_event_stream.py 41 用例)、permission mapper(test_permission_mapper.py)。
- 集成 fixture:stub opencode HTTP server(tests/fixtures/stub_opencode_server.py,FastAPI+uvicorn,可脚本驱动 SSE 事件)。
- 契约:JSON Schema 校验上游 contract(Phase 7 补充)。
- 安全回归:Phase 2 列表 + secret 泄漏扫描 + 容器 escape 尝试(需真实 Docker 环境)。
- HITL 时序:决策早到 / 晚到 / 重复 / 超时边界集成测试 — 2026-05-21 闭环:tests/integration/test_hitl_timing_e2e.py(4 PASS)。
- 可观测性:
- 结构化日志(CorrelationFilter 注入 task_id / session_id / decision_id,observability/logging.py)。
- Metrics(Prometheus text format GET /metrics endpoint):task_count、task_duration、hitl_wait_seconds、container_start_ms、abort_rate、token_usage(observability/metrics.py)。
- OpenTelemetry tracing hook 预留(ContextVar correlation 已就绪)。
-
/health、/ready已实现(routes.py)。
- 资源回收:
- 容器/workspace/临时 config 在终态后清理(基础已在 orchestrator,TTL 策略 pending)。
- artifact size limit、log truncation、event TTL(Phase 7)。
- 版本治理:
- opencode / oh-my-opencode pin 列表 + 自动更新禁用验证。
- 升级 playbook(spike → ADR → bump → 回归)。
Phase 6 退出检查:
- 单元测试 118/118 通过(pytest tests/unit/)。
- Prometheus /metrics 端点格式以 text/plain; version=0.0.4 响应。
- Metrics counter 接入 —
[REVIEW: P1-11]已于 2026-05-18 修复:queue / sandbox / driver 关键路径全部接入 counter / summary。 - 结构化日志 correlation filter 通过语法检查 + 模块导入验证。
- 集成测试(HITL 时序、abort/timeout 终态 E2E)— 2026-05-21 闭环:test_hitl_timing_e2e.py + test_terminal_e2e.py(共 7 PASS,<6s wall-clock)。安全回归脚本化(T3)仍需真实 Docker 环境,标记为 pending。
- WAL 模式启用 —
[REVIEW: P1-9]已于 2026-05-18 修复,init_db启用 WAL + synchronous=NORMAL + busy_timeout=5000。
- Broker 完整交付(P0-1/P0-2/P0-3):CONNECT 隧道、
internal=True网络隔离、lifespan 启动 broker 进程。 - 多用户/多租户:认证、RBAC、租户配额、secret manager(Vault/KMS)。
- 强审计:hash chain、对象存储归档、查询 API、保留策略。
- 扩展性:Redis queue、多 worker、PostgreSQL state store、S3 artifact、K8s sandbox。
- 安全增强:egress proxy 细粒度白名单、MCP policy engine、seccomp/AppArmor、镜像签名(cosign)、SAST/DAST、SBOM/CVE。
- 上游生态:SDK、OpenAPI 发布、stdio JSON-RPC bridge、订阅态凭据代理方案。
- 任务恢复:进行中任务跨 worker 重启续跑 / 零密钥 Broker 代理 LLM 请求。
- 业务集成模板:vibe-trading MCP/skills 接入指南(仍在上游交付)。
- Safe-explore 只读模式 / auto_recommend 模式 / 静态加密 / 镜像 cosign 签名。
- 上游 runtime 能通过 HTTP+SSE 创建任务,完成
plan_first与direct_execute两条路径。 - TaskRequest / TaskEvent / Decision / Artifact 通过 JSON Schema 严格校验。
- 安全:让 opencode 尝试
rm -rf /、读取/etc/shadow、curl https://example.com(无放行)、fork bomb 时,操作被沙箱/挂载/网络/资源限制阻断。 - HITL:plan 审批 / 修改 / 拒绝 / abort / 超时自动 abort 五种均有可重复测试。
- 事件可靠性:SSE 断线 30s 后重连可从
Last-Event-ID续传,无重复无丢失。 - 资源回收:任务完成/失败/取消后,容器、workspace、临时 config、临时凭据全部清理。
- oh-my-opencode:doctor 通过;Prometheus/Sisyphus smoke tests 通过;Prometheus 计划被捕获为
plan_ready;ultrawork路径可直接进入executing;server/session lifecycle 可控且无残留。 - Artifacts:成功任务可拉取 diff、plan、transcript、stdout/stderr;失败任务仍可拉到诊断信息。
规划阶段所有人工议题已闭环,结论如下;执行期若出现新议题再追加。
| # | 议题 | 决策 |
|---|---|---|
| H1 | Broker 与 MCP 关系 | MVP 内 MCP 全部 stdio 本地化并打包入镜像;Broker 不管 MCP 生命周期,仅做 HTTP egress 代理 |
| H1b | Broker 白名单粒度与下发 | 域名级 + 按 task 动态下发(TaskRequest.broker_policy) |
| H2 | 镜像分发与签名 | 本地构建 + GHCR 私有 tag,不签名(cosign 移 Phase 7) |
| H3 | direct_execute 失败自动升级 |
否;仅发 mode_escalation_suggested 事件,由上游决策 |
| H4 | safe_explore 只读模式 |
不提供(移 Phase 7) |
| H5 | --debug-no-sandbox |
不开放;集成测试用 stub opencode HTTP server |
| H6 | 可观测性后端 | 仅暴露 /metrics + OTLP hook,不锁后端 |
| H7 | 跨重启续跑 | 不提前;重启后进行中任务标 failed(orphaned) |
| H8 | Broker 凭据代理(容器零密钥) | 否;MVP env 注入 API key,零密钥移 Phase 7 |
| H9 | 数据保留 | workspace 立删 + artifact 7 天 + DELETE /tasks/:id;不做静态加密 |
| H10 | opencode auto-update 禁用 env | ✅ Spike 1b 收口:OPENCODE_DISABLE_AUTOUPDATE=1(boolean env)+ autoupdate: false(config),已写入 ADR-002 |
| H11 | oh-my 版本 pin | ✅ ADR-006 收口:当前 pin oh-my-openagent 4.1.2,并已完成 arm64 容器验证 |
| H12 | plan_first 主入口 |
✅ ADR-001 收口:HTTP Server + prompt_async 传 agent:"Prometheus";oh-my-opencode run 仅用于本机 smoke test;/start-work 作为可选验证,不阻塞 MVP |
完整 review 原文(含每项的修复证据 + 测试链接)见
docs/archive/code-review-2026-05-14.md。 本节只列当前仍 open 的条目;已闭环条目折叠为一行汇总。
全部已闭环或推迟 Phase 7。
| 条目 | 状态 |
|---|---|
| P0-4 / P0-5 / P0-6 / P0-7 / P0-8 | ✅ 已闭环(详见 archive) |
| P0-1 / P0-2 / P0-3 | ⏸ 推迟 Phase 7(broker 完整交付前 MVP 接受降级) |
已闭环(共 12 项):P1-9(WAL)/ P1-10(event_id race)/ P1-11(metrics callsites)/ P1-12(SSE 事件驱动)/ P1-13(HITL on_timeout)/ P1-14(auto_approve)/ P1-15(reject 阈值)/ P1-16(state 双写)/ P1-17(孤儿任务恢复)/ P1-18(git_subpath cleanup)/ P1-19(artifact GC)/ P1-20(README 同步)。逐项证据见 archive 各项的"修订"块。
仍 open:无(Sprint 1 全部清零;剩余测试覆盖缺口归并到下方"测试覆盖缺口"统一推进)。
| ID | 问题 | 修复方向 |
|---|---|---|
| P2-21 | 顶层 lazy import 影响启动性能 | 将重型 import 移到函数内或启动 hook |
| P2-22 | asyncio.get_event_loop() 已废弃 |
替换为 asyncio.get_running_loop() |
| P2-23 | except 块吞异常不重抛 | 关键路径 except 加 raise 或 logger.exception |
| P2-24 | provider key 映射硬编码字符串 | 改用 enum / constants 避免拼写错误 |
| P2-25 | 模块 import 有副作用(DB 初始化) | 将副作用移入显式 init() 调用 |
| P2-26 | 死代码(已注释的旧 stub 函数) | 删除旧 stub |
| P2-27 | 未使用的常量/字段 | 清理 |
| P2-28 | silent error(swallowed exception 无日志) | 补 log + 考虑 Sentry/alerting hook |
| 范围 | 现状 | 目标 |
|---|---|---|
| Orchestrator 集成(HITL 时序) | ✅ 已覆盖 — test_hitl_timing_e2e.py(4 PASS:早到 / 晚到 / 重复幂等 / 超时 abort,2026-05-21 闭环) | — |
| 安全回归脚本化 | 手工 | pytest + Docker fixture 自动运行 |
| Contract JSON Schema 校验 | 无 | 上游 TaskRequest/Event 通过 JSON Schema 严格校验 |
| abort/timeout 终态事件 | ✅ 已覆盖 — 单元 test_terminal_exceptions.py + 集成 test_terminal_e2e.py(3 PASS:HITL→abort 全链路 / ResourceLimits→timed_out / SSE 订阅者唤醒,2026-05-21 闭环) | — |
本节是唯一列出"接下来做什么"的位置。已闭环工作不留 entry;详情参见 §8 / archive。 排序按优先级(A > B > C > D);同级内按依赖关系排。
2026-05-21 ~ 2026-05-22 闭环范围(已迁出本节,详见 archive/w2-phase6-sdk-progress-2026-05-22.md):
- Phase X1 worker side:W2-3 BacktestInterceptor / W2-4 McpFieldRecorder / W-DoD smoke + usage-guide ✅
- Phase 6 测试缺口:T1 HITL 时序 E2E(4 PASS)/ T2 终态 driver-queue E2E(3 PASS)✅
- Worker Client SDK:Draft v1 设计稿 → 0.1.0 全量公开接口实装(设计稿 §13.1 步骤 1-8 一次到位,含 SSE 自动重连 /
Retry-After/ 兼容性矩阵 / 48 单测 93% coverage)✅
剩余 2 项测试缺口;与 X2 / Phase 7 一起规划,不阻塞当前 release:
| 任务 | 描述 | 估时 | 备注 |
|---|---|---|---|
| T3 安全回归脚本化 | Phase 2 手测 7 项沉淀为 pytest + Docker fixture(CI 可选执行) | 2d | 需真实 Docker;CI 上可标 optional。与 Phase 7 broker 一起做性价比更高(broker 上线后会引入新一批 egress / CONNECT 隧道安全用例,避免重复搭脚手架) |
| T4 Contract JSON Schema 校验 | 上游 TaskRequest/Event 通过 JSON Schema 严格校验 | 0.5d | 上游契约层;可顺势配合 SDK models.py frozen dataclass 一起做静态对齐 |
SDK 0.1.0 已是设计稿 Draft v1 的全量交付(archive snapshot)。后续以用得起来为唯一标准,不再追加抽象层:
| 任务 | 描述 | 估时 | 备注 |
|---|---|---|---|
| SDK-D1 上游 runtime 接入演练 | 上游 agent runtime 用 worker_sdk 替换裸 httpx 调用,跑通至少一条 plan_first 全链路 |
1d | 验证 SDK 公开面足够,反向收集接口缺口 |
| SDK-D2 兼容性矩阵自动化 | assert_compatible() 在 worker /health 协议格式微改时仍能 graceful fail |
0.5d | 当前为静态字符串前缀比对,可补 worker side /health.api_version 字段 |
| SDK-D3 L2 stub server 协议测试 | 在 tests/fixtures/stub_opencode_server.py 之外,针对 SDK 起 stub Worker server 跑跨进程协议测试 | 1d | 当前 L1 已用 httpx.ASGITransport 直挂 FastAPI app;L2 价值在跨进程 / SSE keep-alive / 真实 socket 行为 |
| SDK-D4 0.2.x 版本通道规划 | 当 worker contract 出现破坏性变更时的 SDK 双轨发布策略 | 0.5d | 仅在出现实际破坏性变更前置规划;当前不启动 |
§8 Sprint 2 8 项 P2 仍未启动。非阻塞,建议在 SDK 接入演练(9.B SDK-D1)穿插期完成;优先级 P2-22(asyncio.get_event_loop() 替换)/ P2-23(吞异常补 raise + log)/ P2-25(import 副作用收口),其余按 grep 结果机会处理。
W2 + Phase 6 测试缺口 80% + SDK 0.1.0 已构成 MVP-like 闭环。是否进入 Phase 7 是下一个 HITL 决策点;建议在做出选择前先收集:
| 决策输入 | 状态 |
|---|---|
| 上游 runtime 真实接入数据(SDK-D1 反馈) | ⬜ 待 9.B SDK-D1 完成 |
| MCP 团队 M1/M2/M4 自描述协议草案 | ⬜ 跨团队(§9.E) |
| Broker 完整交付(P0-1/2/3)的实际触发点 | ⬜ 由真实 egress 需求触发;MVP 默认仍 WORKER_BROKER_ENABLED=false |
不建议预先启动 Phase 7 多租户 / 加密 / 跨节点 — 这些项在没有真实流量诉求时会沉淀大量未验证抽象。
worker 完成 W2 + SDK 0.1.0 后,端到端验证需要上游配合:
| 跨团队 | 任务 | 阻塞本仓什么 |
|---|---|---|
| 上游 runtime | U5 summarize_callback provider |
W2-2 当前用 fallback slug;接通 callback 后 conversations 命名更可读 |
| 上游 runtime | U1 meta-skill strategy-skill-author v0.1 |
端到端验证(X1 DoD §6)需要 meta-skill 让 Prometheus 写出合格 SKILL |
| 上游 runtime | SDK-D1 接入演练 | 反向校验 worker-client-sdk-interface-design.md §7 公开面是否齐全 |
| MCP 团队 | M1 / M2 / M4 MCP 自描述协议 + 仓库骨架 | W2-4 输出的 mcp_field_summary.json 需要 MCP describe_tool() 配对才能闭环字段校验 |
详细依赖关系见 claudedocs/workflow_phase_x1_implementation_backlog.md §6。
Week 1(已落地,2026-05-21~22):
W2-3 ✅ → W2-4 ✅ → W-DoD smoke + usage-guide ✅
→ T1 + T2 ✅(Phase 6 测试缺口 80% 闭环)
→ SDK 0.1.0 ✅(设计稿 §13.1 步骤 1-8 全量交付)
Week 2(推进重点 — 反馈环驱动):
上游 U5 callback 对接 + SDK-D1 上游接入演练(驱动反馈环)
→ 必要时启动 SDK-D3 L2 stub server 协议测试(~1d)
→ Sprint 2 P2 优先三项(P2-22/23/25)穿插
Week 3(决策与外部):
Phase 7 启动评估(§9.D)+ X1 acceptance run(依赖 U1 meta-skill)
→ 若 broker 出现真实需求,启动 T3 安全回归脚本化 + Phase 7 broker 三件套
当前 worker 仓库内没有阻塞当前 release 的工作;下一次推进重心已外移到 SDK-D1 接入演练 + 上游 U5 / X1 acceptance + 跨团队 MCP 协议对齐。
{ "task_id": "uuid?", // 可选幂等键 "mode": "plan_first | direct_execute", "messages": [{"role":"user","content":"..."}], "workspace": { "kind": "tarball | git | empty", "tarball_url": "...", // 或 inline base64(受 size 限制) "git": {"url":"...","sha":"...","subpath":"?"} }, "opencode_profile": { "model": "anthropic/claude-...", "providers": ["anthropic","openai"], // 影响 env 注入 "permission_template": "plan_first_default | direct_execute_default | custom", "permission_overrides": { /* 受白名单约束 */ } }, "env_policy": { "provider_keys": ["ANTHROPIC_API_KEY", "OPENAI_API_KEY"], // 由 worker 从 secret store 注入 "extra_env": {} }, "resource_limits": {"cpu":"2","memory":"4Gi","pids":512,"timeout_sec":1800}, "hitl_policy": { "decision_timeout_sec": 600, "on_timeout": "abort", // 示例值;continue/escalate 会在 driver 端归一化为 approve fallback "auto_approve": [] // 默认空;可白名单某些低风险 permission kind }, "broker_policy": { "allow_egress_hosts": [], // 默认空,按需放行 "mcp_servers": [] // MVP 保留字段;不管理生命周期,默认空 }, "metadata": {"trace_id":"...", "tenant_hint":"..."} }