Files
qinglong/docs/adr/ADR-0464-machine-enforced-node24-architecture-support-tiers.md
T

6.3 KiB
Raw Blame History

ADR-0464:机器化 Node 24 架构支持分层

  • 状态:Accepted
  • 日期:2026-08-20
  • 关联 RFCQL-RFC-0001 D-14、D-16、D-371
  • 关联 ADRADR-0006、ADR-0088、ADR-0281、ADR-0329、ADR-0463
  • Accepts and operationalizesADR-0006

上下文

QingLong 部署跨度从低性能路由设备、NAS 到 Cluster control plane 与 Worker 节点。2.x 历史镜像覆盖的架构数量, 不能直接等价为完整 3.0 ql-core 的支持承诺:3.0 固定使用 Node 24 和 node:sqlite,而上游官方产物、镜像 variant 与原生测试资源没有覆盖 ARMv6、ARMv7 和 386。此前 ADR-0006、D-14 与 D-16 仍是 Proposed,发布脚本 虽然实际只生成 amd64/arm64,却没有一个机器可读、可审计的支持分层,因此文档、OCI manifest 与未来 matrix 可能独立漂移。

继续把所有历史架构放进一个默认 manifest 会让低配设备用户收到虚假升级承诺;反过来静默删除这些架构也会 损害现有部署。3.0 必须同时诚实声明完整核心的边界,以及 2.x legacy 和未来受限 Worker 兼容路径的边界。

决策

  1. 接受 ADR-0006。3.0 ql-core 的唯一生产运行时基线固定为 Node 24.18.0engine 为 >=24.18.0 <25;不同架构不能在同一个 3.0 tag 下静默回退 Node major。
  2. ql3-release.json 升级为 qinglong/release-identity@v2,增加 exact-shape architectureSupport,作为版本、Node、workspace 边界和架构政策的单一发布事实源。
  3. 当前 Tier 1 精确为 amd64arm64。只有它们进入默认 3.0 OCI platform 列表与原生 OS vulnerability matrix;每个 image 都必须在对应原生 runner 构建、扫描并绑定 immutable OCI evidence。
  4. ppc64les390x 为 candidates,不是已支持平台。只有获得固定 Node 24 image variant、原生 runner/设备、数据库 migration/backup/restore、任务、资源和发布证据后,才能通过新的 release identity schema 变更进入 Tier 1。
  5. arm/v7 当前为 experimental blocked:没有已接受的 maintainer owner、可重复 Node 24 toolchain 与设备门。 补齐后也必须使用独立 experimental tag,不自动进入默认 manifest。
  6. arm/v6386 为 legacy-only,显式绑定 2.x line。它们不能被标成满足 D-16 的完整 3.0 ql-core EOL、迁移、备份和受限 Worker 兼容协议分别治理,不能由本 ADR 虚构完成状态。
  7. scripts/lib/ql3-release-identity.cjs 对 v2 字段、顺序和值失败关闭并深冻结架构列表;非 canonical JSON、 添加未知字段或把 candidate 擅自加入 Tier 1 都会被拒绝。
  8. release candidate 从 Tier 1 派生 linux/<arch> platforms 和每镜像原生 runner matrix,并加入 architecture-support-tier 必需门。Tier 1 没有受审 runner mapping 时发布失败,而不是降级为 QEMU 或跳过扫描。
  9. release identity digest 继续传入 candidate、image record、release set、catalog、publication closure 与 deployment lock,支持矩阵变化会自然改变整条发布证据链;version audit 同时输出架构分层。
  10. 本实现不新增 workspace package、生产 dependency、runtime binary、服务、timer、端口、数据库对象或 部署 workload。它只改变离线发布权威和 CI matrix,因此 Edge/Standalone 常驻资源闭包保持不变。

被拒绝的替代方案

保留文档表格,发布脚本继续硬编码 amd64/arm64

拒绝。两份事实源会在新增架构、Node patch 或 workflow 重构时漂移,且 release set 无法证明自己遵循哪份政策。

为架构政策新增一个 workspace package

拒绝。该政策只有一个根发布事实源和离线 validator,没有独立生产生命周期或依赖边界;新增 package 会重现 单文件微包问题,并让低资源制品审计承担无收益的结构成本。

立即把 ppc64le、s390x 加入 Tier 1

拒绝。上游可能存在 Node binary 不等于当前 Debian image、数据库、恢复、资源和发布门已经完成;支持承诺必须 由同等级证据产生。

把 ARMv7 直接归入 legacy-only 或 Tier 1

拒绝。它仍保留 experimental 的技术路径,但当前资产不足以发布;既不能掩盖未来可能性,也不能伪造现有支持。

让旧设备在 3.0 tag 下运行 Node 20/22

拒绝。同一版本跨架构拥有不同 SQLite、Web API、插件 engine 与安全周期,会使 ql-core capability 不可判断。

验证与证据

  • release candidate、version transition、release set、catalog、publication closure 和 deployment lock 聚焦回归为 55/55,覆盖 v2 schema、精确支持分层、来源派生 platforms/matrix、必需门与 post-create mutation 拒绝。
  • 架构漂移负向用例把 ppc64le 未经 schema 变更加入 Tier 1release identity audit 必须失败关闭。
  • 完整 backend 工作区为 1,503 total / 1,501 pass / 2 conditional skip / 0 fail;其中包含一条既有、未跟踪且 不会提交的用户测试,因此 D-371 提交范围对应 1,502 total / 1,500 pass / 2 skip。沙箱首次运行唯一失败为 loopback listen EPERM,允许 127.0.0.1 的宿主环境原样重跑后零失败,未把权限限制误判成代码回归。
  • 18-package clean build 与逐包测试退出 0。release version、package boundary、cluster dependency、Edge import、 cluster deployment 与 image release 六项审计全部 compatibleworkspace 保持 18 packages、无 single/shallow package,证明本决策没有重新扩大 package 或依赖树。
  • 14 档 Local artifact audit 必须串行执行,因为并行 build/pack 会争用相同 package dist、产生不可信的短暂 字节差;串行复核全部 compatible。基础 Edge/Standalone 为 2,589,998 / 2,590,076 bytesApplication+AI 为 4,493,151 / 4,493,283 bytesMCP 为 7,315,930 / 7,316,038 bytes,与 D-370 稳定基线一致。

后续边界

  • 制定 2.x legacy line 的可见 EOL、备份/迁移说明,不能只在内部 RFC 中声明。
  • 为旧设备参与 3.0 设计最小 capability、身份、调度限制和 EOL 明确的受限 Worker 协议;legacy Worker 不获得 Plugin Host、任意 Tool 或控制面数据库访问权。
  • ppc64le/s390x 进入 Tier 1 或 ARMv7 进入 experimental 前,必须先提交独立 ADR、runner/toolchain owner 与原生 证据;不能只修改数组让 CI 看似扩容。