文件
hyb-oa/.trellis/tasks/09-04-reimbursement-state-gap-finance-view/implement.md
T
wangsli 31ab9fbb2b
ci-e2e / e2e (push) Canceled after 0s
ci-minimal / check-minimal (push) Canceled after 0s
fix: 拦截已删除报销进入付款创建(09-04-reimbursement-state-gap-finance-view)
2026-09-12 16:00:25 +08:00

73 KiB
原始文件 Blame 文件历史

报销状态空隙与财务处理视角:实施计划

2026-09-12 F1 付款创建纵深防御(接续已批准后续规划)

复核七处来源读取后,本轮先封住新付款创建入口:候选列表和readiness/锁后创建共用的loadEntitySnapshots显式要求deleted_at为空。不得向所有查询机械添加过滤:既有批次详情、历史收款人兜底和费用明细属于凭证读取,保留现有授权读取。删除仍只允许draft/rejected且无活动批次,不扩展approved删除,不改审批/复核/付款执行状态机。

  • 新回归先失败:构造approved但带删除标记的防御性fixture,候选排除,readiness与锁后创建拒绝且无成功写入/通知;未删除正例和历史批次详情保持。
  • 只修改两处创建来源过滤,付款路由/就绪/制单/编号123项通过,语法和Prisma validate退出0;治理结果另记下文。
  • 主会话只读检查并记录限制;inline无独立review能力,不冒充独立复核。本增量不自动提交、推送、部署;不改变现已发布752ec413。

执行证据:artifacts/qa-layout/f1-red.log(新两项在旧实现失败,其中锁后变化仍创建201,期望404)、f1-tests.log(4文件123/123)、f1-prisma.log。实际命令:server下显式设置PAYMENT_ORDER_PYTHON_BIN为既有BIFF8测试解释器,执行npm test -- tests/unit/routes/paymentBatches.reimbursement.test.js tests/unit/services/paymentBatchReadiness.test.js tests/unit/services/paymentOrderXls.test.js tests/unit/documentSequence.service.test.js;两修改JS文件node --check通过。此处fixture是未来错误状态的防御性验证,不是证明生产存在approved已删除单据。测试使用Fastify注入和Prisma双桩,未执行真实数据库并发或生产请求。

Trellis治理、process-contract baseline、原因码strict及git diff --check均通过;日志为f1-governance.log、f1-process.log、f1-reasons.log。本地复核入口为artifacts/qa-layout/f1-review/README.md;不将“待独立复核”写成阻断产品故障,不让真人承担合成回归。

复核:候选过滤与readiness/锁后创建共用来源读取一致;过滤发生在payee快照构造之前,不解密被排除来源。沿用现有source_not_found/404原因码,无schema、权限、审批或执行状态机变化。七处读取中其余五处未机械过滤,保留历史查询及当前执行不变量;若将来开放已批准/已占用单据删除,必须另审既有批次导出与执行。独立只读review待外部执行,不因主会话自检改成通过。下个发布前置是本增量复核、提交推送授权及新候选部署批准;主线随后接续首批员工准入认证与跨角色验收,生产合成写入仍另批,不重做已完成备注/布局。

2026-09-12 备注自解释增量

发布收口:752ec413已提交推送并部署,existing命令退出0且备份合同刷新通过,前后pending=none。公网ready与106资源扫描通过;数据库未重启、环境文件未变。运行镜像四份生成器/模板相关文件摘要与候选一致,并用合成密钥、合成账号在内存生成BIFF8读回,验证“报销款 ”+完整编号、用途及同人多单分笔;不操作真人业务或真实银行。详见artifacts/qa-layout/purpose-remark-release的execution-result、acceptance-result与generator-acceptance回执。本段是发布后记录,不属于752ec413候选树,不新增一次121单测计数,不冒充独立复核或银行导入验证。

用户批准按“报销款+完整报销编号”修改、测试后部署,随后明确批准六文件提交推送、补齐当前版本本地配对备份和独立镜像;不删除旧制品、不异机传输、不操作真实付款。基于7bfc2546,只改生成器备注列并同步付款合同,不增加姓名、截断或未经银行核实的上限。

  • 新断言先在旧实现失败;修改后单测与真实BIFF8生成/读回及付款路由回归。
  • 复核差异、语法及治理;已获提交推送授权,实际提交与发布结果另记本轮发布回执。
  • 刷新候选/生产版本/迁移/磁盘/备份/独立镜像预检;按用户授权补齐同源本地备份和独立镜像,保留旧制品。
  • existing部署后核公网版本、资源、运行时代码摘要及生成逻辑;不操作真人单据或银行。

执行回执:旧代码15项中3项按预期失败;运行时修改一行后,使用既有BIFF8解释器,在server执行 npm test -- tests/unit/services/paymentOrderXls.test.js tests/unit/documentSequence.service.test.js tests/unit/routes/paymentBatches.reimbursement.test.js tests/unit/services/paymentBatchReadiness.test.js,121/121通过、退出0。生成实际BIFF8并读回,备注为“报销款 ”+完整编号,姓名只在收款人列,同人同账号两单仍独立。语法检查、Trellis治理、process-contract baseline及git diff --check通过;主会话复核确认仅一列映射变化,无权限/审批/迁移变化,不冒充独立review。

