diff --git a/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/design.md b/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/design.md index 6e31c5b5..d092c714 100644 --- a/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/design.md +++ b/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/design.md @@ -2,12 +2,16 @@ ## 当前依赖 -部署候选必须包含 Task A 和 `08-28-reimbursement-nonparticipant-readonly-projection`。业务提交为 `e8d6766`,本地部署候选固定为 `8c28e15`;本次候选固化文档提交不纳入部署。在用户另行批准前不推送、不运行来源发布、不连接生产。 +部署候选必须包含 Task A 和 `08-28-reimbursement-nonparticipant-readonly-projection`。业务提交为 `e8d6766`;本次 PRD 修订提交完成后,以最终干净 `HEAD` 冻结候选,在外部审批记录中写死 SHA,此后不得再产生任何仓库变化。用户必须先单独批准推送;upstream 与严格 provenance 验证通过后,再单独批准连接生产和部署。 ## 发布流 ```text -冻结并发布候选 SHA +提交本次 PRD 修订并确认工作区干净 + -> 冻结当前 HEAD,在外部审批记录写死 SHA + -> 用户单独批准 push + -> push + upstream 祖先关系 + 严格 provenance + -> 用户单独批准生产部署 -> 生产身份与 existing 部署合同只读 preflight -> 期望 migration 清单核对 -> deploy-existing.sh(SYNC_ENV=0) @@ -32,4 +36,4 @@ ## 授权边界 -任务规划批准不等于部署批准。推送候选、连接生产、应用切换和合成 owner 撤回写入均需最终部署方案通过后的单独明确授权;真实报销永不作为撤回测试对象。 +任务规划批准不等于推送批准,推送批准也不等于生产部署批准。候选冻结后先取得独立 push 授权并完成 upstream/provenance 验证,再取得独立部署授权;连接生产、应用切换和合成 owner 撤回写入均不得从前一项授权推定。真实报销永不作为撤回测试对象。 diff --git a/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/implement.md b/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/implement.md index 18db244e..61caf4d2 100644 --- a/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/implement.md +++ b/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/implement.md @@ -3,12 +3,14 @@ ## 1. 依赖与候选 - [x] P0 非参与人只读投影修复已实施、只读复核 PASS 并提交为 `e8d6766`。 -- [x] Task A 与 P0 业务修复提交 `e8d6766` 及元数据回填已冻结为本地部署候选 `8c28e15`;本次候选固化文档提交不纳入部署,上游发布与生产影响仍须在推送批准后复核。 -- [ ] 用户已审查最终候选、回滚和公网验证清单,并另行明确批准推送与部署。 +- [ ] 本次 PRD 修订提交完成后确认工作区干净,以最终 `HEAD` 冻结候选,并在外部审批记录写死 SHA;冻结后不得再提交或修改工作区。 +- [ ] 用户已审查最终候选、回滚和公网验证清单,并单独明确批准推送冻结候选。 +- [ ] 推送后确认 upstream 包含候选,严格 provenance 通过且未使用 unpublished override。 +- [ ] 来源验证通过后,用户另行明确批准连接生产和正式部署。 ## 2. 部署前门禁 -- [ ] 工作区干净,候选与 `f178aa0` 均已发布且来源可远端验证。 +- [ ] 工作区干净且 HEAD 等于外部审批记录中的候选;候选与 `f178aa0` 均已发布且来源可远端验证。 - [ ] 生产 identity、部署合同、DB/附件 existing 路径、运行容器和回滚窗口只读 preflight 全部通过。 - [ ] 明确期望 pending migrations;本轮若仍无新增 migration,期望值写为空但不跳过 status。 diff --git a/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/prd.md b/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/prd.md index 9dbd7e60..aec218b3 100644 --- a/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/prd.md +++ b/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/prd.md @@ -7,20 +7,25 @@ ## Current Planning Gate - 原候选 `174cb7a` 只包含撤回投影与 EXIF 尺寸修复,未覆盖已确认的非参与人草稿/驳回维护动作和服务端解绑资格问题,因此不再作为最终部署基线。 -- `08-28-reimbursement-nonparticipant-readonly-projection` 已实施、只读复核并形成业务提交 `e8d6766`;本地部署候选固定为 `8c28e15`,包含该业务提交及元数据回填。候选尚未推送,不能视为已发布候选;后续候选固化文档提交不纳入部署。 -- Requirements、Acceptance Criteria、`design.md` 与 `implement.md` 已写明回滚到 `f178aa0` 的触发条件/动作、迁移 pre/post status、公网角色和材料预览检查;本任务继续保持 `planning`,等待用户审查并另行批准推送/部署。 +- `08-28-reimbursement-nonparticipant-readonly-projection` 已实施、只读复核并形成业务提交 `e8d6766`;部署工具只能以干净工作区的当前 `HEAD` 作为来源,因此旧口径 `8c28e15` 作候选失效。 +- 本次 PRD 修订提交完成后,以当时最终 `HEAD` 冻结候选,并在外部审批记录中写死完整/短 SHA;冻结后到部署收口前不得再产生任何提交(包括文档提交)、untracked 文件或工作区修改。若 HEAD 或工作区变化,原审批失效,必须重新冻结和审查。 +- Requirements、Acceptance Criteria、`design.md` 与 `implement.md` 已写明回滚到 `f178aa0` 的触发条件/动作、迁移 pre/post status、公网角色和材料预览检查;本任务继续保持 `planning`,等待用户先审查候选并单独批准推送,再单独批准生产部署。 - 当前未经批准不得推送、部署、写生产或归档 Task A。 ## Scope -- 在 P0 只读投影修复完成并提交后,冻结包含两轮报销修复的候选 SHA;候选必须进入远端上游并通过来源校验。 +- 在 P0 只读投影修复完成并提交后,以最终干净 `HEAD` 冻结包含两轮报销修复的候选 SHA;候选冻结后禁止任何仓库变化。 +- 推送是独立、显式授权的发布门:取得单独推送批准后,只推送已冻结候选所在分支,再确认 upstream 包含该 SHA 且 provenance 未使用 unpublished override。推送成功不等于批准部署。 - 使用现有 `deploy/trialrun/deploy-existing.sh` 完成生产只读 preflight、existing 模式部署、init、迁移状态复核、运行时 smoke、构建标识和备份合同刷新。 - 部署后核验财务/管理员非参与人只读视图、owner 维护/撤回合同和材料合并预览;不把真实票据内容写入证据。 - 固定回滚基线为 `f178aa0`;部署切换后的任一必需门禁失败时执行同一正式入口回滚应用代码,不回退数据库 migration。 ## Requirements -- 部署前必须显式复核候选提交范围、上游包含关系、生产身份、existing 数据目录、待迁移清单和回滚窗口;来源未发布、工作区不干净或身份不唯一时停止。 +- 候选冻结时必须确认工作区完全干净,以当前分支 `HEAD` 作为唯一候选并记录 SHA;之后任何提交、tracked/untracked 变化或 HEAD 漂移都使候选失效。 +- 推送必须另行获得明确批准。推送后必须确认当前分支有 upstream、候选是 upstream 的祖先,并以默认严格模式通过 `check-source-provenance.mjs`;不得使用 `allowUnpublished` 或接受 `overrideUsed: true`。 +- 只有候选已推送且来源校验通过后,才可请求另一项独立的生产部署批准。部署批准不得从 PRD 审批或推送批准中推定。 +- 部署前必须显式复核候选提交范围、生产身份、existing 数据目录、待迁移清单和回滚窗口;来源未发布、工作区不干净、HEAD 不等于已批准候选或身份不唯一时停止。 - 即使候选没有新增 migration,init 后仍必须显式运行并记录 Prisma migration status;不得因“无 schema 变更”跳过。 - `SYNC_ENV=0`,不覆盖生产环境文件;不 reset 数据库、不覆盖 DB/附件目录、不清理 `pdf-v2` 进程内缓存,应用重启自然失效。 - 公网 `/ready` 和前端 bundle marker 必须等于最终候选短 SHA;迁移、runtime/external smoke、备份合同刷新和角色化检查全部为必需门禁。 @@ -30,9 +35,12 @@ ## Acceptance Criteria -- [x] 非参与人只读投影修复已实施、复核并提交为 `e8d6766`;本地部署候选已固定为 `8c28e15`,但尚未发布。 -- [ ] 完整部署 PRD、设计、实施和回滚清单经用户审查批准。 -- [ ] 最终候选已发布且 `/ready`、bundle marker、迁移状态、runtime/external smoke 和备份合同刷新全部通过。 +- [x] 非参与人只读投影修复已实施、复核并提交为 `e8d6766`。 +- [ ] 本次 PRD 修订提交完成后的最终干净 `HEAD` 已冻结,具体 SHA 已在外部审批记录中写死,且冻结后无任何仓库变化。 +- [ ] 完整部署 PRD、设计、实施和回滚清单经用户审查;用户已单独批准推送冻结候选。 +- [ ] 推送完成,upstream 包含冻结候选,严格 provenance 通过且 `overrideUsed` 不为 true。 +- [ ] 用户在来源校验通过后另行明确批准生产部署。 +- [ ] 最终候选的 `/ready`、bundle marker、迁移状态、runtime/external smoke 和备份合同刷新全部通过。 - [ ] 财务/管理员非参与人无报销人维护动作,owner 既有维护合同正常,材料合并预览可打开且页序和比例正常。 - [ ] 任一必需门禁失败时已按固定动作回滚到 `f178aa0` 并完成回滚后复核,未临场选择其他基线。 - [ ] 公网检查通过后才报告可测试并归档相关任务。 @@ -46,7 +54,8 @@ ## Test Plan -- 部署前:候选范围/上游来源、`check-existing-deployment.sh`、production identity/preflight、期望待迁移清单和回滚窗口。 +- 冻结与推送:干净工作区、当前分支 `HEAD`、外部审批记录中的固定 SHA、独立 push 批准、upstream 祖先关系和严格 provenance(禁止 unpublished override)。 +- 部署前:独立部署批准、候选范围/上游来源、`check-existing-deployment.sh`、production identity/preflight、期望待迁移清单和回滚窗口。 - 部署入口:`deploy-existing.sh` 的 existing 模式、`SYNC_ENV=0`、init、pre/post Prisma status、runtime/external smoke、`/ready`、bundle marker 和合同 refresh。 - 公网角色:财务/管理员非参与人只读、owner 维护/撤回、材料合并预览与原件降级;只保留脱敏结论。 - 回滚演练:从受控干净来源发布 `f178aa0`,复核构建标识、迁移状态、运行 smoke、挂载和公网入口。 diff --git a/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/task.json b/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/task.json index a1fe9d81..8ff0e75a 100644 --- a/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/task.json +++ b/.trellis/tasks/08-28-reimbursement-detail-material-preview-deploy/task.json @@ -21,6 +21,6 @@ "children": [], "parent": "08-28-reimbursement-detail-material-preview-fixes", "relatedFiles": [], - "notes": "本地部署候选固定为 8c28e15,包含 Task A、非参与人只读业务提交 e8d6766 及其元数据回填。候选尚未推送,不能视为已发布候选;本次候选固化文档提交不纳入部署。部署 PRD 仍待用户审查并另行批准推送/部署。", + "notes": "旧候选 8c28e15 因后续文档提交导致 HEAD 漂移而失效。以本次 PRD 修订提交完成后的最终干净 HEAD 冻结新候选,并在外部审批记录中写死 SHA;冻结后禁止任何仓库变化。push 与生产部署是两个独立授权门,当前均未批准。", "meta": {} }