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

55 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 仓库(失败自动回退普通目录)