证据:artifacts/qa-layout/purpose-remark-red.log、purpose-remark-tests.log、purpose-remark-governance.log、purpose-remark-process.log。部署准备只读回读见purpose-remark-preconditions.json:当时生产7bfc2546,磁盘35.85GiB;最新自动备份完整性通过但对应1eeda7cd,既有回滚目录无当前7bfc2546镜像匹配项。用户随后明确授权补齐当前版本退路并提交推送,不重复索取同一授权;补齐后仍须绑定新候选、刷新正式门禁并保留银行导入/恢复覆盖限制。实际补齐、推送、部署与只读验收状态以artifacts/qa-layout/purpose-remark-release回执为准,不将准备完成写成部署完成。

2026-09-12 整体宽度修正

本地验证后用户明确同意复核并提交这六个文件、准备发布。本轮仅提交该增量,不推送、不部署;下文未提交状态为验证结束时的历史记录,实际提交标识以Git及本地发布准备回执为准。

  • 在旧构建复现1920px正文内缩并让整体边界断言失败。
  • 移除报销共享壳多余限宽;1280/1440/1920px两页整体对齐、320px侧栏、390px溢出与既有交互回归。
  • typecheck/build、定向浏览器与规约检查;仅本地实施,提交/推送/部署另批。

旧构建1920px测试退出1,报销grid与hero左边界差136px;本次不是只凭源码推断。运行时只移除共享壳的mx-auto/w-full/max-w-7xl,付款页、全局容器及业务逻辑未改。frontend-design不可用,按已批方案维护现有布局,无新视觉体系。

在本独立副本client执行npm run build(包含typecheck)退出0;本地preview配合合成mock API,执行 npx playwright test tests/e2e/system-action-confirmation.spec.ts --grep '侧栏等宽|创建批次按钮短文案|票据紧凑展示|制单后返回报销|账号查看图标' --workers=1 --reporter=list,12/12通过、退出0。覆盖1280/1440/1920两页grid左右边界、报销hero对齐、320px侧栏、主按钮/更多,以及390px票据/预览与手机交接。已视觉核看1920报销截图。构建、浏览器、UI strict、Trellis治理、process-contract日志位于artifacts/qa-layout/overall-width-*.log;各检查通过,git diff --check通过。

主会话复核通过,不冒充独立review。共享壳同时被审批适配器引用,其类型构建已验证;本轮未额外执行真实审批业务链或生产测试,截图仅合成数据。无后端/迁移/权限变化,未提交/推送/部署;下一步复核此六文件增量,获授权后提交发布。

2026-09-11 备注精简增量(本地验证完成,已获提交授权)

用户随后明确同意复核、提交这六个文件并准备发布。本轮仅提交这一增量,不推送、不连接生产、不部署;实际提交标识以Git记录及本地发布准备回执为准。下文“未提交”描述的是本地验证结束时的历史阶段,不是提交完成后的状态。

基于已发布98eabdde的干净独立副本实施;不改旧冻结证据包或发布克隆。将备注映射改为entityCode,姓名仍保留在收款户名列并继续必填;付款模板合同同步09-08既有任务。

  • 备注仅完整编号;同人同账号多张单保持多行、各自金额及客户流水号。
  • 回归制单逐列BIFF8读回、长姓名不影响备注、缺失姓名/编号整批拒绝及付款路由/就绪门。
  • 主会话检查diff与治理,记录实际结果;不自动提交/推送/部署,不重跑真实付款。

先改测试,在旧实现15项中3项按预期失败;修改一行运行时后,server下使用既有BIFF8解释器运行 npm test -- tests/unit/services/paymentOrderXls.test.js tests/unit/documentSequence.service.test.js tests/unit/routes/paymentBatches.reimbursement.test.js tests/unit/services/paymentBatchReadiness.test.js,4文件121/121通过,退出0。两处node --check、Trellis治理、process-contract baseline和git diff --check通过。实际生成BIFF8并读回表头/列宽/15列/账号文字类型/用途/备注/金额;无前端变更,未重跑浏览器。

主会话只读复查确认权限、审批、下载审计、编号生成与排序不变;不是独立复核。新版规则已同步09-08 PRD及模板映射设计,不在通用spec重复业务规则。短备注降低长度风险,但仍不宣称已核实银行上限或实际导入通过。当前仅本地完成,未提交、推送或部署;旧98eabdde复核不覆盖本增量。下一步按此六文件差异复核并在明确授权后提交,再准备发布预检。

本轮复核输入与提交准备(未提交)

用户批准整理两笔独立改动的复核/提交方案。基线均为5d8cdf12;01为制单备注5文件,02为UI布局11文件,路径无重叠。仅生成补丁、摘要清单并用临时索引验证顺序合并,不改变实际HEAD/index,不创建commit,不推送或部署。复核入口位于layout副本的artifacts/qa-layout/review-preparation/README.md;临时合并树不是发布候选commit。既有验证按输入不变复用,本轮不新增测试通过计数;UI补跑外层143、网银导入未验证、未独立复核等边界保留。提交前须核对冻结摘要,发布前还需验证合并后的实际候选,不能把单包测试冒充集成验收。

2026-09-11 侧栏与票据展示增量

