# 设计:报销详情修复部署与公网验证 ## 当前依赖 部署候选必须包含 Task A 和 `08-28-reimbursement-nonparticipant-readonly-projection`。后者未提交前不冻结 SHA、不运行来源发布、不连接生产。 ## 发布流 ```text 冻结并发布候选 SHA -> 生产身份与 existing 部署合同只读 preflight -> 期望 migration 清单核对 -> deploy-existing.sh(SYNC_ENV=0) -> init + migrate deploy + post migration status -> /ready + runtime/external smoke + bundle marker -> 备份合同 refresh -> 角色化公网检查和材料预览 -> 归档部署子任务与 Task A ``` - 正式入口使用仓库现有 wrapper,不手工 rsync、不 source 或覆盖远端 `.env`。 - 本轮代码不包含新 schema,但 init 和 pre/post migration status 仍是必需证据。 - `pdf-v2` 缓存仅在进程内,应用重启后自然失效,无缓存迁移或清理动作。 - 真实材料检查只记录页数、页序、比例和成功/失败,不保存截图、原件或票面字段。 ## 固定回滚 - 切换前失败:停止,不进入回滚,因为生产应用尚未改变。 - 切换后任一必需门禁失败:停止新版本验证,使用同一 existing 部署入口发布固定提交 `f178aa0`,保持 `SYNC_ENV=0`,不回退或 reset migration。 - 回滚后必须确认 `/ready` 和 bundle marker 为 `f178aa0` 的短 SHA,并复核 migration status、runtime/external smoke、DB/附件挂载与公网入口。 - 回滚来源同样必须干净、已发布且远端可验证;不得以 unpublished override 绕过正式 wrapper。 ## 授权边界 任务规划批准不等于部署批准。推送候选、连接生产、应用切换和合成 owner 撤回写入均需最终部署方案通过后的单独明确授权;真实报销永不作为撤回测试对象。