scheduler-gateway/docs/IMPLEMENTATION.md
Liuxinyu176 bbb364cd69 feat: DSH 调度网关(互联网关)v6.0.0 — 四模型合并版 R1+R2+R3
- 零第三方依赖,Node >=20 原生 ESM
- 团队式编排引擎:拆解/路由/执行/审查/合并全真实 LLM
- 阶段心跳、单一权威清单守卫、all-keys-failed 如实上报
- H4 会话视图/amend/watchdog 有界重试/产物区 artifacts.json
- H5 零依赖三栏控制台
2026-10-09 23:20:27 +08:00

4.2 KiB
Raw Permalink Blame History

IMPLEMENTATION — scheduler-gateway-merged

目录结构

src/
  cli-live.js        统一 CLI:server/node-*/live-llm/demo/chaos/stress/recovery-demo/board-claim/status
  server.js          中心网关(REST+SSE+节点长轮询+鉴权+WAL 透传+panel)
  store.js           任务/节点/审计/死信/事件总线(mutex 串行化 + 防抖落盘 + WAL 钩子)
  scheduler-core.js  调度原语:pickNode/claimForNode/settleResult/requeueDead/depsReady
  protocol.js        gw-node/1 协议常量 + 注册校验 + 恒定时间 token 比较
  orchestrator-live.js 真实 LLM P→W→R→M 编排(rework≤2 轮,LLM 失败诚实回退)
  llm.js             真实 chat 调用 + 渐进式 JSON 提取 + 结构化校验重试
  live-llm.js        严格验证脚本(planner+reviewer+merger → evidence/live-llm/)
  node-runtime.js    GatewayNode:注册/心跳/长轮询/执行/回报
  nodes/             native 启动器 + executors(native/cmd/http/codex) + adapter
  panel.js           单文件 HTML 面板(任务/节点/日志/指派/审批/死信重投/导出)
  security.js        基础安全函数 + SecurityGuard(注入/危险/脱敏/路径白名单)
  wal.js             JSONL journal(幂等键、事件流、recoverInFlight)—— 合并自 fjord
  recovery.js        崩溃恢复:WAL 重放重投 + recovery-demo —— 合并自 fjord
  worktree.js        每任务独立工作区(可 git worktree)
  taskboard/         看板客户端 + 领单/回写 + 接单桥 —— 合并自 fjord(R2)/epoch(R2)
lib/                 DSH 插件半:index.js(4 工具) + client.js(薄封装同一 HTTP API)
cordis.patch.yml     DSH 插件注册补丁
test/                live-suite.mjs(A-N 段 164 断言)+ mock-board-server.js

验证方式(全部实测)

命令 结果 说明
npm test 164 断言 EXIT=0 A LLM / B 协议 / C 存储 / D 调度 / E-I 服务器+双节点+故障+安全 / J 真实 LLM 200 / K WAL+恢复 / L 看板接单(含 409 风暴+SSE+接单桥) / M 安全对抗 / N 压测(40任务/8并发)
npm run live-llm EXIT=0 真实 planner+reviewer+merger 全部 200,证据落盘
npm run demo EXIT=0 真实 LLM 编排跨 native+adapter 节点,评审轨迹 rework→pass,merger 合并
npm run stress EXIT=0 200 任务/并发16:done 200、未完成 0、重复领取 0、246 task/s
npm run chaos EXIT=0 200 任务 + native 掉线 5s:done 192 + 注入死信 8、未完成 0、重复领取 0
npm run recovery-demo EXIT=0 claim 未 settle ×2 恢复重投,已 settle 任务不受影响
npm run board-claim --once EXIT=0 看板 Host 未启动时优雅失败;有 Host 时单轮接单

关键实现取舍

  1. port 0 = 动态端口(修复):原 fjord 实现 opts.port || 4180 把 0 当 falsy,导致测试/多实例抢占 4180(与 nexus EADDRINUSE 同源)。已改为显式判 undefined。
  2. 一键命令内存态(修复):demo/stress/chaos/board-claim 默认 persist:false + 动态端口,避免污染 state/ 文件导致计数错乱(实测 stress 曾出现 done 202>200)。
  3. LLM 输出健壮性(修复):extractJson 由「首括号→末括号」改为渐进式括号匹配(容忍尾随解释文本),实测修复 planner 反复失败;reviewer verdict/score 归一化;重试 3→4 + hint。
  4. LLM 失败诚实回退:demo 默认 GW_LLM_STRICT!=1 时回退确定性计划/评审并打印警告;live-llm 始终严格。
  5. 看板 mutator 语义(修复):doubao-hard board-client 要求 mutator 返回修改后 doc,v2-hard claim-settle 返回 true → 合并时已对齐,否则 PUT body 变 true 导致 409 风暴。
  6. LLM 测试偶发红(修复):套件 J 段真实调用最多重试 3 次退避,网络抖动不再误报;无 key 时降级为真实网络尝试断言。

已知边界

  • SSH/Hermes 远端执行器:协议层预留(adapter 可扩展 kind),未接真实远端
  • codex adapter 需本机装 codex CLI;adapter-http 已验证真实大模型
  • 看板接单桥需 dsh-task-board Host 运行于 127.0.0.1:32566(可 DSH_TASKBOARD_URL 覆盖)
  • GW_WORKTREE=1 需要 workspace-repo 是 git 仓库(失败自动回退普通目录)