独立layout副本基于5d8cdf12,官方current核对本task;不混制单备注及其他未提交工作。本轮已授权本地实施,未授权提交/推送/部署。

  • 统一两处侧栏,复用表格展示已关联发票,保留异常/手机/附件能力;同轮更多下拉同行、账号旁查看图标已实施。
  • 添加同屏宽度和票据展示回归,运行typecheck/build与相关浏览器测试。
  • 主会话复核、更新规约和验证记录,明确未发布边界。

本轮本地实施已完成:图标仅替换展示,原employee.bank.read/finance角色、reviewed/failed及paymentAccount条件未改,点击仍需填写原因后才能请求完整账号。布局/菜单不改API、权限规则和状态机;主会话核源码及合成截图,不冒充独立复核或生产验收。

验证回执:

  • client下npm run build(含typecheck)重跑退出0,Vite/PWA完成,116项预缓存;最终源文件再次npm run typecheck退出0。首轮build外层143保留,不计为通过。
  • E2E_BASE_URL指向本地4317,npx playwright test tests/e2e/system-action-confirmation.spec.ts tests/e2e/reimbursement-content-consistency.spec.ts --workers=1 --reporter=list:50项中47通过、3失败。手机失败是boundingBox将44px回传为43.99993896484375;改为百分之一像素精度判断,仍要求44px。另两项为未指定BIFF8运行环境,生成器不可用,不是制单内容失败。
  • 使用既有BIFF8虚拟环境的PAYMENT_ORDER_PYTHON_BIN,仅重跑手机交接和双端制单3项,Playwright报告3 passed。外层会话返回143,不能把整条补跑命令称为退出0;进程检查已无该补跑进程。保留日志和结果,不为刷绿再次重复已通过输入。50项用例已有通过结果,但不是一次50/50退出0的运行。
  • 首轮侧栏4项中3通过,同排几何测量出现8px差值,失败截图未见持续错排;等待字体并按中心线比较后,1280/1440均通过且两页侧栏都实测320px。不将字体竞态猜测冒充已独立证明的原因。
  • 图标键盘打开/取消零完整账号请求;5张长名称/长编号在390/1280/1440均完整且不造成页面横向溢出,预览请求命中正确票据;桌面更多、删除/撤回/打印、手机底栏、上传回单、双端真实BIFF8下载与重复下载边界均有回归通过结果。
  • Trellis治理、process-contract baseline、git diff --check通过。本地证据存artifacts/qa-layout(ignored),含首次失败和补跑记录;不提交合成截图或原始运行输出到业务文档。

未提交、未推送、未部署、未做生产写入;制单备注仍在另一独立副本。本轮不归档整个task。下一步按路径汇总本UI增量与独立备注增量的候选复核输入,经明确授权后再分别提交/推送及准备发布,不覆盖原integration任务历史。

2026-09-11 迟到 401 复核接续(最新,门户取消修正本地通过)

主会话只读核对 dcde0d44 的 33 源文件、3 补丁重放及历史证据后,双端合成浏览器补查甲→乙→甲:甲旧请求迟到 401 后按乙会话重试,结果进入甲缓存,甲再次登录等待新响应时显示乙待办。该包 NO_GO;独立复核仍 PENDING_INLINE,原 6/62/真实隔离通过记录不改写。回执在 postpush-identity/readonly-review.md。

沿原批准门户隔离目标由 09-11 补请求取消,不改全局认证、权限或服务端,不新建任务。双端红测复现后,修正专项 10/10、联合三文件同轮 66/66(包含该 10 项)、新构建/PWA 与真实隔离业务链通过;临时库/合成附件已清理,135 单测按未变输入复用。新证据及修订树另存 postpush-cancellation,不覆盖 dcde0d44/NO_GO 或旧通过记录。

下一步新修订输入独立只读复核,明确授权后提交推送、冻结新 SHA,再刷新执行时预检并另批部署及执行端公网自动验收。主会话自检不抵扣独立 review;迟到 401 为合成 auth/API,未证明全局进行中刷新或其他查询生命周期。未提交、推送、部署或连接生产,不让员工代测。

2026-09-11 门户身份隔离本地闭合(最新,未提交/部署)

用户已确认,由 09-11 原 task 在既有 integration 副本修 PC/手机门户身份缓存;09-04 继续协调联合候选,不新建小任务。运行时相对上一冻结树仅改两页的员工身份 queryKey/无身份禁用门,不改认证、角色、服务端、seed 或付款流程。旧 postpush-recheck 冻结包和只读 P1 回执保留,新修订包在联合目录 postpush-identity,树与摘要以其 manifest.json 为准。

未修构建双端 slow 红测均复现;修后专项 6/6、联合三文件同轮 62/62(含这 6 项)、新构建/PWA 及真实隔离业务链均通过。真实链包含同文档 UI 退出登录、员工→CEO、身份确认及真实门户响应暂缓,零旧待办;临时库与合成附件已清理。首次专项事件夹具和真实链 /me 夹具失败原样保留,具体归因见 09-11 implement。135/135 单测仅按输入未变复用,不报重跑;主会话检查不抵扣独立 review。

