- 零第三方依赖,Node >=20 原生 ESM - 团队式编排引擎:拆解/路由/执行/审查/合并全真实 LLM - 阶段心跳、单一权威清单守卫、all-keys-failed 如实上报 - H4 会话视图/amend/watchdog 有界重试/产物区 artifacts.json - H5 零依赖三栏控制台
207 lines
12 KiB
Markdown
207 lines
12 KiB
Markdown
# 调度网关第二阶段统一开发任务书(P1 平台化)
|
||
|
||
**任务书版本**:1.0
|
||
**发布日期**:2026-09-10
|
||
**适用项目**:scheduler-gateway-epoch 6.0.0(P0 生产化基线已合并完成)
|
||
**执行方式**:四个模型同时执行同一份任务书
|
||
**阶段名称**:P1 平台化(多用户 / 任务模板 / 凭据与权限 / 执行器平台化)
|
||
|
||
## 一、任务目标
|
||
|
||
在 P0 生产化基线(状态机 / Repository / 幂等 lease / revision 乐观锁 / 事件持久化 /
|
||
回调 HMAC / 取消传播 / 死信加固 / 健康检查)全部完成并合入的基础上,把单机原型升级为
|
||
**多用户、多项目、可策略治理、执行器可平台化的运行平台**,同时保持现有 API、面板、
|
||
插件、看板桥与团队编排兼容。
|
||
|
||
1. 引入项目(projectId)边界:任务、运行、节点、产物、审计、死信查询强制带项目边界。
|
||
2. 引入身份与权限:节点 token 可创建/禁用/轮换,禁止长期使用默认 token;权限分级。
|
||
3. 引入任务模板与策略引擎:版本化 JSON Schema 的任务 schema、策略字段与检查。
|
||
4. 执行器平台化:节点注册元数据扩展,外部 CLI 统一 adapter 生命周期接口,节点 drain 与标签。
|
||
5. 统一 API v1 与可观测性:`/api/v1` 前缀、分页/过滤/排序、结构化日志与 metrics。
|
||
|
||
本阶段**不做**数据库强制迁移(FileRepository 保持默认可用,SQLite/PG 只留接口与文档)、
|
||
不做 SSH 真实接入(保留协议预留)、不重写团队编排器、不开发新模型适配器。
|
||
|
||
## 二、当前代码基线(P0 已完成,直接在此基础上开发)
|
||
|
||
```text
|
||
src/domain/errors.js 已知错误码 + GatewayError
|
||
src/domain/task-state-machine.js A:状态机(canTransition/transition/别名/终态)
|
||
src/domain/repositories.js B:Repository 接口 + 失败分类
|
||
src/adapters/storage/file-repository.js B+H:File/Event/DeadLetter Repository
|
||
src/application/task-service.js C/D/G/J/K:create/approve/settle/cancel/retryDead
|
||
src/application/callback.js I:回调 HMAC + 指数退避 + 幂等头
|
||
src/platform/config.js E:loadConfig/checkConfig/redactConfig
|
||
src/platform/health.js E:healthz/readyz
|
||
src/server.js 状态机/服务接缝;X-Request-Id;错误信封;SSE 补播;Idempotency-Key
|
||
src/scheduler-core.js claim lease / settle 校验 / 死信完整字段
|
||
src/node-runtime.js 回报携带 lease/attempt/revision;cancelLoop
|
||
test/phase1.mjs P0 专项 114 断言(并入 live-suite S 段)
|
||
P0-DELIVERY.md P0 交付报告(修改清单/迁移表/Repository/幂等语义/性能基线)
|
||
```
|
||
|
||
现有行为、接口、测试是兼容基线;除非本任务书明确要求,不得删除、改名或改变既有 API 语义。
|
||
|
||
## 三、统一技术约束(必须遵守)
|
||
|
||
- Node.js >= 20,原生 ESM,零第三方运行时依赖(本阶段同样不得引入第三方运行时依赖)。
|
||
- 只使用 ASCII 新增代码和注释;已有中文文件按原编码维护。
|
||
- 不得修改 `_archive`、`out`、`work`、`evidence` 中已有历史产物。
|
||
- 不得把密钥写入日志、测试快照、证据文件、任务结果、argv 或错误消息。
|
||
- 不得通过任意 `task.state = ...` 绕过状态机;新增路径一律走统一状态机/服务。
|
||
- 不得为了让测试通过而静默吞错、伪造 REAL 结果或扩大重试上限。
|
||
- 保留并扩展 REAL/OFFLINE/fixture 诚实标记。
|
||
- 生产默认配置不能依赖 `dev-token-change-me`;任一安全模式必须能拒绝不安全默认值。
|
||
- 所有新能力必须带离线测试、故障测试与真实运行证据;不得只新增函数不接入真实路径。
|
||
|
||
## 四、统一交付范围
|
||
|
||
### 任务 L:项目与租户边界(P1-01)
|
||
|
||
- 任务、运行、节点、产物、审计、死信全部引入 `projectId`;默认项目为 `default`(兼容旧数据)。
|
||
- 创建任务支持 `projectId`;列表/查询接口支持按项目过滤;跨项目操作必须拒绝或显式声明。
|
||
- 产物索引(artifacts 索引)携带 projectId,下载/访问校验项目边界。
|
||
- 审计记录追加 `projectId`;面板/导出可筛选。
|
||
- 保留 `persist:false` 内存测试模式与既有数据兼容(旧记录视为 default 项目)。
|
||
|
||
### 任务 M:身份、凭据与权限(P1-02)
|
||
|
||
- 节点 token 纳入凭据管理:支持创建/禁用/过期时间/轮换(`GET/POST /api/v1/nodes/:id/credentials` 或等价)。
|
||
- 服务间使用短期 token 或复用现有节点 token 机制扩展;**禁止长期使用默认 token**,
|
||
生产/安全模式检测到默认 token 直接拒绝启动或明确警告(已有 checkConfig 基础上扩展)。
|
||
- 权限至少分为:查看任务 / 创建任务 / 审批任务 / 管理节点 / 查看敏感证据 / 管理预算(可枚举枚举实现,
|
||
不要求完整 RBAC 引擎)。
|
||
- 管理节点 / 敏感证据等敏感操作必须有权限校验;无权限返回统一 403 错误信封。
|
||
- 密钥脱敏全面覆盖:错误、审计、状态、导出、日志均不得出现明文 token/key/password/secret。
|
||
|
||
### 任务 N:任务模板与策略引擎(P1-03a)
|
||
|
||
- 把任务输入固化为版本化 JSON Schema(`src/domain/task-schema.js` 或等价),提供校验函数
|
||
(字段类型/必填/regex/裁剪),非法任务创建请求以统一错误码(INVALID_ARGUMENT)拒绝。
|
||
- 支持任务模板:至少 4 个内置模板(coding / research / writing / data-processing),
|
||
每个模板含默认 prompt 骨架、默认 capabilities、默认策略。
|
||
- 支持策略字段(任务自带或模板带入):`allowNodes`、`maxAttempts`、`timeoutMs`、`maxCost`、
|
||
`requiresApproval`、`allowNetwork`、`allowFiles`。
|
||
- `SecurityGuard`/安全检查升级为策略引擎:输入检查、路径范围、出站动作审批、
|
||
成本/时长熔断(超出 maxCost/maxAttempts 时任务进入 failed/dead 并审计)。
|
||
|
||
### 任务 O:执行器与节点平台化(P1-03b)
|
||
|
||
- 节点注册信息扩展:`version`、`os`、`region`、`resources`、`capabilitiesVersion`、`health`(健康探针时间戳)。
|
||
- 外部 CLI 执行器统一 adapter 生命周期接口:`start / cancel / checkTimeout / collectLog / collectArtifacts / exitReason`
|
||
(在现有 `src/nodes/*` 与 `src/team/installer.js` 之上封装,不破坏既有行为)。
|
||
- 节点 drain:标记 drain 节点不再接新任务,但允许在途任务完成;现有任务可重投到其它节点。
|
||
- 节点标签与亲和性:节点可打标签(如 gpu/windows/private-network/coding),任务策略中的
|
||
`allowNodes` / 标签匹配影响调度路由。
|
||
|
||
### 任务 P:统一 API v1 与可观测性(P1-04)
|
||
|
||
- 新增 `/api/v1/...` 版本化接口族(任务 CRUD、运行、事件、审计、节点、死信、健康),
|
||
旧 `/api/tasks` 等接口保留兼容期并在文档标注 deprecated。
|
||
- 所有 v1 列表接口支持 `page/pageSize`、`filter`、`sort`、时间范围。
|
||
- 写接口全面支持 `Idempotency-Key` 与 `X-Request-Id`(继承 P0 已实现的机制并拓展到新接口)。
|
||
- 结构化 JSON 日志:每条日志带 `timestamp / requestId / runId / taskId / nodeId / stage`。
|
||
- 新增 `/metrics`(进程/任务吞吐/排队时长/执行时长/成功率/重试率/死信数/节点在线率,简单计数器即可)。
|
||
- /healthz、/readyz 保持可用,/readyz 纳入新配置项检查。
|
||
|
||
### 任务 Q:补齐测试与验证脚本(P1-05)
|
||
|
||
新增/扩展测试,覆盖以上 L/M/N/O/P 每个任务:
|
||
|
||
- 项目边界:跨项目操作拒绝、默认项目兼容、产物下载越权拒绝。
|
||
- 凭据与权限:token 创建/禁用/轮换、过期 token 拒绝、默认 token 拒绝启动、越权 403。
|
||
- 模板与策略:模板校验、非法任务拒绝、策略熔断(超过 maxAttempts/maxCost 进 dead)、无权限操作拒绝。
|
||
- 节点平台:drain 不再派发新任务、标签亲和性路由、adapter 生命周期(cancel/超时/日志/产物)。
|
||
- 可观测:/metrics 计数器存在、结构化日志字段齐全、/readyz 对不安全默认值失败。
|
||
- 回归:P0 全部测试(npm test / test:conversation / e2e-team / recovery-demo / stress)保持通过。
|
||
|
||
## 五、明确不允许的实现结果
|
||
|
||
- 只新增 schema/字段但未接入真实任务/查询/调度路径。
|
||
- 用放宽断言、删除测试、无限重试来"制造全绿"。
|
||
- 把项目边界做成装饰性字段(查询仍可跨项目读到别项目数据)。
|
||
- token 权限校验形同虚设(任何 token 都可通过敏感操作)。
|
||
- 引入数据库/Redis/MQ 作为本阶段必须依赖,破坏零依赖模式。
|
||
- 修改归档文件或清理 evidence 掩盖回归。
|
||
- metrics/日志字段只是打印出来但没有真实指标聚合与导出。
|
||
|
||
## 六、完成验收标准
|
||
|
||
### 功能验收
|
||
|
||
- [ ] 项目边界生效:跨项目创建/查询/产物访问被拒绝或隔离。
|
||
- [ ] 节点 token 可管理(创建/禁用/轮换),默认 token 在生产/安全模式被拒绝。
|
||
- [ ] 权限分级生效:敏感操作无权限返回 403。
|
||
- [ ] 任务 schema 校验生效:非法请求 INVALID_ARGUMENT。
|
||
- [ ] 内置任务模板可创建对应任务;策略熔断生效。
|
||
- [ ] 节点 drain 与标签亲和性生效。
|
||
- [ ] /api/v1 可用,旧接口兼容期内仍工作。
|
||
- [ ] /metrics、/healthz、/readyz 可用且脱敏。
|
||
- [ ] 结构化日志字段齐全。
|
||
|
||
### 回归验收
|
||
|
||
```powershell
|
||
npm test
|
||
npm run test:conversation
|
||
npm run e2e-team
|
||
npm run recovery-demo
|
||
npm run stress
|
||
```
|
||
|
||
所有命令退出码为 0;若本机无真实 LLM key,真实 LLM 命令不得伪装成功,沿用 OFFLINE/fixture 方式。
|
||
|
||
### 性能验收
|
||
|
||
- 现有 stress 规模无重复领取、无永久丢失、无重复终态。
|
||
- 引入项目边界/schema 校验后,stress 吞吐下降不超过 10%;提供改造前后 baseline 对比。
|
||
|
||
### 安全验收
|
||
|
||
- 错误、审计、状态、导出、日志均无任何 key/token/password/secret 明文。
|
||
- 默认 token、越权、跨项目访问、伪造 lease 均有拒绝结果。
|
||
- 不引入新的 shell 拼接、动态代码执行或不受限文件路径。
|
||
|
||
## 七、交付物格式(每个模型必须提交)
|
||
|
||
```text
|
||
1. 修改文件清单
|
||
2. 实现摘要
|
||
3. 项目边界/权限/模板/策略设计说明
|
||
4. 新增接口说明(含 /api/v1 路由表)
|
||
5. 测试命令与实际结果
|
||
6. 未完成项和已知风险
|
||
7. 与其它模型合并时的冲突点
|
||
```
|
||
|
||
禁止只提交"已完成/测试通过"等无证据结论。
|
||
|
||
## 八、四模型协作规则
|
||
|
||
四个模型使用完全相同任务书,各自独立工作区/分支,禁止互相覆盖文件。为减少冲突,建议侧重
|
||
(验收标准对四模型完全相同,不以分工为由留下失败测试):
|
||
|
||
- 模型 1:重点任务 L(项目边界)+ 任务 P 的 /api/v1 与旧接口兼容。
|
||
- 模型 2:重点任务 M(凭据与权限)+ 安全验收(防越权/脱敏/默认 token 拒绝)。
|
||
- 模型 3:重点任务 N(模板与策略引擎)+ 策略熔断 + 任务 O 的节点 drain/标签/亲和性。
|
||
- 模型 4:重点任务 O 的 executor adapter 生命周期 + 任务 Q(测试补齐)+ metrics/日志/readyz。
|
||
|
||
合并顺序建议:schema/错误码基座 → 项目边界 → 凭据权限 → 模板策略 → 节点平台 → v1 与可观测 → 全量回归。
|
||
|
||
## 九、给模型的执行指令
|
||
|
||
你正在参与 scheduler-gateway-epoch 第二阶段 P1 平台化开发。请严格按本任务书执行:先阅读
|
||
README、ARCHITECTURE、IMPLEMENTATION、ADR、P0-DELIVERY.md 与相关源码,确认 P0 基线行为后
|
||
再修改。你的目标是提交可合并代码,而不是写方案。保持 Node >=20、零第三方运行时依赖、
|
||
REAL/OFFLINE/fixture 诚实标记与现有 API 兼容(旧接口兼容期内不可破坏)。所有新能力必须
|
||
接入真实任务路径并补充离线/故障/安全测试。完成后运行对应测试,报告实际命令、退出码、
|
||
修改文件与剩余风险。不得修改归档目录,不得删除用户已有改动,不得泄漏任何密钥。
|
||
|
||
## 十、阶段完成定义
|
||
|
||
- 项目边界、凭据权限、模板策略、执行器平台、v1 API、可观测性全部接入真实路径。
|
||
- 全量回归(P0+P1 新测试)通过。
|
||
- 越权、跨项目、默认 token、伪造凭据等安全路径均有拒绝证据。
|
||
- 现有面板、插件、看板桥、团队编排未被破坏。
|
||
- 文档、测试数字与代码实际状态一致。
|