onesvm-browser-server/.dsh/contracts/plan-20260901-03.md
chii eb972dfa93 feat: 落地 browser-server 控制面并打通 mgr1 海外订阅
单二进制三角色 + Dock 适配器 + Swarm stack 达到可部署态;mgr1 实测订阅经 central-proxy bootstrap,探活 alive=41/52。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-02 15:05:12 +08:00

4.8 KiB
Raw Permalink Blame History

Commander Plan: 控制面 Go 实现(contract-20260901-browser-impl)

状态: done 创建: 2026-09-01(Asia/Shanghai)· 收口: 2026-09-02 plan_id: plan-20260901-03 run_id: run-20260901-browser-impl contract: contract-20260901-browser-impl.md 验收链: W1→W2∥W3∥W4→W5 → ITER-1(冒烟三根因)→ ITER-2(冷启动窗口)→ V1 verify PASS-with-issues → ITER-3(P1 配额结算+三接线)→ V2 reverify PASS → V3 arch-review PASS-with-debt → ITER-4(D-1/D-2 必修债就地修复)。产物:.dsh/artifacts/run-20260901-browser-impl/{impl-receipt-w1..w5, verify.md, reverify.md, arch-review.md, wc.txt, smoke/smoke-run.log, fail-*.md}。

目标

单二进制三角色(gateway/scheduler/proxymanager)+ 五 Dock 适配器 + SQLite 队列 + stack 与部署产物,达到「部署 mgr1 测试」就绪态(详见 Contract §5 A1–A6)。

背景与约束

  • 权威设计:docs/design-arch + plan-final + mcp-usage(契约面)+ deploy-prod-preset(端口/资源/灰度)
  • 组织纪律:600 行/文件上限、密钥 fail-closed、urlapi、东八区、镜像 save/load
  • 模型:Worker 用 impl-glm-5.3-flash(ZCode 实现型 subagent,含 Bash/文件全工具);验收用独立 Explore(只读)+ 主会话复核

模块化拆解(防上帝文件)

server/
  go.mod                      # module onesvm.com/onesvm/browser-server
  cmd/browser-server/main.go  # role 分流入口(gateway|scheduler|proxymanager)
  internal/contract/          # 信封/Job/RawResult/DockAdapter 接口/错误码(A1)
  internal/store/             # SQLite open+migrations+repos(A1)
  internal/auth/              # key 校验/签发(A1+A2 admin)
  internal/policy/            # SSRF/域名规则/robots(A1)
  internal/safetyscan/        # 词表/PII redact/注入包裹(A1)
  internal/httpx/             # 共享 client + Size/Type guard(A1)
  internal/gateway/           # HTTP handler + MCP JSON-RPC + enqueue 转发(A2)
  internal/scheduler/         # 队列/派发/reaper/路由/模版层/pressure(A3)
  internal/dock/              # 五适配器:searxng.go trafilatura.go cdp.go(lightpanda+shell 共用)cdp_client.go(A3/D8)
  internal/proxymanager/      # 订阅/探活/P2C/路由 API(A4)
  internal/config/            # env 解析(fail-closed 辅助)
stacks/browser-server.yml
scripts/deploy-mgr1.sh  scripts/smoke-local.sh

步骤表

step_id goal worker scope (write) acceptance depends_on status
W1 骨架门:go.mod+目录+contract/store/config 全量实现+auth/policy/safetyscan/httpx 全量+单测 impl-glm-5.3-flash server/ 全部(本步建立骨架与公共包) A1 全项 + A6.1/6.2 + go test 全绿 — todo
W2 gateway:MCP handler + HTTP v1 + admin key 面 + enqueue 转发 + 缓存 impl-glm-5.3-flash server/internal/gateway/ server/cmd/ A2 全项 + A6 golden 信封测试 W1 todo
W3 scheduler:队列/派发/reaper/路由/模版层/pressure + dock 五适配器 impl-glm-5.3-flash server/internal/scheduler/ server/internal/dock/ A3 全项 + A6.1/6.2 W1 todo
W4 proxymanager:订阅解析/探活/P2C/路由 API impl-glm-5.3-flash server/internal/proxymanager/ A4 全项 W1 todo
W5 stack/Dockerfile/Makefile/脚本 + 本机冒烟 + amd64 构建 impl-glm-5.3-flash stacks/ scripts/ server/Dockerfile Makefile A5 全项 + A6.4/6.5 W2,W3,W4 todo
V1 独立验收 verify(只读):跑 A6 全部门槛,产 verify.md / fail-*.md Explore(readonly) 写 .dsh/artifacts/run-20260901-browser-impl/verify.md A6 六项逐一核对 + T1–T7 复核 W5 todo
V2 reverify(builder 修复后复核,只读)+ 行数检查落 wc.txt Explore(readonly) 写 reverify.md wc.txt 修复项复验 + 全绿 V1(若有 fail) todo
V3 架构审查(core_framework 强制):解耦/行数/契约对齐/门闩矩阵 主会话指挥(read-only 审查,独立 reviewer subagent) 写 arch-review.md 无 P0/P1 V2 todo

并行策略

W1 先行(串行);W2 ∥ W3 ∥ W4 并行派发;W5 收口;V1→V2→V3 验收链。

风险

  • modernc.org/sqlite 拉取需网络(Go proxy 镜像);失败则降级 CGO-free 备选或升级用户
  • 冒烟依赖本机 Docker 与缓存镜像(searxng/trafilatura 已缓存);境外引擎冒烟可能空结果——用 stub 断言形状即可
  • 五适配器 + 三角色工程量集中在一个 Worker 会话可能超长 → W1 公共包先行落稳,W2–W4 各自独立目录,边界清晰可各自验收
  • headless-shell Swarm 按需拉起依赖 socket 权限——冒烟仅验证「不可用时降级」路径,Swarm 拉起留部署轮实机验证