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

69 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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@v2``create` 新增必需的 `--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 一致;
- 旧的本地 `2620be05``4239464a` 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-verification``create` 都从 image inspection 绑定两个不同 image IDoffline audit 不调用 Docker或网络;
- 首个真实可下载 v2 双架构 Trial Kit 仍需维护者授权的 `produce_alpha_artifacts=true` workflow 生成。