Files
qinglong/docs/adr/ADR-0471-legacy-core-api-compatibility-baseline.md

4.9 KiB
Raw Permalink Blame History

ADR-0471Legacy 核心执行 API 兼容基线

  • 状态:Accepted
  • 日期:2026-08-20
  • 关联 RFCQL-RFC-0001 D-378、PR-0、Runtime Milestone Gate
  • 关联 ADRADR-0002、ADR-0445、ADR-0454、ADR-0470

上下文

QingLong 3.0 已经具备 Shadow Run、受门禁的 Manual Primary、Run/Event、取消恢复和本地/集群执行协议,但这些新能力不能以破坏 2.x Cron 与 Subscription API 为代价。现有路由仍是 Web UI、Shell、Open API 适配层和大量部署脚本的产品契约;仅验证 Runtime 内部状态机,不能证明 3.0 开关两侧仍保留相同的 HTTP method、path、请求校验、服务参数和响应 envelope。

首个兼容基线应从最靠近现有用户执行闭环的路径开始:Cron 与 Subscription 的列表、创建、更新、启停、手动运行、停止和日志。测试必须执行真实 Express Router 与 Celebrate 校验器,而不是复制一份路径清单或只搜索源码。它也不能为了测试方便启动完整 QingLong master/worker、数据库、gRPC、 Scheduler 或任何 3.0 后台 lifecycle。

决策

  1. 增加独立的真实回环 HTTP 契约测试,直接注册生产 back/api/cron.tsback/api/subscription.ts Router,并挂载在现行 /api 前缀。
  2. 服务层使用 TypeDI 注入的确定性 spy,因此测试只裁决 Router 责任:HTTP method/path、Celebrate request contract、参数透传、2.x response envelope 与错误请求在 service dispatch 前拒绝。它不伪造数据库、进程或 Scheduler 集成证据。
  3. Cron 基线覆盖 list、create、update、disable、enable、run、stop、单日志、日志列表和单实例 stop。run|stop|enable|disable 继续返回 {code: 200},不得因为 3.0 内部拥有 Run ID 而向 2.x 成功 envelope 强塞 v3 字段。
  4. Subscription 基线覆盖 list、create、update、disable、enable、run、stop 和日志;searchValueids 与 numeric ID 的现有转换语义保持不变。
  5. 非法 Cron run 与 Subscription stop body 必须由真实校验器返回 HTTP 400,且 service spy 调用数保持不变,证明无副作用 dispatch。
  6. 本切片只增加测试、ADR 和 RFC 状态,不修改任何生产 function/class/method,不新增依赖、package、binary、schema、migration、端口、服务、timer、 queue、cache、数据库连接或部署对象。测试结束时关闭临时回环 listener 并清理 TypeDI token。
  7. 本基线不是“完整 2.x 兼容已完成”的声明。System、Script、Open API、鉴权/错误码、真实 SQLite 升级、Primary 开关双态、目标实例回滚和 UI/Shell 仍须后续独立 contract 与 rehearsal,完成前 Runtime Milestone Gate 保持未关闭。

被拒绝的替代方案

只用正则扫描路由源码

拒绝。文本存在不能证明路由注册顺序、校验器转换、TypeDI 调用和实际 JSON 序列化行为。

启动完整 QingLong 服务作为每次后端单测前置条件

拒绝。它会把数据库、gRPC、cluster fork、文件系统和调度器故障混入 Router contract,增加低配开发机和 CI 的成本,也无法精确定位兼容漂移。

让 2.x run 响应直接返回 QingLong 3.0 Run 对象

拒绝。现有客户端依赖 code-only 的异步接受语义;Run/Event 应通过 /api/v3 或后续显式兼容扩展发现,不能静默改变 2.x envelope。

将全部 2.x API 一次性冻结在一个超大测试中

拒绝。首个阶段优先覆盖执行主路径,并明确登记剩余域;后续 contract 应按 Identity/Open API、System/Script、文件与日志等稳定产品边界扩展,避免难以维护的 单体 fixture。

升级与回滚

  • 本切片没有生产行为和持久化变更。升级只增加 CI 回归门,运行中实例不加载测试文件。
  • 若契约基线本身错误,可回滚测试、ADR 与 RFC 增量;不得通过删除测试掩盖真实 2.x 兼容回归,应先由 Maintainer 明确批准兼容变更。

验证与证据

  • 聚焦真实 Router 契约为 18/18,覆盖 16 个成功路径/子路径和 2 个校验前拒绝路径;每个成功路径同时校验 HTTP 状态、JSON envelope 与 service 参数。
  • 完整 backend 为 1,523 total / 1,521 pass / 2 conditional skip / 0 fail18-package clean build 与逐包测试在允许既有 Worker TLS 回环门后单次退出 0。
  • package boundary、Cluster dependency、Edge import、Cluster/Worker deployment、Console 与 Console distribution 七项审计全部 compatible/passedworkspace 仍为 18 packages、singleSourcePackages=[]shallowSourcePackages=[]
  • 14 档 Local artifact audit 全部 compatible;基础 Edge/Standalone 为 2,598,669 / 2,598,747 bytes、57 loaded modules Application+AI 为 4,501,822 / 4,501,954MCP 为 7,324,601 / 7,324,709。新增测试不进入任何运行制品。
  • PostgreSQL HA 不重跑且不重新占有既有证明,因为本切片没有 schema、ACL、repository、role、Pool、连接或 failover 变化。