记录(08-23-isolated-backup-restore-drill): 固化Attempt 5最终门禁

这个提交包含在:
2026-08-25 21:48:51 +08:00
父节点 0b94b97a3a
当前提交 7bfaa92bf1
共修改 2 个文件,包含 38 行新增和 0 行删除
@@ -466,3 +466,32 @@ runner 现在以连续边界依次记录 `batch_copy`、`postgres_container_star
完整本地门禁结果:runner 合同全部 `PASS`;真实 PostgreSQL 16 fixture 和未修改的 `scripts/restore-db.sh` Docker stdin/host-file 双路径继续通过;既有成对备份/恢复演练 `PASS`;自动异机备份合同 `74/74 PASS`;task validate、Trellis governance、process baseline、docs registry、敏感扫描和 `git diff --check` 通过。文档审计错误 `0`,保留既有未登记文件 warning;本地测试容器残留 `0`,`scripts/restore-db.sh` 相对生产构建仍无字节漂移。
Attempt 5 前增强停止线从本节起生效:八阶段计时完成并通过合同后,下一份满足 24 小时门禁的新鲜批次直接进入最终候选渲染、SHA-256 核对、只读探针和实际恢复审批。此后发现的改进项,除非会导致 Attempt 5 失败或产生错误结论,否则只登记为后续任务,不再作为 Attempt 5 前置增强插队。本地合同通过仍只证明演练器合同,不回答最新正式备份是否可恢复。
## Attempt 5 最终候选与执行前只读探针
日期:2026-08-25
本阶段只执行用户批准的三件事:重新选择最新正式批次、从跟踪模板渲染最终候选并核对 SHA-256、运行一次自清理只读身份探针。未复制或解包正式归档、未启动恢复容器、未执行数据库或附件恢复,也未连接腾讯云生产。
| 检查项 | 结果 |
| --- | --- |
| runner 跟踪提交 | `0b94b97` |
| 两次确定性渲染 | 字节一致,完整合同 `PASS` |
| 最终候选 SHA-256 | `7904052aa5a8c31d54734bc2fbf2d9caf2dac8b0116135119519f8467b3dae27` |
| 探针结果 | `PASS` / exit `0` |
| 最新批次构建短标识 | `7b86ffb3`,与当前生产 `SAME` |
| 探针时批次年龄 | `68889` 秒,约 19 小时 08 分,`within_24h=yes` |
| run id 与目录配对 | `PASS` |
| DB/附件大小与 SHA-256 | `PASS` |
| source image digest | 存在 |
| manifest 脱敏摘要前缀 | `ee1f97a5b42d` |
| 来源/当前 migration | `65/65`,差异 `0`,候选指纹匹配 |
| 应用代码/restore-db 字节漂移 | `0/0` |
| 探针 access/entry/staging 残留 | `PASS/0/0` |
| 本地合同容器残留 | `0` |
探针时距 24 小时门禁约剩 `17511` 秒,即约 4 小时 52 分。该余量不被静态批准延长;Attempt 5 runner 在实际开始时仍会动态选择最新正式批次并重新校验构建、run id、产物 SHA-256 和年龄。若执行被推迟到候选超龄且尚无更新批次,runner 必须在复制前失败关闭,不能沿用本节探针结论。
候选钉住的是 `EXPECTED_BUILD_PREFIX` 和 `EXPECTED_MIGRATION_SET_SHA`,不是本次探针批次的 source run id。runner 会在 ARM 上于实际执行时重新选择当时最新正式批次,再对实际批次执行构建前缀、目录/run id、三文件集合、大小、SHA-256、RPO 和恢复后 migration 集合门禁。如果探针后有更新批次原子落地,实际恢复输入可以合法切换到更新批次;最终证据必须记录实际批次的脱敏身份,并明确它与本次探针批次是否一致,不能仅因候选 SHA-256 不变就默认恢复了探针批次。
至此 Attempt 5 的前置批次身份、演练器合同、八阶段 RTO 和失败诊断均已具备;最新正式备份是否实际可恢复仍未得到答案,必须由另行批准的 Attempt 5 隔离恢复给出结论。