Files
qinglong/docs/adr/ADR-0524-exact-headless-upgrade-cutover-rehearsal.md
T

52 lines
4.9 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-0524Exact Headless 升级切换链演练
- 状态:AcceptedD-426b2b 同源双架构阶段实物已交付)
- 日期:2026-08-30
- 决策:D-426b2b
- 关联:ADR-0520、ADR-0521、ADR-0522、ADR-0523
## 上下文
ADR-0523 已修正 Apply 后 Adopted Target 的回退基线,但仓库内单元测试不能证明用户下载到的 Docker archive 具备完整控制器能力。阶段产物必须从将要上传的 exact bundle 走通 reviewed stage、Owner 认证、apply、真实 Docker legacy stop、target start/stop 和 clean `rollback_candidate`
短生命周期 Operator 此前不含 Docker client,无法在容器内通过受约束的 Docker socket 执行既有 controller。另一方面,Console 镜像入口是 Local API,而 adopted target 证据当前只接受 `local-application-process@v3/v4`;把 Console fresh journey 标记为已验证切换会形成错误承诺。
## 决策
1. Operator runtime 增加固定 Alpine 版本的 `docker-cli`,不包含 daemon、Compose、listener、timer 或常驻进程;现有无网络、只读 rootfs、128 MiB、0.5 CPU、32 PID 边界不变。
2. Trial Kit v8 新增 canonical `upgrade-cutover-rehearsal.sh`,并将其文件摘要绑定到 bundle manifest、offline auditor 与 Local milestone v5。
3. 脚本仅允许 headless Trial Kit,在全新 rehearsal root 和两个专用合成容器上执行:
- exact bundle checksum/load/image identity
- reviewed SQLite 与 data-directory stage/verify/activation
- fresh Owner ceremony、credential presentation、transform/apply/verify
- Docker socket 上的 legacy stop、offline image target start/stop
- Application v4 post-apply baseline 与最终 `rollback_candidate`
4. Legacy root 在 Operator、合成 Legacy 与 target 中均为只读绑定;演练前后主 SQLite SHA-256 必须一致,WAL/journal 不得出现。
5. 成功后写入私有 `cutover-summary.json`,固定 `status=rollback_candidate``legacySource=unchanged``target=stopped`;CI 删除两个已停止合成容器后才可上传产物。
6. Console 继续执行 exact readiness/stage`legacyUpgradeCutover=not_applicable`。在 target evidence 支持 Local API 入口前,不得将其写成 `passed`
## 产物闭包
- `qinglong/alpha-local-trial-kit@v8` / verification v6 / audit v5
- `qinglong/alpha-local-milestone@v5` / audit v5
- Stage Index v2 只接受新的 Local milestone v5
- headless 原生 amd64、arm64 artifact job 必须执行 exact cutover rehearsal;普通源码 CI、模拟 Docker 或单架构结果都不能替代该门。
本 ADR 不授权生产 cutover、真实 2.x 容器停机、Legacy restart/rollback 或数据目录替换。新阶段实物只有在同源双架构 artifact 与 milestone 均由成功终态 workflow 闭合后成立。
## 验证
- back1657 total / 1655 pass / 2 conditional skip / 0 fail
- Local Owner CLI308 total / 301 pass / 7 conditional skip / 0 fail
- Trial Kit、Local milestone、Stage Index 聚焦测试:29/29
- package boundary 保持 18 个 workspace package、无 single/shallow package、零 finding
- Operator image、milestone workflow、Stage Index workflow auditor 均为 compatible。
提交 `79045a0d439074994812d9cd682f933b9e415706` 的显式 Local headless [run 33326143744](https://github.com/whyour/qinglong/actions/runs/33326143744) 已完成 `42 success / 2 expected scope skip / 0 fail`。两个原生架构都从将要上传的 exact Trial Kit 实跑 readiness、reviewed stage、Owner credential presentation、transform/apply、真实 Docker legacy stop、只读 target cutover probe start/stop,并得到 clean `rollback_candidate`;普通 Application 启动命令不能冒充 probe。最终器生成同 run 的 milestone v5,三个 artifact ID 为 amd64 `9736356778`、arm64 `9736354298`、milestone `9736502478`,保留至 2026-09-29。
下载后的 milestone 与两个 Trial Kit 已再次用仓库离线 auditor 审计,三者均返回 `compatible=true`。Docker archive 为 amd64 `226122240` bytes / `sha256:1e1c5c83fd2c39b3bbe7b194113998a96cbe810e69d34858c3f40d2638837c60`arm64 `221521920` bytes / `sha256:dcec37f65382d7d8c06f448780878ec2474e45d6e64b2febb764b1836898d2d6`;两个 verification v6 都把 `legacyUpgradeReadiness``legacyUpgradeStage``legacyUpgradeCutover` 标记为 `passed`。同 run 的跨架构资源证据还在 128 MiB、0.5 CPU、64 PID 的 CI stress envelope 下记录 x64 `77967360` bytes、arm64 `72581120` bytes peak,并明确该数据不是固定物理设备最低配置承诺。
## 后续
D-426b2c 已由 ADR-0525 实现为 Console Local API 外层入口与 Application 内层配置的双重证据,且保持 headless 既有 command/journal shape;同源 exact Console 双架构 artifact 与 milestone 已由成功终态 CI 交付并完成下载后离线审计。D-426c 继续处理 target 写入后的 capture、review、reconciliation 与恢复,不得削弱 headless 已闭合的离线镜像和回退基线。