feat(ql3): close cross-profile alpha stage index

This commit is contained in:
whyour
2026-08-28 01:07:04 +08:00
parent 07d1dd97c1
commit 82d74cf56f
9 changed files with 1167 additions and 2 deletions
+4 -2
View File
@@ -6,10 +6,12 @@
- 目标版本:QingLong 3.x
- 作者:QingLong Maintainers
- 创建日期:2026-07-17
- 最后更新:2026-08-27
- 最后更新:2026-08-28
- 讨论范围:架构与演进路线,不包含最终 UI 视觉方案
最新增量证据(2026-08-27):
最新增量证据(2026-08-28):
- D-415/ADR-0510(已实现,首份真实 stage index 待授权):二十天开发形成的 Local 与 Cluster 候选现在有统一、面向部署者的最外层阶段交付入口。新增 `qinglong/alpha-stage-index@v1` finalizer/auditor,仅在显式 `produce_alpha_artifacts=true + alpha_artifact_scope=all` 且 Local/Cluster milestone 都成功后运行;它重新离线审计两个索引,要求 version/source/workflow SHA/ref/run/attempt 完全一致,记录两个 milestone manifest digest,并为 amd64/arm64 写出机器可读选择:低配 Edge/Standalone 只下载一个 Local Trial Kit、稳态只运行 Application 且 Operator 短时启动;Cluster 下载 control/admin/worker,按需增加 control-ai。跨索引审计必须同时持有 stage 与两个 milestone,拒绝跨运行混用、内容/选择漂移和额外文件。该索引不重复十个大 archive,不改变 Local-only/Cluster-only 授权路径,也不冒充受保护 tag、GHCR immutable digest、签名、正式 OCI catalog、生产 deployment lock 或 HA;普通 push/PR 不生成实际阶段 artifact。实现不新增 workspace package、runtime dependency、镜像 layer、端口、daemon、timer、连接池或 Edge/Standalone 稳态 RSS。
- D-414/ADR-0509(已实现,首份真实 Cluster milestone artifact 待授权):开发约二十天后,Cluster 阶段产物不再是八个由 workflow 内联 shell 自报 `passed` 的松散 archive。新增统一 `qinglong/alpha-cluster-image@v1` materializer/auditor,固定 control/control-ai/admin/worker 的 repository、OCI title、non-root user 和 amd64/arm64 identity;每个六文件 bundle 含单镜像 Docker archive、精确 SBOM、绑定 source/workflow SHA/ref/run/attempt/role/architecture/image ID 的 verification evidence、README、manifest 与 `SHA256SUMS`,下载后可无 Docker/网络离线复核闭合文件集和内容 digest。新增完整 CI 后置 `cluster-alpha-milestone` finalizer,重新下载八个 artifact,要求同一 version/source/run/attempt 且八个 image ID/archive digest/verification digest 互异,再上传 `qinglong/alpha-cluster-milestone@v1` 三文件索引;没有该索引的部分 archive 只是失败运行中间件。maturity 明确为 `cluster_integration_candidate_not_public_release`,适用于隔离 registry/K3s/Kubernetes 集成,不冒充受保护 tag、GHCR digest、签名、catalog 或生产 HA。实现不新增 workspace package、runtime dependency、镜像 layer、端口、daemon、timer、连接池或 Edge/Standalone 稳态 RSS;首份实际产物仍需维护者明确触发 `produce_alpha_artifacts=true + alpha_artifact_scope=cluster`
@@ -0,0 +1,55 @@
# ADR-0510:跨 Profile Alpha 阶段交付索引
- 状态:Accepted(首份实际 stage index 待维护者授权)
- 日期:2026-08-28
- 决策:D-415
- 关联:ADR-0503、ADR-0506、ADR-0508、ADR-0509
## 背景
QingLong 3.0 已开发约二十天。D-413 与 D-414 分别闭合了双架构 Local Alpha Trial Kit 和四角色乘双架构 Cluster Integration Candidate,但部署者仍需自行理解两个 milestone、十个大归档、三种 Profile 和不同成熟度。
两个 milestone 分别成功不能自动证明它们来自同一源码与同一次完整 CI。维护者也缺少一个最外层、机器可读的阶段交付入口来回答“本次 Alpha 到底交付了什么”和“路由器或集群节点应该下载哪些文件”。
## 决策
### 1. 只有完整 `all` 运行才生成最外层索引
新增 `alpha-stage-index` 后置 job,仅在显式 `produce_alpha_artifacts=true + alpha_artifact_scope=all` 时运行,并只依赖已经成功的 `local-alpha-milestone``cluster-alpha-milestone`。它重新下载两个小索引并调用各自的离线 auditor,要求 version、source revision、workflow ref/SHA、run ID/attempt 完全一致。
成功后上传三文件 `qinglong/alpha-stage-index@v1`。其 maturity 固定为 `alpha_stage_delivery_not_public_release`,并记录两个 milestone artifact 名和 manifest digest。普通 push/PR、只生成 Local 或只生成 Cluster 的运行都不会产生该索引。
### 2. 部署选择进入机器可读契约
索引为 amd64、arm64 分别固定:
- Edge/Standalone 选择一个 Local Trial Kit;稳态角色只有 ApplicationOperator 是短生命周期角色;
- Cluster 最小集选择 control、admin、workercontrol-ai 是显式可选项;
- 部署者只下载目标架构,不要求复制另一架构或无关角色。
跨索引 auditor 必须同时持有 stage、Local milestone、Cluster milestone,逐层复审并核对 manifest digest 和选择结果,拒绝跨 run 混用、内容篡改、额外文件或选择漂移。
### 3. Stage index 不获得正式发布权威
该名称刻意使用 `stage index`,不复用 Public Release Set 的 OCI release catalog。它不提供受保护 tag、GHCR immutable digest、签名、attestation、生产 deployment lock、HA、升级或 LTS 承诺。Local 与 Cluster 原有 maturity 不被最外层索引抬高。
## 被拒绝的替代方案
- 只写一页人工说明:无法绑定 exact source/run,也不能阻止部署选择和产物清单漂移。
- 把十个大归档再次合并:浪费下载与存储,尤其伤害低配设备和只需要部分 Cluster 角色的用户。
- 每次普通 CI 都生成阶段索引:没有实际可下载归档时索引会形成伪里程碑。
- 直接使用正式 release catalogAlpha archive 没有 public immutable digest、签名和受保护 tag,不具备该 authority。
## 影响
- 显式 `scope=all` 增加两个小 artifact 下载、一次纯本地交叉审计和一个三文件小索引;
- Local-only/Cluster-only 授权继续独立工作,不被强迫生成另一部署档位的大归档;
- 不新增 workspace package、runtime dependency、镜像 layer、端口、daemon、timer、连接池或稳态 RSS
- 低配设备获得明确的单 Trial Kit 选择,集群节点获得最小三角色与可选 AI 的精确选择。
## 验证
- 正向测试覆盖同 run 的两个 milestone 闭合、十个 artifact 选择与三 Profile 报告;
- 负向测试覆盖跨 attempt 混用、stage 内容篡改、额外文件、缺少 milestone dependency 和 scope 漂移;
- workflow audit 固定 `all` 条件、双 milestone dependency 和 `finalize → audit → upload` 顺序;
- 首份真实索引仍需维护者显式授权 `produce_alpha_artifacts=true + alpha_artifact_scope=all`
+1
View File
@@ -513,6 +513,7 @@
| [ADR-0507](./ADR-0507-public-local-application-and-operator-release-pair.md) | Public Local Application 与 Operator 发布对 | Accepted(首份真实公开发布待受保护 tag) |
| [ADR-0508](./ADR-0508-cross-architecture-local-alpha-milestone-closure.md) | 跨架构 Local Alpha 里程碑闭合 | Accepted(首份实际 milestone artifact 待维护者授权) |
| [ADR-0509](./ADR-0509-cluster-alpha-bundle-and-milestone-closure.md) | Cluster Alpha Bundle 与跨架构里程碑闭合 | Accepted(首份实际 Cluster milestone artifact 待维护者授权) |
| [ADR-0510](./ADR-0510-cross-profile-alpha-stage-delivery-index.md) | 跨 Profile Alpha 阶段交付索引 | Accepted(首份实际 stage index 待维护者授权) |
## 规则
+5
View File
@@ -13,6 +13,8 @@
`Local Alpha Trial Kit + Local milestone index` 是本阶段的用户可试运行产物;`Cluster Integration Candidate + Cluster milestone index` 是集群部署者可下载、可离线验真的集成产物。单个 headless runtime、单个 Cluster archive 或没有 milestone index 的部分矩阵产物都只是工程中间件。Cluster milestone 仍不满足正式 Kubernetes deployment-lock 的 GHCR immutable digest 与 catalog provenance。
当维护者显式选择 `alpha_artifact_scope=all` 时,还会生成 `Alpha stage index`。它把同一次 run 的 Local/Cluster milestone 交叉绑定,并为 Edge、Standalone、Cluster 给出目标架构的最小 artifact 选择;这是阶段交付导航,不是正式 release catalog。只生成 Local 或 Cluster 时,各自 milestone 仍可独立成立,不制造一个不完整的总索引。
## 当前阶段实物(2026-08-27
提交 `4239464af6937d56528a0a2c573d12329bc7ca55` 已形成最新 owner-private arm64 工程候选:
@@ -36,6 +38,7 @@ ADR-0506 现要求 `qinglong/alpha-local-trial-kit@v2` 额外包含 `verificatio
- `ql3-alpha-<commit>-local-milestone`
- `ql3-alpha-<commit>-control-<arch>``control-ai-<arch>``admin-<arch>``worker-<arch>`
- `ql3-alpha-<commit>-cluster-milestone`
- 仅 `alpha_artifact_scope=all``ql3-alpha-<commit>-stage-index`
Local artifact 含:
@@ -47,6 +50,8 @@ Local artifact 含:
Cluster artifact 是每角色/架构一个六文件闭包:native Docker archive、精确 CycloneDX SBOM、workflow-bound verification evidence、README、`qinglong/alpha-cluster-image@v1` manifest 和覆盖全部内容文件的 `SHA256SUMS`。完整 CI 成功后,八个 bundle 由 `qinglong/alpha-cluster-milestone@v1` 小型索引闭合;索引本身不重复存放大 archive。
Stage index 是 `qinglong/alpha-stage-index@v1` 三文件闭包。它重新审计两个 milestone,要求 version/source/workflow SHA/ref/run/attempt 一致,并把路由/NAS 的单 Local Trial Kit 与 Cluster 的 control/admin/worker 最小集、可选 control-ai 写为机器可读选择;它不重复存放任何镜像 archive。
任何 required job 失败时不上传对应产物。artifact 名和 archive 内的 `ci-*` tag 都表示 commit-bound candidate,不能改名后冒充 `v3.x` release。
## 下载后验证与最小 smoke
+41
View File
@@ -0,0 +1,41 @@
# QingLong 3.0 Alpha 阶段交付索引
本目录是一次 `alpha_artifact_scope=all` 运行的最外层交付入口。它把同一源码、同一 GitHub Actions run/attempt 的 Local Alpha milestone 与 Cluster Alpha milestone 绑定起来,并为 Edge、Standalone 与 Cluster 部署者给出机器可读的最小下载选择。它不是正式 release catalog,也不包含 Docker archive。
## 先判断设备类型
| 设备或环境 | 选择 | 稳态组件 | 需要下载 |
| --- | --- | --- | --- |
| 低配路由器、NAS、单机 | `deploymentSelections.local` | 仅 Local ApplicationOperator 只在 setup/upgrade/recovery 短暂运行 | 目标架构的一个 Local Trial Kit |
| 临时 K3s/Kubernetes 集群 | `deploymentSelections.cluster` | control、admin、workerAI 按需增加 control-ai | 目标架构的三个 required artifact;需要 AI 时再下载 optional artifact |
不得把四个 Cluster 角色部署到低配路由器,也不需要为一台 amd64 主机下载 arm64 归档。索引固定列出十个可选择 artifact,但每个部署者只下载目标 Profile、架构和角色所需的子集。
## 验证
1. 在本目录运行 `sha256sum --check SHA256SUMS`
2. 检查 `manifest.json`
- schema 为 `qinglong/alpha-stage-index@v1`
- maturity 为 `alpha_stage_delivery_not_public_release`
- source revision、run ID/attempt 是准备验证的显式 workflow run
- `milestones.local``milestones.cluster` 分别指向同一提交的 milestone artifact。
3. 下载两个 milestone 小索引,比较各自 `manifest.json` 的长度与 SHA-256 是否等于本索引的记录。
4. 按 `deploymentSelections` 下载目标大归档,再按对应 milestone 和 bundle README 逐层执行 checksum 与离线审计。
持有同一版本源码与 Node.js 24 时,可以一次复审三层索引:
```sh
node scripts/ql3-alpha-stage-index.cjs \
--mode=audit \
--stage=/absolute/path/to/stage-index \
--local-milestone=/absolute/path/to/local-milestone \
--cluster-milestone=/absolute/path/to/cluster-milestone
```
该命令拒绝跨 source、version、run/attempt 混用,重新执行两个 milestone auditor,并核对 milestone manifest digest 与部署选择。它不访问 Docker 或网络,也不会重新执行漏洞扫描、真实用户旅程或 Kubernetes live gate。
## 成熟度和回退边界
本索引只证明一次显式 Alpha 运行同时形成了两个部署档位的闭合候选物。Local 仅供 fresh、隔离、非生产目录试用;Cluster 仅供隔离 registry、临时命名空间和可删除数据库集成。它不提供受保护 tag、公开 GHCR immutable digest、签名、attestation、生产 deployment lock、HA、升级或长期支持承诺。
Local 回退是停止并删除 Alpha 容器和 fresh 测试目录;Cluster 回退是删除临时 workload、测试数据和 credential,并恢复原 deployment lock。任何 2.x 数据迁移或生产写入仍必须走正式 cutover/reconciliation/rollback ceremony。