下一步:新修订包独立只读复核 → 明确授权提交推送并冻结新 SHA → 执行时刷新生产版本/迁移、磁盘、备份及独立回滚制品 → 候选专属部署批准和执行端公网合成验收。当前不发布 fedcaed1 或旧修订树,不用本地通过抹去完整门禁、全站缓存、实时 OCR、公网身份与应用级恢复缺口。根 checkout 和既有恢复/付款准备文件不混入;未连接生产、未提交推送/部署,员工不代测。

2026-09-11 只读复核新增阻断:跨账号门户缓存(历史:当时待修)

本轮按“执行下一步”核对修订树 68f44e1531719c4d83308cc80494181f0d390803、33 个文件及原证据,未改冻结 manifest/补丁。主会话 inline 检查不是独立 review;源码检查与本地合成浏览器诊断发现 P1:同一浏览器甲退出、乙登录后,在乙的门户请求返回前仍展示甲的业务待办。账号控件已是乙,正确空响应返回后甲的待办才消失。生产未连接,不能据此称已发生线上泄露或服务端越权。

原因是门户 queryKey 不含员工身份、全局 QueryClient 跨登录保留缓存;现有退出只清认证与 PWA Cache Storage,不清 React Query。相关认证/cache 基础实现与生产基线源码一致,但未运行旧版本作历史复现,不能断言本补丁首次引入或此前必无风险。前次 56/56 的独立上下文测试没有覆盖同一文档切账号,不作废其原结果,也不能继续据此放行此候选。

  • 冻结输入摘要核对、主会话源码检查、PC 同文档双合成员工诊断及账号控件确认;未操作真实业务,未派独立 reviewer。
  • 证据和具体修复方案回到 09-11 原待办 task,不新建账号切换/测试小任务;本节是冻结树之外的任务回执。
  • 确认后按 09-11 设计隔离 PC/手机门户查询身份,补同浏览器切账号、慢响应/失败/旧请求晚返回回归;不改角色、真实账号或付款状态机。
  • 修复并验证后重新冻结候选交审;当前不进入提交推送或发布,不重新运行未受影响的整套门禁来掩盖新缺口。

诊断脚本、首次 fixture 前置失败及两次复现记录、覆盖边界见联合目录 postpush-recheck/readonly-review.md。下一步是确认这项身份隔离修复;独立 review、提交推送、执行时预检、部署及公网验收仍单列,不让员工代测。

2026-09-11 遗留附件用例接续(已批准本地核实与验证)

用户采纳“核实遗留附件用例、补验证和复核材料”的下一步,复用本 task,不创建测试子任务,不提交、推送、部署或连接生产。失败快照已显示补充附件文件名和“删除附件”按钮;当前共享材料组件使用 approval-attachments 分组,而旧用例仍依赖 .detail-evidence-card 和“删除”。先修正测试定位并实际执行,不能由快照单独推断删除业务已通过。

  • 核对失败快照、当前共享附件行与请求 mock,定位旧测试选择器和按钮名失效;不修改产品 DOM 或删除权限来迎合测试。
  • 使用既有材料分组和文件名定位正确附件,保留对象/后果/理由、取消和理由不足零请求断言;验证有效理由只向目标附件发送一次 DELETE。
  • 定向复跑后完整重跑原三个页面测试文件;旧失败日志和 postpush 冻结包不覆盖,不以分批去重冒充同轮全部通过。
  • 同步本任务与 09-11 的最新验证状态,准备 postpush-recheck 修订包;未变的运行时/单测/真实隔离输入核对后复用,不宣称重新执行。最终树、补丁及证据摘要以该目录 manifest.json 为准。

独立只读复核仍待完成;本次只处理已知测试缺口,不扩展生产附件搜索、历史数据清理或付款状态机。

实际结果:附件专项 1/1,原 visual-portal / reimbursement-content-consistency / system-action-confirmation 三文件同轮 56/56,均退出 0、零重试。取消、空理由及单字理由零 DELETE,有效理由只请求目标附件一次;mock 请求验证不等于持久化删除或生产验证。根因是共享材料布局变更后旧测试定位未同步,本轮不修改产品删除行为;对应可执行定位/确认合同补入既有前端规约。

运行时及 QA 输入与上一冻结树保持一致,135/135 单测、typecheck/build/PWA、真实隔离认证/HTTP/双端业务链继续复用,不是本轮重跑。原失败和中断证据及 postpush 的 27 份证据/两份补丁摘要核对不变;本轮补丁仅新增测试/规约/回执差异。下节“55 通过/1 未过”是上一冻结时点的历史记录,已由本节结果闭合,但完整项目门禁、独立复核、真实腾讯 OCR 和公网受控业务验收不因此通过。

下一步:修订树独立只读复核 → 明确授权后提交推送并冻结新候选 → 刷新发布前证据 → 另批部署与执行端公网合成验收。仍未提交、推送、连接生产或部署;不让员工承担基础测试。

2026-09-11 提交后复核与首批准入接续(本轮已批准,尚未发布)

