feat(ql3): rehearse exact local upgrade cutover

This commit is contained in:
whyour
2026-08-30 22:05:04 +08:00
parent 784e77a971
commit 93b45ca62d
16 changed files with 539 additions and 36 deletions
@@ -0,0 +1,49 @@
# ADR-0524Exact Headless 升级切换链演练
- 状态:AcceptedD-426b2b 源码候选;双架构阶段实物待本次 artifact run
- 日期: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。
真实镜像构建、固定 Docker CLI、双架构 exact rehearsal 和新 artifact 摘要将在本提交的 GitHub artifact run 中补充。只有该 run 成功后,才把状态更新为“阶段实物已闭合”。
## 后续
D-426b2c 评估 Console adopted target 的显式双进程/入口证据模型;D-426c 继续处理 target 写入后的 capture、review、reconciliation 与恢复。两者都不得削弱 headless 已闭合的离线镜像和回退基线。
+2
View File
@@ -526,6 +526,8 @@
| [ADR-0520](./ADR-0520-downloadable-local-legacy-upgrade-readiness.md) | 可下载的 Local Legacy 升级就绪盘点 | AcceptedD-425 双架构 Alpha 实物已交付) |
| [ADR-0521](./ADR-0521-reviewed-side-by-side-local-upgrade-stage.md) | 受审核计划驱动的 Local Side-by-side 升级暂存 | AcceptedD-426a 双架构 Alpha 实物已交付) |
| [ADR-0522](./ADR-0522-content-bound-offline-docker-adopted-target.md) | 内容绑定的离线 Docker Adopted Target | AcceptedD-426b 源码候选;阶段实物尚未闭合) |
| [ADR-0523](./ADR-0523-post-apply-adopted-target-baseline.md) | Apply 后的 Adopted Target 启动前基线 | AcceptedD-426b2a 源码候选;阶段实物尚未闭合) |
| [ADR-0524](./ADR-0524-exact-headless-upgrade-cutover-rehearsal.md) | Exact Headless 升级切换链演练 | AcceptedD-426b2b 源码候选;双架构阶段实物待闭合) |
## 规则