38 KiB
报销状态空隙与财务处理视角:实施计划
2026-09-11 本地联合验收回执(最新,未提交/未部署)
- 代码:付款下一步统一消费服务端进度;只有明确未组批才显示创建入口,已存在批次使用授权深链,无权/未知不猜。报销详情与报销审批工作台统一右栏操作→当前进度→适用的完整历史,手机保留单列和底栏动作;局部重入/聚焦刷新不覆盖编辑态。
- 交接:第二阶段由 09-11-reimbursement-payment-handoffs 独立实现,再按补丁合入本副本;共享两份 QA 脚本保留双方断言。退回修改、待组批、待独立复核、付款/回单处理四类事项从实际业务状态只读投影,不依赖消息送达,不创建持久化 todo。
- 验证:联合证据位于本副本 artifacts/qa-flow/20260911-combined/。unit.log 为 6 文件 135/135;ui.log 为 39/39、退出 0;build.log 含 typecheck/build/PWA 成功。real-db-browser.log 为 PASS_REAL_DB_HTTP、退出 0,真实一次性 PostgreSQL、密码登录/JWT、HTTP、PC/手机验证上传选票、分类编辑、退回重提、三步审批、组批、独立复核、中文 BIFF8、返回原报销的一致性及合成回单登记;四类门户事项随状态出现/消失、重读不写库。
- 自动验证不使用真实员工。OCR 是真实 worker + mock provider;长历史是隔离库合成 fixture;回单与付款登记仅为隔离合成数据,没有银行连接。数据库容器与合成文件已清理。此次没有调用真实腾讯 OCR、查询生产、恢复正式备份或发送消息。
- 质量:process/governance、错误解释 strict、UI strict 与 diff 检查通过;文档 registry errors=0、warnings=1(既有 22 项未注册文档)。主会话已只读检查全部本轮改动;独立 reviewer 未执行,不能抵扣完整候选门禁或公网验收。
- 复盘:原动作仅由 approved 推断未组批,进度另算真实付款事实;原测试停在付款页,没有返回原单检查。结构修复使用同源阶段及单一授权入口,新增跨页返回、刷新、状态/角色反例;门户从只统计已有批次改为明确交接事项。先前 fixture/旧构建失败留在分项日志,不混计最终联合结果。
- 首批启用仍未完成:员工生产就绪、最新备份/回滚点只读核验和配对恢复只完成准备;独立复核、候选提交推送、获批部署及公网受控验收均待执行。错误迁移剩余项、完整发布门禁、六个 view_all 未决口径与其他模块扩围不假报完成。
其他详情页初步盘点与归属
| 页面 | 本次源码事实 | 后续归属与边界 |
|---|---|---|
| 报销详情、报销审批、付款详情 | 本轮已统一当前进度和动作位置,并回归返回原单 | 本 task + 09-08 付款 task,待发布 |
| 非报销通用 WorkflowTaskDetailPage | 操作在右栏,正文是完整处理历史;不等同于已有独立当前进度 | 暂记本 task 扩围清单,具体业务启用时复用对应模块 task;不把正文历史机械搬走 |
| PurchaseRequestsPage 详情 | 正文存在审批记录与归档操作,当前布局尚未按首批规则验收 | 暂记本 task 扩围清单,采购启用再核范围;旧采购布局归档 task 仅追溯,不自动重开 |
这是初步差异清单,不是全系统视觉验收;门户活动动态也不算详情当前进度。先完成首批报销/审批/付款,不为每个页面新增 task。
2026-09-11 综合后续规划(已批准本地实施,生产操作另批)
用户明确批准按本规划连续实施和针对性验证,不重复询问同范围方案。执行副本为既有 integration 工作树,基线 fe025e65,官方 current 已核对为本 task;保留原有发布回执与规划差异,不混入根 checkout 的治理改动。先完成第一阶段,再按阶段归属推进可执行的后续工作;提交、推送、生产查询/写入、恢复和部署不由本次泛化实施授权推导。inline 自检不冒充独立 review。
目标是员工能独立完成首批报销、审批和付款交接,不以 task 清零、按钮上线或登录页正常作为准入。最近核验的生产候选为 fe025e65;今天未重新连接生产,实施/发布前仍要核对实际基线。本节整合最新状态矛盾、布局统一及此前就绪规划,后续按具体阶段归属执行,不把所有技术债都捆成一次发布。
已完成基础,不重复开发
选票自动生成明细和集中分类、退回留痕删除、中文报销制单与下载原因优化、付款详情右栏进度、AP 读取收紧,以及 existing 不运行初始化 seed、迁移预检和数据库生命周期隔离已有发布记录。只对被新改动影响的部分做回归。一次历史最小数据库恢复成功不等于当前候选配对附件及应用恢复已通过;昨晚公网未登录检查不等于已登录生产业务全链验收。
有序执行及任务归属
| 顺序 | 工作与归属 | 结束判据 |
|---|---|---|
| 第一阶段 | 修复报销付款状态矛盾与主线详情布局,复用本 task,付款页面回归关联 09-08-reimbursement-payment-closeout | 已有有效批次时不再引导组批;动作/下一步/进度消费一致事实;PC 操作在右上、当前进度在其下,正文不重复;手机顺序一致且保留底栏动作。报销详情、审批工作台、付款详情的回到原单场景与角色/状态矩阵通过 |
| 并行准备 A | 真实员工业务就绪与职责范围只读盘点,复用 AP/付款既有任务 | 区分能登录、能提交、能审批/复核、能付款;按确认身份核对角色、经理、审批解析、主体及资料存在性,不重复修已回填字段,不读取银行明文。列清真实缺项和维护人,不把 smoke 账号算成真人。需调整授权或回填时另列批准清单 |
| 并行准备 B | 恢复退路,复用 08-23 恢复任务与 08-28 异机备份事件任务 | 先只读核验执行时最新本地/ARM 批次、版本及自然调度结果;获批后在受控隔离目标验证配对 DB/附件恢复、引用与适用摘要及必要应用读取。禁止生产连接、真实通知/支付/OCR外联;只清本轮隔离资源,不增复杂 runner,不删除回滚制品 |
| 第二阶段 | 报销到付款的最小待办交接;复用已有观察证据,到实施前确认一个独立跨模块 task,不按页面拆任务 | 四类首批事项:退回待修改、财务待组批、负责人待付款复核、复核后财务付款处理/登记。工作台数量与明细一致、深链有权、办完消失;无需聊天提醒切换账号,重复投影不生成重复待办。通知失败不丢任务,不把站内消息、IM 入队和真实送达混成一个 PASS |
| 第三阶段 | 首批统一候选联合验收及发布,复用本 task 与付款任务的发布验收 | 各改动独立提交单元/工作树,先完成本地真实后端、合成角色、桌面/手机和跨页面闭环,再冻结统一候选交审。批准后部署并由执行端完成公网专用测试身份的必要受控合成验收,不用管理员代替各角色,不触碰真实单据或执行银行付款 |
| 第四阶段 | 首批正式启用与其他详情页扩围 | 报销/审批/付款满足以下准入后即可开始正常业务,不等待合同/采购等全部功能或历史 task 清零。对其他已有详情页先形成实际差异清单,复用各模块任务按同一位置/信息层级规范整改;全系统统一不等于本轮重写全部页面或给所有业务套一条审批链 |
第一阶段先以失败用例锁定截图中的矛盾,不先花一轮全系统测试重复证明已知缺陷。就绪与恢复先做只读准备,生产资料写入、消息发送、实际恢复、部署和生产合成写入均按窄范围另批。真实付款是财务业务动作,不用一次真实银行付款来证明自动化测试完成。若某项权限或恢复风险阻断,按具体原因停相应启用阶段,不靠缩小验收或默默接受风险前进。
首批员工启用准入
- 核心角色实际授权和必要主数据一致;确认 CEO 审批路由保留、财务不能自审,六个 view_all 的未决口径不默默改动,已确认不适当的数据暴露先处理。
- 上传/OCR、选票建明细、分类编辑、提交、退回修改重提/删除重建、审批、组批、独立复核、中文制单、合成回单登记均有适当层级的执行证据;旧页面刷新/重入不保留失效动作。真实腾讯接口验证与 mock OCR 分列。
- 创建/复核批次后回到报销详情,主按钮、下一步、进度及实际目标一致;未组批、各批次阶段、取消/失败、无权读取和状态未知均覆盖,不靠字符串存在性或截图替代状态断言。
- 四次任务交接可从系统发现和进入;如企业微信是约定入口,须有受控接收端送达与深链证据,无设备/授权时如实保留缺口,不让普通员工承担基础验收。
- 执行时备份完整/新鲜、配对数据与材料有隔离恢复证据,回滚制品仍保留;不把旧镜像存在当作新删除语义可逆。
- 新增候选的部署及公网检查通过,阻断缺陷清零;未覆盖范围逐项列明。首批稳定版本使用不要求全项目所有测试历史债归零,但定向业务验收不冒充完整候选门禁。
同期截止日与后排工作
- 错误解释复用 09-05-error-explainability-payment-readiness:当前候选 673 条豁免指纹仍于 2026-10-05 到期,按 09-11 为 24 天;已有分组与首批分支提案,不重做一份台账。现在确定首批范围,09-18 验证首批迁移,09-25 复审剩余量,09-30 前逐模块裁决延期,10-02 查漏;不统一延长日期,不把豁免数等同产品缺陷数。
- 完整候选门禁复用 09-06-release-gate-integrity 与 09-07-e2e-auth-preconditions:先恢复可信认证前置和验证结果,再评审强制回执与启用。旧 58 条观测不逐条盲修,R1/合同阶段 B 不因本规划自动解冻;正常发布能力未恢复前,每次例外单独批准,不能继承昨晚例外。
- F1 付款侧显式删除过滤仍归本 task 非阻断加固,排在已确认状态矛盾之后;是否随相关付款读取修订实施以范围审查为准,不默改冻结候选。
- 随阶段收尾同步已有 task 的代码、发布、业务验收、等待事项与正确证据位置,尤其各隔离副本的后续回执;不批量归档、不重构大文件、不拆微服务、不为减少任务数合并不相关提交。
本规划已获批准;第一、二阶段本地实施与联合验证完成,两个并行清单已准备。下一步是冻结本地补丁交审,获准后分别提交推送并刷新限定只读前置;不是默认执行生产写入或全系统改造。产品规则与共享规约已同步本次实际实现,生产就绪与恢复结论保持待验证。
2026-09-11 当前新增缺陷与接续点(本地完成,发布待批准)
- 核对用户反馈与
fe025e65源码:已组批/已复核时,右侧 approved 固定组批提示与真实付款进度矛盾;主列进度与付款页右栏布局不一致。未连接生产、未读真实业务响应、未改运行代码。 - 将两项并回本 task 的 PRD/design,不新建修复 task;保留昨晚发布及既有自动验证原结论,但不把它们当作本次跨页面一致性已通过。
- 基于已有发布回执的
fe025e65在隔离副本实施,先跑红已复核批次仍提示组批的用例;保留副本原有 task 回执,不混入根 checkout 的治理改动。 - 统一报销下一步、权限化目标入口和处理阶段;数据未知不猜未组批,取消/失败不放宽重建资格。
- 按既有付款详情样式调整报销/审批工作台侧栏,覆盖手机顺序、长历史、滚动和无重复入口;同步现有产品规则与共享规约。
- 列出已检查的其他详情页位置差异和后续归属;未声称全系统已统一。
- 角色/状态矩阵、真实隔离跨页面流程、双端布局和变更范围内回归通过,完成主会话只读检查。
- 独立 reviewer 复核本次未提交补丁;不继承
fe025e65旧候选审查结论。 - 明确提交/发布候选后另批部署及所需生产合成验收,不让员工承担基础测试、不操作真实付款。
下一步是两笔任务改动的只读复核与提交准备;提交推送、生产核验和部署各按明确边界批准,不从此前 fe025e65 发布授权推导。不要求先清空其他历史任务。
2026-09-10 已授权发布回执(本阶段最新状态)
- 代码:73fcd5a6 与
fe025e65两笔已推送,最终候选 fe025e65cfb521b3b8e758652f96448fefe05051;发布使用独立干净 clone 跟踪 origin/main,provenance 无 override。未移动原主 checkout 或提交其他未完成任务。 - 发布:23:11:59(Asia/Shanghai)第二次正式 deploy-existing 退出 0,生产由
e5685f18更新到 fe025e65;完整通过现有聚合体检、preflight、init、切换、post-preflight、smoke、备份合同 refresh。第一次仅构建依赖下载 ECONNRESET,失败和重试证据分别保留,不记成一次无故障发布。 - 发布后自动只读核验:23:12 运行代码/Prisma 文件 10 项摘要匹配,68 条迁移全部完成且历史 checksum 一致,新删除列/约束/索引有效;无 pending。init 仅 validate_config → migrate → check_required_configuration,existing 无 seed;数据库容器与启动时间不变,远端环境文件摘要不变,腾讯 OCR 配置与 server 内任务执行保持开启,本轮未调用腾讯识别。
- 公网:/ready 200 且版本匹配;HTML 和 12 份入口/相关模块 JS/CSS 与运行镜像逐项匹配;正式公网扫描 106 份资源、buildMarker PASS、findings=0。报销/付款/发票池匿名读取均 401;角色常量矩阵保持经理/CEO 无全量台账、财务/财务主管/管理员可读且审批复核能力保留。这不是生产真人账号的已登录业务动作测试。
- 浏览器补查仅覆盖公网未登录入口:桌面 1440×1000、手机 390×844 登录控件可见且无横向溢出,两份截图已查看,console errors/warnings 均 0。登录页本身不显示 build,版本通过 /ready 与资源摘要证明,不以页面版本标签验收。关闭命令回报 closed,但外层命令退出 143,额外确认本次浏览器进程已退出;不记作整组浏览器命令退出 0,也不替代已有隔离业务测试。截图在主 checkout 的 output/playwright/20260910-release-fe025e65/;最终汇总为 release-summary.json。
- 恢复与容量:e5685f18 独立镜像归档再次校验通过并保留,生产剩余 41.05 GiB,无需本轮清理。发布前最新备份完整性通过、时效 20.60 小时;备份合同已刷新到新版本,但不把旧备份说成新版本同源恢复点。本次未做数据库/附件/应用恢复演练,留痕删除后的兼容回退限制不变。
- 证据:主 checkout 下 artifacts/qa-flow/20260910-release-fe025e65/ 的 deployment-attempt2-result.json、postcheck-result.json、runtime-postcheck.json 及受控 pre/post/构建日志。已核验的本地 296+7 单测、19 页面回归、真实隔离联合流程和用户提供的有限覆盖独立复核继续有效,不冒充本轮重跑或完整候选验收通过。
- 业务与待办:未执行真实单据创建/删除/复核、制单导出或付款,不要求员工代测基础流程。F1 付款侧显式 deleted_at 纵深防御仍留在本 task 的非阻断后续项;此次追加阶段已发布不等于整个历史 task 可归档。任务补记未自动提交、未归档、未删除任何既有生产备份/回滚制品。
本轮发布授权与执行清单
用户明确回复“批准”,本轮批准部署已推送 fe025e65cfb521b3b8e758652f96448fefe05051,执行唯一新增迁移 20260910010000_reimbursement_retained_delete。使用既有 deploy-existing 正式路径、DEPLOY_DATA_MODE=existing、SYNC_ENV=0;不执行初始化 seed、不改真实报销/付款、不清理独立回滚制品。有限覆盖独立复核、未完成完整候选验收及留痕删除后的回退语义限制随本候选保留,不以过去例外替代本次批准。
- 在干净且跟踪 origin/main 的独立发布 clone 核验已推送候选,刷新生产基线、备份完整性/时效、迁移和磁盘;有实质漂移则停止。正式 provenance 要求 upstream,detached worktree 不满足;不启用未发布 override,不移动原 checkout 的 main。
- 走正式聚合体检、迁移 preflight、构建/init/切换、post-preflight 和备份合同 refresh;保留受控日志。
- 自动只读核验公网版本/资源、运行时代码、迁移结构、existing 无 seed 和独立回滚归档仍在;不让真实用户代测、不执行真实业务动作。
- 在既有两项 task 补记实际发布与证据边界,不自动提交说明或归档。
发布执行中补记:第一轮正式聚合体检/来源/preflight 后,build-init 的 npm ci 出现 ECONNRESET,并记录非零构建错误;未进入 run-init。远端构建/发布进程已退出,但本地 SSH 传输未收尾;核对仅属于本轮的 SSH 子进程后终止该连接,发布器最终退出 1。失败构建原始日志已保存到受控 0600 本地文件,不回显网络/路径原文。23:06 再次只读核对生产仍 e5685f18、已应用 67/唯一 pending 不变、备份与 e568 独立镜像摘要通过、41.95 GiB 剩余;没有执行迁移、seed 或应用切换。第二次仍用同一候选与正式门禁,不改锁文件/镜像来源/依赖校验、不绕门禁,日志和 pre/post 证据单独命名保留。
当前运行镜像独立制品固定完成
用户单独批准保存并校验当前 e5685f1 镜像;不包含服务重启、容器切换、旧镜像清理或部署。本轮复用既有 save-image 操作脚本,仅固定当前 build/image 身份并增加项目身份核对,SSH stdin 执行,没有向生产上传脚本或读写业务库。
- 2026-09-10 22:36–22:37(Asia/Shanghai)完成:当前运行版本 e5685f18、镜像 0a3792699576…,保存到部署用户家目录下既有 rollback-artifacts 的唯一新子目录。完整相对定位、归档摘要、大小及模式见 artifacts/qa-flow/20260910-combined/rollback-current-receipt.json。
- docker image save 仅导出镜像;归档 1,119,163,904 字节(约 1.04 GiB)。配置摘要与镜像 ID 匹配,14/14 层 diff_id 匹配,归档 SHA-256 为 b52c259cc84128761e452764e434d8fe3772d649147c124bb378ded4528d5fe8;文件 0600、目录 0700,保存脚本退出 0。
- 新 SSH 连接回读落盘归档、receipt.json 和 image.tar.sha256,大小/摘要再次一致、当前运行版本与镜像仍匹配;rollback-current-readback.json 为 PASS_INDEPENDENT_FILE_READBACK,退出 0。这里“independent”仅指另一连接的文件回读,不代表独立代码 reviewer 或异机副本。
- 保存前后运行容器及启动时间不变,未重启/切换;剩余磁盘约 42.45 GiB。只创建本次新归档目录、image.tar、摘要文件和回执;没有删除既有备份/制品/镜像或修改生产权限。
- 制品独立于 Docker 存储,但仍在生产同一主机;没有 docker load、应用恢复、附件恢复或本次数据库恢复演练。镜像退回不撤销新版本业务写入,首次留痕删除后的回退语义限制保持不变。
当前制品固定前置已补齐;这不是发布批准。下一步将 fe025e65 的迁移、有限覆盖独立复核、完整候选验收缺口、回退方案及部署后自动检查范围交审,实际执行前刷新有时效的生产/备份证据。未部署、未归档、未提交本地说明补记。
推送及限定只读发布预检回执
用户明确批准推送两笔提交及只读发布预检,不包含部署或生产写入。已将 73fcd5a6、fe025e65 推至 origin/main,远端回读为 fe025e65;未移动有既有改动的主 checkout,未提交本地 F1/F2 文档补记。
2026-09-10 22:31–22:32(Asia/Shanghai)重新读取,证据为 artifacts/qa-flow/20260910-combined/production-precheck.json、backup-admin-check.json、precheck-summary.json:
- 生产容器仍运行 e5685f18,检查期间容器及启动时间未变化;备份服务版本合同匹配。未做新镜像构建/应用切换,不凭容器 running 宣称完整业务健康。
- 只读事务核查 _prisma_migrations:已完成 67 条,候选 68 条,唯一待执行 20260910010000_reimbursement_retained_delete;未知/异常/历史校验和不匹配均 0。生产尚无两个删除标记列。未执行 migrate/seed,不额外读取业务表或个人历史。
- 数据库、附件、部署用户回滚目录所在文件系统均约 43.50 GiB 可用、使用率 26.2%。旧 86% / 8.93 GB 不再作为当前依据;本次不清理任何生产文件、镜像或备份。
- 普通部署账户备份读取被拒绝;通过已有配置的管理员 SSH 通道仅只读核验,未改权限/凭据/服务。最新备份北京时间 2026-09-10 02:30:47 完成,核验时 20.02 小时;manifest、数据库包、附件包大小/摘要通过,备份版本及镜像均匹配当前生产 e5685f18。结论 PASS_INTEGRITY_ONLY,本次未恢复演练。
- 已登记独立回滚制品目录有两份其他版本回执,没有与当前 e5685f18/imageId 匹配的制品。不能用旧版本制品替代当前生产回滚点,也不把运行镜像存在当独立制品已固定;其他未登记位置不作不存在断言。
- 身份核验使用既有 bootstrap 的只读 origin/database 模式;限定查询未运行会额外读取合同状态的完整 production-preflight 脚本,不宣称完整发布门禁通过。远端探针由 SSH stdin 执行,没有上传脚本/创建远端文件、生产数据写入或服务重启。
下一步需单独批准持久化保存当前生产 e5685f18 镜像为独立制品并校验(不重启/切容器/删旧镜像),再交审绑定 fe025e65 的发布方案与回退语义;保存制品不等于批准部署。备份接近 24 小时时限,实际发布前需重新核验时效。当前未部署、未归档。
已提交候选的外部只读复核结果
用户回传独立 reviewer 对 fe025e65(树 de050d89)的结论:通过,0 阻断、2 非阻断;manifest 8/8 摘要匹配。结论来源是用户提供的独立审查报告,不是主会话独立复现。两笔本地提交已完成:73fcd5a6(删除)、fe025e65(付款)。本节覆盖下文“未提交/待独立复核”的历史阶段状态。
- 覆盖:重点核查清单 1/3/6(删除授权、旁路排除、回退语义);清单 2 只看事务内锁顺序的相对位置,没有逐条验证同事务性与回滚。
- 未覆盖:清单 4/5(制单/文件名/确认、页面/BIFF8);未跑测试、未审前端 diff、未验证迁移回退、未连生产。本地 296+7 单测、19 页面回归和隔离真实流程仍只是执行端自检,不能因摘要匹配改称 reviewer 重跑通过。
- F1:付款读取未显式过滤 deleted_at,作为非阻断纵深防御待办留在本 task,不另开任务。本轮先不改运行时代码,保留已审 fe025e65;后续若实施需新提交/新候选、针对性付款状态与可见性回归,独立结论只覆盖原 SHA,不自动延伸。
- F1 补充核实:迁移 CHECK 已要求有完整删除标记时 status='cancelled',付款 readiness 拒绝非 approved;当前不只依赖删除入口白名单。仅扩大可删除的原始状态并不必然绕过付款门禁,未来修改持久化状态或 CHECK 时仍须复核付款约束。不可不加判断把用户读取范围构造器套入付款数据加载。
- F2:已补入 design 的发布方案:旧镜像只能还原代码,不能撤销删除标记/审计/票据释放;首次留痕删除后不得仅退镜像并宣称恢复原状。
- 当前代码与候选均未改变;本次只有未提交的任务说明补记,不篡改已冻结 review.md/review-manifest.json。尚未推送、部署或归档;生产版本/迁移/磁盘/备份时点/回滚制品需获得只读授权后重新核验,不复用历史数值。
- 下一步:取得推送及限定只读发布预检的明确授权;部署、新迁移执行及真实业务写入仍另批。独立复核的未覆盖部分须保留在发布审批材料中。
2026-09-10 退回删除接续
提交准备(未提交)
用户要求继续操作;本轮按官方 Phase 3.4 先准备两笔提交,不将泛化的继续操作视为提交/推送/生产授权。当前 inline 无独立 reviewer,主会话只读复查及原自动验证不冒充独立复核。
fix: 退回报销支持留痕删除(09-04-reimbursement-state-gap-finance-view):使用原独立删除包的 27 文件,包含迁移、参与人/状态守卫、历史材料保留、查询过滤、PC/手机入口、测试及对应规约。fix: 优化报销制单下载与付款进度(09-08-reimbursement-payment-closeout):在第一笔树上应用付款体验及集成验收记录;共享 system-action-confirmation.spec.ts、test-invoice-first-http.cjs 按差异追加,不整文件覆盖。包括中文文件名解析及其回归,不重复携带删除运行时代码。
用临时 Git index 构造两笔文件树并比对最终候选,正式 index、HEAD 和分支均不修改;具体文件清单及树摘要见 artifacts/qa-flow/20260910-combined/commit-plan.json。根 checkout 的治理/task 未提交内容全部排除,不自动快进本地 main、不推送、不部署。
发布需重新核对基线、磁盘、备份、独立回滚制品与迁移状态;existing 模式不得执行初始化 seed。本次含删除标记迁移,首次出现留痕删除后旧应用会忽略标记,不能用只回旧镜像作为完整回退方案。最终候选及该回滚限制须随发布方案单独交审,旧权限修复例外不沿用。
合并验收补记:已在独立集成副本按补丁与 09-08 付款体验合并,未覆盖原独立删除副本,原复核包摘要不变。合并后后端 296 项及下载文件名 7 项通过;真实 PostgreSQL/认证/HTTP/桌面/手机联合流程通过并退出 0(含新迁移、退回删除、凭证留存、发票重用、重新提交审批、付款组批/独立复核/中文制单)。合并证据在 artifacts/qa-flow/20260910-combined/real-db-browser.log;OCR 为 mock provider,不是真腾讯新验证,不执行银行付款。独立复核、提交、部署仍未完成。
- 用户要求继续剩余任务,先退回删除、后付款体验;沿既有 task,不新增管理任务。独立副本
artifacts/isolated-worktrees/20260910-rejected-delete基线 e5685f1,官方 current 已对齐,无新分支,未混入其他工作树未提交内容。 - 已核对最新 PRD 追加范围及付款 task 综合方案。现有 DELETE 会级联删除 workflow 历史;draft 本身不是可物理删除的充分条件。当前模型没有专用删除标记,不能只放开 rejected。
- design 顶部补充 deleted_at/deleted_by 最小迁移、审计与材料引用、参与人授权、查询排除、锁顺序及旧应用回滚风险;行业调研后用户确认实施,本轮已编写迁移并仅在一次性合成数据库执行,未运行生产写入。
- 当前实现与历史级联风险核查。
- 用户在行业调研后确认本地实施,生产操作与提交仍另批。
- 实施服务端删除/材料历史/查询边界和双端入口,补充针对性单测及真实隔离场景;没有声称新增测试先在旧代码上完整跑红。
- 完成真实隔离流程、并发/权限反例与前端回归,保留独立副本作为只读复核入口。
- 独立只读复核(当前 inline,仅主会话自审,不冒充独立 reviewer)。
- 通过后再按授权提交发布;付款体验在独立副本与原 task 承接,不一并提交。
实现与证据
- 运行时:仅 draft/rejected + 删除权限 + owner/submitter 可删;拒绝活动流程/待办、非取消付款占用、paid_at、异常关联票据。重复留痕删除先授权,再幂等返回。
- 无流程历史的 draft 原样物理删除;历史 draft/rejected 保留 form/items/workflow/attachments,写 cancelled + deleted_at/deleted_by,并保留票据 PDF 引用/摘要;删除审计与释放同事务。
- 查询:共享报销可读条件、财务台账、原始 SQL 统计、门户计数及项目汇总排除删除标记。详情、材料按既有权限只读,进度不再要求继续处理。
- 并发补口:附件上传落库时重取单锁校验状态;项目关联使用条件 updateMany,防止读到可编辑状态后越过删除继续写入。
- 双端详情/列表允许退回删除,确认不填理由;手机删除位于“更多”,删除成功提示使用“报销单”而非“草稿”。历史详情及打印有删除标识。
- Prisma validate、相关 node --check、前端 typecheck/build 已通过。
- 后端最终 focused:22 文件、279/279,通过记录在 artifacts/qa-flow/20260910-rejected-delete/unit-final.log。运行目录为本副本 server;命令为 PAYMENT_ORDER_PYTHON_BIN=<既有 BIFF8 虚拟环境解释器> npx vitest run tests/unit/routes/reimbursements*.test.js tests/unit/routes/reimbursement.submit-side-effects.test.js tests/unit/routes/paymentBatches.reimbursement.test.js tests/unit/services/reimbursementVisibility.test.js tests/unit/services/financeLedger.test.js tests/unit/routes/exports*.test.js tests/unit/routes/search.test.js tests/unit/routes/portal.test.js tests/unit/routes/projects.test.js。
- 页面回归:本地构建产物 preview,system-action-confirmation.spec.ts --grep '报销',6/6;ui-preview.log。与真实隔离 HTTP/browser 分开计,不把 mock 页面回归当真实服务验收。
- 隔离:RUN_ISOLATED_DB_TEST=1 RUN_RETAINED_DELETE_TEST=1 RUN_BROWSER_TEST=1 node scripts/qa/test-invoice-first-http.cjs;真实 PostgreSQL、密码登录/JWT、HTTP、桌面/手机;合成票据,OCR 为手动调度真实 worker + mock provider。涵盖退回/驳回/撤回→删除→原历史/凭证可读→票据重用→新单提交;删除与 submit/bind/delete 锁屏障;审计异常全事务回滚。
- 增补原始统计/台账排除的最终复跑记录:final-isolated.log,PASS_REAL_DB_HTTP,退出 0;临时容器、合成文件和浏览器已清理。不以之前只输出 PASS 但退出 143 的管道运行替代完整退出结果。
- UI strict/self-test、错误解释 strict、process contract baseline、Trellis governance、git diff --check 通过;文档 registry 为 errors=0、warnings=1(既有 22 项未注册文件),不扩修。
调试与证据边界
- 首轮 BIFF8 回归 1 项失败为系统 python 缺 xlwt,使用既有专用解释器后 76 项付款相关测试通过;未修改付款产品逻辑。
- 隔离 fixture 最初复用了同一文件摘要,被真实重复发票门禁正确拒绝;改为每个场景独立合成 PDF,不通过假摘要/放宽去重绕过测试。
- 一轮新手机“更多”定位与旧构建产物不一致而超时;重建后真实双端通过。原日志留存,不把测试器问题写成业务通过。
- Vite dev 冷启动首项停在登录控件加载,终止该 mock 运行后改用构建产物 preview,6 项重跑通过;没有要求真实用户代测,也没有修改生产登录。
- 本轮保留删除时实际存在的流程、明细和凭证,不回填历史已释放票据、不补造过去提交版本。不可承诺完整重建原本未留存的历史快照。
- 当前状态:代码已实现、本地验证完成;发布未执行;真实业务删除未执行;等待独立复核及提交/部署授权。数据库 nullable 增量不等于旧应用可无损回滚:旧应用可能重新显示删除记录,需前向修复或经过审查的兼容回退。
- 主会话已只读检查任务 diff 的状态/参与人守卫、释放锁顺序、材料授权、查询旁路、迁移和回滚边界;独立 reviewer 尚未执行。复核包 artifacts/qa-flow/20260910-rejected-delete/changes.diff 包含本副本全部任务改动及未跟踪的迁移/测试文件,不含其他副本或生产数据。
下文是原 R1/R2 阶段清单,不能继承其无 migration 前提或勾选为本追加阶段的验收结果。
0. 启动门
- 用户批准本版
prd.md、design.md、implement.md后,才运行task.py start。 - 实施前使用
trellis-before-dev读取 frontend、backend、approval/workflow 和测试规约。 - 保持 inline 模式;不派 implement/check sub-agent。涉及权限和 workflow,编码完成后主会话执行只读 review。
1. R1 独立实现单元:待组批与付款阶段
- 为付款页增加 URL 驱动的
pending/batches/detail视图投影;锁定 manage/review 角色默认视图和直达边界。 - 把现有候选搜索、选择、分页和最小创建表单提升为唯一“待组批”主体,删除旧的重复入口/休眠 DOM。
- 候选标签展示服务端
total;实现加载、错误、空态、搜索、分页和选择后的组建动作。 - 报销详情 approved/no-batch 下一步改为“等待财务组建付款批次”;仅 manage 权限注入带编号搜索的深链。
- 调整报销处理进度组装,加入
payment_batch_created的报销专属“组建付款批次”投影;批次存在后继续完全复用共享付款语义。 - 创建成功刷新候选及批次查询,不做乐观业务状态写入。
- 完成 R1 focused 测试并形成第一个独立提交;不回填最终 task commit,直到整个任务候选提交完成。
R1 重点文件预计包括:
client/src/pages/PaymentBatchesPage.tsxclient/src/pages/ReimbursementDetailPage.tsxclient/src/api/paymentBatches.tsserver/src/routes/reimbursements.jsserver/src/services/paymentProcessingProgress.js(仅在共享阶段接口确需调整时)- 对应 server unit 与 client Playwright specs
2. R2 独立实现单元:草稿读取授权
- 提取“既有角色范围 + 报销业务事实”的服务端条件构建器,表驱动验证 global/team/own 边界。
- 应用于
/reimbursements列表并保证items/total同源。 - 应用于全局搜索、报销 CSV/XLSX 导出、报销统计/看板;原始 SQL 使用等价
EXISTS条件并验证不放大聚合。 - 收紧
ensureOwnCanViewAllOrWorkflowReviewer/ensureOwnOrCanViewAll或合并为等价统一 helper,使详情、附件文件、preview URL、完整材料 preview 和precheck对他人未提交 draft fail closed。 - 审计 helper 的所有调用方,确认写接口不因读取授权重构而放宽;保持 workflow reviewer 和本人路径,并增加审批人读取自己待办报销的负向保护。
- 增加 returned 与 withdrawn/cancelled workflow fixture,证明两类历史 draft 仍可见、可由申请人按既有规则继续处理。
- 完成 R2 focused 测试并形成第二个独立提交。
R2 重点文件预计包括:
server/src/routes/reimbursements.jsserver/src/routes/search.jsserver/src/routes/exports.jsserver/src/routes/dashboard.js- 可复用的报销 scope helper(优先放现有模块,不为单一条件新建过度抽象)
- 对应权限、详情、附件、搜索、导出与统计测试
3. Focused 验证
按实际测试文件补齐精确命令,最低包括:
cd server && node --check src/routes/reimbursements.js
cd server && node --check src/routes/paymentBatches.js
cd server && node --check src/routes/search.js
cd server && node --check src/routes/exports.js
cd server && node --check src/routes/dashboard.js
cd server && npm run prisma:validate
cd server && npx vitest run tests/unit/routes/reimbursements.detail.test.js tests/unit/routes/reimbursements.withdraw.test.js tests/unit/routes/paymentBatches.reimbursement.test.js
cd client && npm run typecheck
cd client && npm run build
node scripts/qa/check-ui-design-rules.mjs --strict
node scripts/qa/check-ui-design-rules.self-test.mjs
node scripts/qa/check-trellis-governance.mjs
git diff --check
还必须新增并执行:
- R1:候选 eligibility、manage/review 权限、视图 URL、搜索/分页/空态、创建后刷新、无批次/有批次三阶段进度矩阵。
- R2:角色 × owner/submitter/team × status × workflow-exists 表驱动矩阵;列表/详情/材料/precheck/搜索/导出/统计旁路一致性;workflow reviewer 待办读取不受误伤。
- 回归:付款批次
draft/reviewed/executed/failed/cancelled、maker-checker、报销退回/撤回/重提、B1/B2 和非报销 workflow 动作投影不变。
4. 只读 Review 门
提交前逐项只读复核:
- 候选资格是否仍只有服务端一处来源,前端没有复制
approved/unpaid/unbatched/gate判断。 - 无 batch 与 batch draft 的阶段是否分别为“待组批”和“待付款复核”,没有同义混用。
- 未提交他人 draft 是否在所有 record-level 旁路 fail closed,而 returned/withdrawn draft 仍按原范围可见。
- R2 是否没有放宽任何写能力、没有改变角色授权、没有引入 schema 或历史数据修正。
- R1/R2 是否可分别 revert 并各自构建、测试,不存在交叉 import 或数据前置。
5. 提交、部署与回滚
- Commit 1:中文提交信息引用
[09-04-reimbursement-state-gap-finance-view][R1]。 - Commit 2:中文提交信息引用
[09-04-reimbursement-state-gap-finance-view][R2]。 - 最终元数据提交把
task.json.commit指向最后一个业务提交;push、部署继续分别获得授权。 - 部署前紧邻执行
git status --porcelain --untracked-files=all、UI strict 和 provenance 核验。 - 部署后检查 PRD AC11;真实创建批次仍由财务执行。
- R1 回滚:revert R1 提交;已创建批次继续按原付款状态机处理。
- R2 回滚:revert R2 提交;不做数据库恢复。若只发现某一旁路遗漏,R2 整体不得宣称完成。