当前批准的是本地规划、修复及验证;复用本任务与 09-11 待办任务,不创建新 task,不自动提交、推送、部署或执行生产合成写入。用户同轮追加操作按钮过宽、文字冗长,纳入本任务:创建入口改“创建批次”,桌面付款主入口按内容宽度,其他角色、状态和手机触控边界不变。

  • 完成按钮尺寸与短文案回归,核对点击只是进入既有付款页,不自动创建批次。
  • 修复扩展回归发现的付款 PC 路由窄屏双操作区;原隐藏断言失败证据保留,手机底栏及其动作切换不移除。
  • 联合 09-11 的手机非财务待办查询修正,完成新构建、定向浏览器及真实隔离角色链验证;旧 fedcaed1 不再是无已知缺陷的可部署候选。
  • 核对已推送旧候选及原证据,另存提交后封面和待提交修正包,不覆盖历史冻结输入。
  • 整理首批角色就绪、执行时预检、发布授权范围、公网自动验收与停止条件;未执行项保持未验证。
  • 新修正另经提交推送授权冻结新 SHA,完成独立复核后再申请该候选的发布批准;员工不承担基础测试。

首批角色与资料:已知和待核分开

对象 已有记录可确认 仍需完成,不由旧证据推断
普通员工、财务报销人 两人的直接经理及所属主体已修正回读,不再回填 正常身份认证、本人提交审批解析、本人收款资料及解密可用性;资料由授权维护人直接录系统
CEO 审批/复核人 保留审批路由,单独 CEO 不授 AP 全量读取;既有付款复核业务反馈 新手机待办、公网角色深链与非本人制单复核;不摘角色、不替本人处理真实任务
财务付款人 公司主体/付款账户存在性及已有创建/下载业务反馈 自审拒绝、制单/回单权限、已组批返回原单及待办消失;不把他人的成功付款资料推及所有人
管理员 日常管理权限保留 个人报销不是默认首批需求;如本人需要,再单独核经理/主体/收款资料,不给全部 smoke 回填

发布与执行端公网验收清单(待批准执行)

  1. 绑定新候选 commit/tree/补丁及验证证据;独立只读复核与主会话自检分列。旧 fe025e65/fedcaed1 审查或例外不能自动覆盖本次修正。
  2. 发布前重新只读核对生产 build/image、迁移状态/checksum、磁盘及峰值余量、最新同源 DB/附件备份完整性和时点、当前独立镜像制品。早期 86%/8.93GB 不再引用为当前容量;40.04GiB 也只是前次观测。本轮没有刷新生产。
  3. existing 模式保持不运行初始化 seed;迁移先于必需配置检查,不能宣称失败时零写库。本轮运行时修正不新增迁移、角色、seed 或银行渠道。
  4. 恢复风险如实披露:数据库已恢复成功;配对检查发现一条无当前业务关联的历史附件缺失,用户已选择保留归档并标记、暂不追查;原 NO_GO/应用未验证不改成 PASS。镜像只能恢复代码,不能撤销数据库写入;恢复旧备份可能丢失之后业务。fe025e65 已认识留痕删除,不误写成本次一定要退到不认识删除标记的旧版本;如跨越更早版本仍需单独评估。
  5. 同一份发布方案明确部署、专用测试身份、有限合成单据/发票/审批/批次/回单写入和清理范围,获批后连续验收,避免逐动作打断。只处理隔离标识的合成对象,审计留存,不重放真实员工单据;外部通知/银行连接关闭。真实腾讯 OCR 调用须使用获准票据及受控凭据,只回传结果,不把 mock 当实测。
  6. 顺序为候选版本/ready/bundle → 专用普通员工及财务/CEO 认证 → 双端上传/OCR/选票建明细/分类编辑 → 提交/退回重提/留痕删除重建 → 审批 → 财务组批/本人自审拒绝/CEO 复核 → 中文 BIFF8 制单 → 返回原报销操作与进度一致 → 合成回单登记 → 对应待办消失。生产若没有获准的合成测试渠道,停止该段并保留未验证,不以登录页或 admin 登录抵扣。
  7. 任何版本不一致、权限越界、状态错误、待办漏失、备份/迁移异常均停止对应阶段,保存证据;不自动回填/付款/清备份或凭不确定响应重试写入。回退须根据本次实际写入与已批准方案判断。
  8. 执行端验收通过、剩余例外逐项批准后才开放首批正常业务。真实审批/网银付款仍由职责人办理,不称合成 paid 是银行付款成功。

并行债务排期(不叠入本次冻结代码)

  • 09-06 门禁及已有 09-07 认证任务:先按历史诊断归因恢复可信登录前置与完整验收;不把旧失败数当确定产品缺陷,不默认运行可能部署/访问公网的 all 或 project-wide 入口。
  • 09-05 错误解释:复用现有模块清单,09-18 首批验证、09-25 复审余量、09-30 前逐模块延期说明、10-02 查漏。673 条仍 10-05 到期,不统一续期。
  • 08-23 恢复:完整附件/应用级隔离验证另排期,保留数据库 PASS 与历史缺失原结论;不再扩查旧发票或加复杂 runner。
  • F1 付款读取纵深防御、其他详情页扩围和任务状态收尾仍归已有任务,随相关模块实施,不阻塞本轮本地验收也不冒充已经完成。

