Files
qinglong/docs/adr/ADR-0506-source-bound-local-alpha-verification-evidence.md
T

4.8 KiB
Raw Blame History

ADR-0506:源码绑定的 Local Alpha 验证证据

  • 状态:Accepted
  • 日期:2026-08-27
  • 决策:D-411
  • 关联:ADR-0503、ADR-0504、ADR-0505

背景

ADR-0504 把 Local Trial Kit 的写入与离线审计收敛为一个 materializer,但 v1 manifest 在 create 时会无条件写入九个 passed 字段。调用者只需提供可构建镜像和 SBOM,即可得到一份声称已经通过漏洞扫描、fresh Owner、Edge/Standalone lifecycle 与原生 cancellation 的 manifestmaterializer 并未收到这些 gate 的任何证据。

提交 4239464a 的 macOS Docker Desktop 复验进一步暴露了该语义错误:bundle 内容、checksum、reload 和入口 smoke 均通过,但完整 Owner 旅程因 bind-mount UID 语义失败;同提交的原生 Linux CI 后续通过。内容完整性、源码实现通过和 exact artifact 已被验证是三种不同事实,不能由一个常量同时代替。

决策

1. Alpha bundle 必须消费独立的 verification evidence

Local Alpha schema 升为 qinglong/alpha-local-trial-kit@v2create 新增必需的 --verification-evidence,并把 verification 从九个常量改为 verification-evidence.json 的文件记录。闭合目录从六个文件增加为七个,evidence 同时进入 manifest byte/SHA-256 绑定与 SHA256SUMS

缺少 evidence、旧 v1 manifest、额外文件、evidence mutation 或 subject 漂移全部失败关闭。旧 schema 尚未公开发布,因此不保留会继续接受无来源 passed 声明的兼容分支。

2. evidence 绑定 exact workflow 与 artifact subject

新增同一 materializer 的 record-verification 模式,只接受:

  • repository whyour/qinglong
  • workflow ref whyour/qinglong/.github/workflows/ql3-ci.yml@refs/heads/next
  • workflow_dispatch event 与 local-image job
  • 完整 source/workflow SHA、十进制 run ID/attempt
  • Tier-1 architecture,以及从 Docker inspection 获得的 Application/operator exact image ID。

evidence 的 subject 同时绑定版本、源码、架构和两个不同镜像 ID;九个 gate 保持 exact closed set。bundle create 与 offline audit 都重新匹配 evidence subject 和 manifest,不允许把另一架构、另一镜像或另一 run 的 evidence 复制进来。

GitHub workflow 只能在 Trivy、inventory、SBOM、128 MiB entrypoint、fresh lifecycle、完整 Trial Kit journey 与原生 cancellation 均成功之后记录 evidence;静态审计固定 journey → cancellation → record-verification → create → audit → upload 顺序。

3. workflow provenance 不是公开发布签名

evidence 提供可定位、可交叉检查的 GitHub run identity,不声称调用者无法伪造 JSON。下载者仍需到 GitHub 检查该 run 的 source、attempt 和结论。公开 Release Set 继续使用独立的 immutable digest、Cosign 与 GitHub attestation,不以 Alpha evidence 替代供应链签名。

普通 push/PR 不生成或上传 Alpha artifact;本地构建、push CI 通过或 source-equivalent native gate 只能支持工程候选判断。只有显式 milestone dispatch 产生的 exact-image evidence 才允许 materializer 声称 Local Alpha Trial Kit。

被拒绝的替代方案

保留 manifest 内的固定 passed 字段

拒绝。它把“脚本知道有哪些 gate”错误提升为“这些 gate 已对当前 artifact 执行”。

仅加入 GitHub run URL,不绑定镜像 ID

拒绝。同一源码可以因基础 package、构建平台或配置产生不同镜像;source-level run 不能自动证明另一个本地 archive 的 exact bytes。

在 Alpha 阶段实现第二套签名系统

拒绝。正式 release workflow 已承担签名和 attestation;Alpha 需要的是诚实、可定位的阶段证据,不应复制生产发布 authority。

影响

  • 本地无 evidence 的 archive 不再冒充用户 Alpha,只能按工程候选处理;
  • 手动 milestone artifact 多一个小型 JSON 文件,不增加 Docker archive layer、workspace package、设备常驻 RSS、端口或依赖;
  • 下载者可从 bundle 确定 exact GitHub run/attempt,并验证 evidence 与 image ID/source/architecture 一致;
  • 旧的本地 2620be054239464a v1 bundle 保留为历史工程证据,但不能通过 v2 auditor。

验证

  • 聚焦测试覆盖 v2 七文件正常物化、非 milestone provenance、detached workflow、archive/SBOM/evidence mutation、额外文件和闭合 CLI grammar
  • Local operator workflow audit 要求 GitHub workflow identity contexts、evidence input和严格 gate 顺序;
  • record-verificationcreate 都从 image inspection 绑定两个不同 image IDoffline audit 不调用 Docker或网络;
  • 首个真实可下载 v2 双架构 Trial Kit 仍需维护者授权的 produce_alpha_artifacts=true workflow 生成。