文件
hyb-oa/.trellis/tasks/08-30-reimbursement-expense-policy-invoice-guard-deploy/implement.md
T
wangsli 0f9f40389e
ci-e2e / e2e (push) Canceled after 0s
ci-minimal / check-minimal (push) Canceled after 0s
收紧生产烟测身份治理(08-30-reimbursement-expense-policy-invoice-guard-deploy)
2026-08-30 00:55:08 +08:00

6.3 KiB
原始文件 Blame 文件历史

实施清单:报销费用政策与票据门禁生产部署

1. 规划与冻结

  • PRD、design、implement 经用户审查并明确批准进入实施。
  • 本规划提交完成后确认工作区完全干净,以最终 HEAD 冻结候选;外部审批记录写死完整 SHA 与 12 位 bundle marker。
  • 冻结后无任何提交、修改或 untracked 文件;发生漂移则重新冻结、重新审查。

2. 验收准备(独立生产写入授权)

  • 再次只读确认隔离部门零真人成员,经生产写入批准改名为“系统测试专用(勿分配员工)”,并固定为常驻 smoke 部门。
  • 新建 OA-only manager smoke(manager + employee)与 finance smoke(finance + employee),凭据写入私有 smoke env,不输出、不绑定真人。
  • 把 employee smoke 迁入常驻 smoke 部门,将 manager smoke 设置为其直属 manager;先用合成空壳草稿确认 workflow 可分配,再创建明显标识的合成历史草稿和非真实票据/附件。
  • finance smoke 创建后默认 disabled;验收窗口开始前经单独批准临时启用,窗口结束立即 disabled。不得让持付款能力的 smoke finance 常驻 active。
  • 明确授权材料合并预览产生设计内审计记录;真实材料不落测试报告。

3. Push 与来源门禁

  • 用户单独批准 push;只推送冻结候选所在 main。
  • 确认 origin/main 等于或包含候选,严格 provenance PASS,published=true、remoteVerified=true、overrideUsed=false。
  • push/provenance 不推定部署、配置或业务写入授权。

4. B1 部署前门禁

  • 用户在 provenance 通过后单独批准 B1 部署。
  • check-existing-deployment.sh、生产 identity、existing 数据/附件挂载和备份合同均 PASS。
  • init 前显式记录 Prisma status,pending 只能是 20260829120000_reimbursement_expense_policy_invoice_guard。
  • 保存受影响费用类型 code/name/enabled/description/category/account_code 的脱敏快照;记录 B2 env/DB flag 调用前状态。
  • 部署前记录 B2 flag 是否尚不存在;不得把缺失解释为最终关闭合同。若记录已存在则必须为 force_off;若 env hard gate 已提前获批设为 true,必须证明 effective 仍为 false。

5. B1 正式发布

  • 使用 deploy-existing.sh、existing 模式、SYNC_ENV=0 执行 migration、seed 和应用切换。
  • init 后显式记录 migration status;核对新增列、两项免票、其余启用类型需票、费用类型改名/停用/新建和 account code 保留。
  • 核对 B2 DB flag 记录明确存在、override=force_off、reason 不为 missing_flag_record;缺失立即阻断,不继续 B1 验收。
  • /ready、12 位 bundle marker、runtime/external smoke、服务状态和备份合同 refresh 全部 PASS。
  • B2 effective off;owner 普通维护、assets 批准依据、2,000 元提示、无票补助和非参与人只读投影 PASS。
  • admin/finance/employee 角色化公网验收 PASS;材料合并预览页序/比例正常并只产生获批审计。

6. B2 env hard gate(独立生产配置授权)

  • 保存 env/flag 快照,确认 DB force_off。
  • 将生产 REIMBURSEMENT_INVOICE_GUARD_ENABLED=true 写入受控 env,重启同一候选,不同步其他 env。
  • 验证 env on、DB force_off、effective off 且 reason=flag_force_off;失败则恢复 env 快照并重启。

7. B2 隔离灰度(独立 flag 授权)

  • 灰度前实时读取隔离部门成员,确认恰好只有 employee/manager/finance 三个 smoke、无真人;临时启用 finance smoke 后,用 expectedVersion 把 flag 更新为 force_on + department_allowlist + 隔离部门。受控容器内只读诊断确认隔离部门 reason=flag_force_on_department_allowed、名单外 reason=department_not_allowed,并与详情 DTO invoiceGuardEnabled 交叉核对。
  • 合成验证 owner 普通提交成功。
  • 合成验证两项无票补助不被阻断。
  • 合成验证多票显式关联成功。
  • 合成验证申报金额高于票面时准确阻断。
  • 合成验证旧草稿补齐关联/批准依据后可提交。
  • 合成验证 admin/finance 非参与人无法写入且零业务副作用。
  • 切回 force_off 验证旧提交路径恢复、既有关联不删除不解绑,再恢复灰度快照继续最终判断。
  • 任一失败立即恢复调用前 flag 快照,至少先落 force_off;不操作 4 张真人单据。

8. B2 全局启用(独立授权)

  • 灰度七项全 PASS,成功合成单据已撤回并删除,失败草稿已删除;审计历史保留。
  • 用户单独批准 global enable;用 expectedVersion 更新为 global force_on。
  • 验证全局 effective on、reason=flag_force_on_global、owner 基线、非参与人只读、错误提示、runtime 指标和审计记录。
  • employee/manager/finance smoke 常驻隔离部门,确认成员集合仍只有三个 smoke且无真人;不再执行迁回写入,finance smoke 在窗口结束后立即 disabled。

9. 四张真实单据退回与重提

  • 由真实 finance 退回 0014:说明“5 个发票日期拆成 5 条明细”,重提后人工确认。
  • 由真实 finance 退回 0016:至少按 3 个日期拆分并逐票关联。
  • 由真实 finance 退回 0017:按 2 个日期重做、从发票入口上传正式 PDF、逐票关联并解释 1,949.81 元差额。
  • 由真实 finance 退回 0018:修正日期并逐票关联;同日同类可保留一条。
  • 0008 已付款只留历史关联缺口;0013 空草稿不改。

10. 失败与回滚

  • 切换前失败只停止;切换后失败先 B2 force_off,再用同一 existing 入口回滚固定应用基线 59dc5f6。
  • 不 reset、不逆 migration、不删除关联;主数据问题只凭部署前快照和单独批准做精确补偿。
  • 回滚后复核 build、migration status、runtime/external smoke、DB/附件挂载、备份合同与公网入口。

11. 收口

  • 所有生产证据脱敏回填;不保存凭据、真人信息、真实票据或原始 payload。
  • B1/B2 与四张单据处置全部完成后才通知普通用户测试、归档本部署子任务并更新父 task。
  • B3 一页式继续作为独立后续任务;日期粒度自动门禁仍明确不在本轮。