扩展检查发现同一付款 spec 两条手机断言相互矛盾:旧“固定操作区”要求桌面卡隐藏,旧“先制单”又要求该卡可见并用于测量进度。按已批合同,后者改为检查实际手机底栏可见/fixed/至少 44px,桌面仍测进度在操作下方;不删除可见性或付款动作断言。完整三文件运行还发现一条本轮未修改的“高敏附件删除”用例找不到旧 .detail-evidence-card 目标;保留失败,不推断生产附件不可删除,也不顺手改附件实现或删断言。作为既有门禁债的具体验证项记录,未通过的完整扩展结果不能冒充全绿。

本轮执行结果与下一步

  • 代码:仅 3 个前端页面运行时变化,本任务按钮/窄屏与 09-11 手机待办同原任务交付,不改通用组件、服务端、角色、schema、seed 或付款状态机。两项定位失败后修复,付款既有断言冲突另行纠正;本轮不提交、推送、连接生产或发送消息。
  • 验证:unit-complete.log 135/135、build-integrated.log typecheck/build/PWA、真实隔离 real-db-browser-final.log 均退出 0;真实密码登录/JWT/HTTP、PC/手机、上传选票/分类/退回重提/审批/组批/独立复核/中文 BIFF8/返回原单/合成回单登记以及两类手机待办冷进入 1→0 通过,临时容器和合成文件已清理。OCR 是真实 worker/mock provider,没有腾讯调用或银行连接。
  • 页面:新角色组合 6 项和按钮 4 项先定向通过;扩展三文件原始 54/56,响应式冲突断言修正后 3/3 复跑,去重 55 项通过、历史附件选择器用例 1 项仍失败。不得写成全量 56/56;该用例本体及共享附件组件与 HEAD 相同,但未做旧候选运行时独立复现,不下“生产无问题”结论。
  • 环境与治理:首轮系统 Python 缺 xlwt 引发导出测试 409,换用既有固定 BIFF8 环境,不改产品兜底;前后端测试均需显式传同一 PAYMENT_ORDER_PYTHON_BIN。143/130 中断及原失败日志保留,以完成回执为准。过程、Trellis、UI strict、原因码 strict、语法及 diff 检查通过;文档 registry 0 errors/1 warning(既有 22 项),不顺手清理。
  • 交审:联合 postpush/review.md、manifest.json、supplement.diff 和 combined-changes.diff 区分原已推送候选与本地修正;原 32 文件/13 份证据及两笔补丁树核对通过。恢复/付款任务的既有未提交补记和根 checkout 改动不纳入修正补丁。
  • 等待事项:独立只读复核、历史附件用例归因(由既有门禁任务接续)、明确提交推送修正授权、冻结新 SHA、执行时预检及本候选部署/公网合成验收授权。旧附件缺失按已确认处置保留;不重复回填、不删回滚制品、不让员工代测,不把阶段完成等同员工已可公网使用。

2026-09-11 当前两项窄授权(已完成,未部署)

用户在明确“保存并校验当前生产镜像,同时仅为财务和 yj 补齐唯一所属主体;不部署、不恢复、不修改银行资料”后回复“是”。本轮允许以下两项,不继承或扩大为管理员/smoke 回填、应用发布、docker load、备份恢复、业务单据操作或提交推送。

  • 刷新目标身份与当前 build/image/容量,使用已审镜像保存流程,只新建本次独立制品目录;配置摘要、全部层、归档摘要与大小通过,另一次 SSH 只读回读一致。
  • 复用 09-08 付款任务执行财务与 yj 的 legal_entity_id 空值→唯一启用主体:只读预检冻结身份,检查员工 UPDATE 触发器/规则,事务锁定、条件恰好两行更新、提交后新连接只读回读;又经单独 SSH READ ONLY 复核一致。
  • 补脱敏回执与实际剩余项;独立复核/ARM 管理员渠道/配对恢复/部署仍待处理。镜像回退不撤销数据库写入;本轮不写真实单据。

执行回执:10:46(Asia/Shanghai)当前 fe025e65 镜像独立保存并回读成功,归档 1,119,357,440 字节(约 1.04 GiB),SHA-256 为 5115ca42ac1c59e9726c8d92447e82080c2816bf9460196f430d04a66b1cf886;配置摘要与运行镜像一致、14/14 层通过,文件 0600/目录 0700,独立于 Docker 存储但仍同机,余量约 40.04 GiB。容器及启动时间未变,不做 load/恢复,不删旧制品。

10:50 先只读核对两人身份/角色/经理/原值、唯一主体及已审 UPDATE 触发器/规则;10:51 Serializable 事务仅条件更新 legal_entity_id 恰好两行,提交后新数据库连接回读一致,10:52 再经独立 SSH READ ONLY 回读。管理员、CEO、smoke、经理、角色、银行资料与单据未纳入写目标;未部署、未提交推送此次文档补记。

证据位于本副本 artifacts/qa-flow/20260911-authorized-preparation/:image-result.json、image-save-receipt.json、image-independent-readback.json、entity-precheck.json、entity-apply.json、entity-readback.json。修正程序 Node 语法检查及 13 项合成正反例通过,涵盖原值/角色/经理/唯一主体漂移、部分更新回滚、触发器变化与不确定提交不重试;合成测试不冒充真实数据库事务测试,实际写入/回读回执另列。

今日备份时点早于本次两字段修正,没有触发新备份;恢复旧备份会回退本次修正及其后业务数据,镜像回退不会撤销它们。当前已补齐镜像制品和两人主体缺项,不代表银行解密、真实提交/付款、DB+附件恢复或独立候选复核通过。下一步仍是独立复核及获得隔离目标/管理员渠道后的配对恢复;部署和公网合成验收另批。

2026-09-11 已授权提交推送与限定只读预检回执(最新,未部署)

用户回复“执行你推荐的这些下一步的工作”,本轮承接两笔提交推送及限定只读预检;不扩为保存镜像、恢复、生产资料回填、消息发送、部署或合成业务写入。inline 主会话复核继续单列,独立 reviewer 未执行,不把用户同意下一步写成独立复核已通过或发布例外获批。

  • 提交:f9aee4c93272204d18408217358d95334cedcd5e(本 task,19 文件);fedcaed1a13cc3b32ee47e1d72c2b5ffa5512c57(09-11 待办,15 文件)。共享两份 QA 脚本按补丁拆分,临时 index 核对第一笔无第二笔投影逻辑、两笔最终树为 476364c76cf476e6af14f0f263599f4d5eced566,与原冻结树完全一致;没有新分支、amend、强推或移动根 checkout 的 main。
  • 推送:origin/main 回读 fedcaed1,待推送 0。32 个最终变更文件及旧验证日志摘要均与未提交冻结包匹配,复用 135/135 单测、39/39 页面、真实隔离数据库/HTTP/双端联合验证,不假称本轮重跑全部测试。提交/推送回执及两笔补丁在本副本 artifacts/qa-flow/20260911-combined/,旧 manifest/changes.diff 未改。
  • 生产预检:09:47–09:52(Asia/Shanghai),运行仍为 fe025e65,容器/启动时间不变;68 条迁移全部完成,pending/未知/异常/checksum 不匹配均 0。本轮候选无新增 migration/schema/seed/角色修改。数据库、附件、回滚目录所在文件系统均约 41.09 GiB 可用、30.3% 使用率,不需要本轮清理。
  • 本地备份:今日 02:30:49 完成,核验时约 7.27 小时;manifest、DB 包、附件包大小/摘要一致,build/image 与当前生产匹配,PASS_INTEGRITY_ONLY。使用既有管理员 SSH 通道只读验真,未改权限;未恢复备份、未导出到开发机。
  • 恢复制品:既有登记目录中 3 份非当前版本回执,没有匹配当前 fe025e65/image 的独立镜像制品;这是登记位置内的结论,不断言其他所有位置均不存在。旧制品保留,本轮没有 docker save/load、清理或重启。
  • 异机:源端正式 last-success 对应今日批次,最后时效检查为 PASS_AUTOMATIC_BACKUP_FRESH、findings=0;ARM dead-man 今日 06:30 服务退出 0、timer active。ARM 普通账号读归档目录被拒,现有 sudo 非交互通道要求密码,未绕权限;今日 ARM 文件摘要/磁盘仍未独立核验,不能用源回执和 timer 成功代替。源摘要 last-run 使用 12 位 VITE_BUILD_SHA、last-success 使用完整 SHA;本轮探针误按全长比较已按正式脚本合同修正,失败记录保留,不认作备份故障。
  • 员工:排除 smoke,仅核对已确认四个登录标识的最小必要字段。CEO 角色保留且无 AP 全量权限;财务/管理员保留原 AP 读取。财务和 yj 的直接经理均为已确认 CEO,且经理启用。四人的门户及付款部门 gate 均开启;腾讯 OCR 配置与 jobs 开启,未调用接口。
  • 就绪缺项:CEO 所属主体、本人建行资料存在性、对应付款账户密文存在性均满足已查前置;财务/yj/管理员仍无所属主体,不能据此说他们自己的报销已具备付款条件。管理员还无直接经理、未关联有效建行机构;若本人也报销需另核修正范围。全公司当前唯一启用主体、1 个有效建行付款账户。这里只检查字段/权限/规则角色存在性,没有实际登录、提交解析或银行解密,不能说已证实全部人能走通,也不宣称已发生业务阻断。

本轮只读证据在本副本 artifacts/qa-flow/20260911-readonly/:production-precheck.json、backup-admin-check.json、employee-readiness.json、gates-transfer-final.json、arm-readonly.json、arm-admin-readonly.json。未读取真实单据金额/票据/银行明文/密码或个人访问历史,未写业务库。

下一步优先独立只读复核已推送候选,并单独批准保存校验当前 fe025e65 独立镜像;财务/yj 的主体回填是一笔独立生产数据授权,管理员是否纳入须按实际本人报销需要裁决,不顺手回填。配对 DB/附件恢复仍需明确隔离目标与管理员执行渠道,实际恢复/部署/公网合成写入另批。不让员工代测、不把历史 DB_RESTORE_PASS 泛化为本候选配对恢复。

以下为历史本地实施回执;本节覆盖其中未提交/未推送状态。本次执行回执是候选之外的文档补记,未自动再提交或归档。

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 清零。对其他已有详情页先形成实际差异清单,复用各模块任务按同一位置/信息层级规范整改;全系统统一不等于本轮重写全部页面或给所有业务套一条审批链

第一阶段先以失败用例锁定截图中的矛盾,不先花一轮全系统测试重复证明已知缺陷。就绪与恢复先做只读准备,生产资料写入、消息发送、实际恢复、部署和生产合成写入均按窄范围另批。真实付款是财务业务动作,不用一次真实银行付款来证明自动化测试完成。若某项权限或恢复风险阻断,按具体原因停相应启用阶段,不靠缩小验收或默默接受风险前进。

首批员工启用准入

  1. 核心角色实际授权和必要主数据一致;确认 CEO 审批路由保留、财务不能自审,六个 view_all 的未决口径不默默改动,已确认不适当的数据暴露先处理。
  2. 上传/OCR、选票建明细、分类编辑、提交、退回修改重提/删除重建、审批、组批、独立复核、中文制单、合成回单登记均有适当层级的执行证据;旧页面刷新/重入不保留失效动作。真实腾讯接口验证与 mock OCR 分列。
  3. 创建/复核批次后回到报销详情,主按钮、下一步、进度及实际目标一致;未组批、各批次阶段、取消/失败、无权读取和状态未知均覆盖,不靠字符串存在性或截图替代状态断言。
  4. 四次任务交接可从系统发现和进入;如企业微信是约定入口,须有受控接收端送达与深链证据,无设备/授权时如实保留缺口,不让普通员工承担基础验收。
  5. 执行时备份完整/新鲜、配对数据与材料有隔离恢复证据,回滚制品仍保留;不把旧镜像存在当作新删除语义可逆。
  6. 新增候选的部署及公网检查通过,阻断缺陷清零;未覆盖范围逐项列明。首批稳定版本使用不要求全项目所有测试历史债归零,但定向业务验收不冒充完整候选门禁。

同期截止日与后排工作

  • 错误解释复用 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,主会话只读复查及原自动验证不冒充独立复核。

  1. fix: 退回报销支持留痕删除(09-04-reimbursement-state-gap-finance-view):使用原独立删除包的 27 文件,包含迁移、参与人/状态守卫、历史材料保留、查询过滤、PC/手机入口、测试及对应规约。
  2. 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 独立实现单元:待组批与付款阶段

  1. 为付款页增加 URL 驱动的 pending/batches/detail 视图投影;锁定 manage/review 角色默认视图和直达边界。
  2. 把现有候选搜索、选择、分页和最小创建表单提升为唯一“待组批”主体,删除旧的重复入口/休眠 DOM。
  3. 候选标签展示服务端 total;实现加载、错误、空态、搜索、分页和选择后的组建动作。
  4. 报销详情 approved/no-batch 下一步改为“等待财务组建付款批次”;仅 manage 权限注入带编号搜索的深链。
  5. 调整报销处理进度组装,加入 payment_batch_created 的报销专属“组建付款批次”投影;批次存在后继续完全复用共享付款语义。
  6. 创建成功刷新候选及批次查询,不做乐观业务状态写入。
  7. 完成 R1 focused 测试并形成第一个独立提交;不回填最终 task commit,直到整个任务候选提交完成。

R1 重点文件预计包括:

  • client/src/pages/PaymentBatchesPage.tsx
  • client/src/pages/ReimbursementDetailPage.tsx
  • client/src/api/paymentBatches.ts
  • server/src/routes/reimbursements.js
  • server/src/services/paymentProcessingProgress.js(仅在共享阶段接口确需调整时)
  • 对应 server unit 与 client Playwright specs

2. R2 独立实现单元:草稿读取授权

  1. 提取“既有角色范围 + 报销业务事实”的服务端条件构建器,表驱动验证 global/team/own 边界。
  2. 应用于 /reimbursements 列表并保证 items/total 同源。
  3. 应用于全局搜索、报销 CSV/XLSX 导出、报销统计/看板;原始 SQL 使用等价 EXISTS 条件并验证不放大聚合。
  4. 收紧 ensureOwnCanViewAllOrWorkflowReviewer / ensureOwnOrCanViewAll 或合并为等价统一 helper,使详情、附件文件、preview URL、完整材料 preview 和 precheck 对他人未提交 draft fail closed。
  5. 审计 helper 的所有调用方,确认写接口不因读取授权重构而放宽;保持 workflow reviewer 和本人路径,并增加审批人读取自己待办报销的负向保护。
  6. 增加 returned 与 withdrawn/cancelled workflow fixture,证明两类历史 draft 仍可见、可由申请人按既有规则继续处理。
  7. 完成 R2 focused 测试并形成第二个独立提交。

R2 重点文件预计包括:

  • server/src/routes/reimbursements.js
  • server/src/routes/search.js
  • server/src/routes/exports.js
  • server/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 门

提交前逐项只读复核:

  1. 候选资格是否仍只有服务端一处来源,前端没有复制 approved/unpaid/unbatched/gate 判断。
  2. 无 batch 与 batch draft 的阶段是否分别为“待组批”和“待付款复核”,没有同义混用。
  3. 未提交他人 draft 是否在所有 record-level 旁路 fail closed,而 returned/withdrawn draft 仍按原范围可见。
  4. R2 是否没有放宽任何写能力、没有改变角色授权、没有引入 schema 或历史数据修正。
  5. 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 整体不得宣称完成。