文件
hyb-oa/.trellis/tasks/09-08-reimbursement-payment-closeout/implement.md
T
wangsli 842c61e696
ci-e2e / e2e (push) Canceled after 0s
ci-minimal / check-minimal (push) Canceled after 0s
docs: 核对业务交接与后续恢复计划(09-08-reimbursement-payment-closeout)
2026-09-16 12:56:27 +08:00

127 KiB
原始文件 Blame 文件历史

执行顺序(本地技术审查/修复已批准,真实业务动作另批)

R1外部内容结论接回与R2修订

已收到新Claude会话的只读内容审查:有条件通过,F1动态文案退化阻断,F3/F4需登记。本轮按原范围修复F1/F2并以311项定向回归、真实登录JWT+隔离DB+浏览器缺字段修正专项证明;F4转审文案写明10至500字;F5补财务双端href及BX/PB均消失断言,22项浏览器重跑通过。F3共享日期解析及其消费者留待独立批次,无历史数据回填;F6批量错误透传为后续债务,F7防枚举声明仅限邮箱码链,详情见09-05记录。

R1保留,不将R1有条件通过称为R2已独立放行。新R2需完整/增量/两笔拆分重放一致并登记源摘要,再做增量内容复核;当前仍未提交/推送/部署。两笔分组继续产品修复与纯任务记录,三处旧差异排除不动。

2026-09-15 交审与集中操作边界(未提交/推送/部署)

本轮不再追加功能,冻结当前错误治理及六项收口记录到本地交审包error-explainability-review-20260915-r1。拟按两笔路径拆分:09-05产品原因码/日期校验/测试/规约/本任务执行记录;09-08及关联task的纯协调/验收/恢复计划记录。共享文件不重叠,两笔顺序重放须等于完整冻结树。既有09-04-reimbursement-state-gap-finance-view的design/implement与docs/需求-统一审批中心规约.md三处旧差异排除,不覆盖、不提交。

包内必须如实登记:未提交提交对象、未推送、未部署;主会话自检而非独立内容审查;471/27/22与构建为前阶段原日志复用,不新增测试通过计数,日志脱敏后单独摘要;冻结树只证明补丁/源一致,不回溯证明原测试时已冻结。当前规约/治理重验单独登记,不伪造新的业务验收。

集中操作清单:①只读内容复核与两笔提交/推送准备(本地包不自动批准提交);②复核通过后绑定实际新候选重新核生产版本/迁移/磁盘/备份/独立回滚制品,取得该候选发布例外再部署并由执行端验收;③08-23固定历史同源备份恢复单独授权,不与发布合并为默认副作用;④真实通知或额外OCR如确有需要,按接收对象/资料/次数单独批准;自然业务未出现则等待,不重开已付款历史单。旧候选b7d2285d的已消耗授权不覆盖本包。

2026-09-15 第三阶段统一接续(优先于旧“余项未实施”文字)

收口结果:D联合19文件471/471、通知三文件27/27、本轮构建双端浏览器22/22(零重试)通过;typecheck/build/AST/流程治理通过。B四交接本地验收矩阵已回填09-11 task,临时preview已停止。以上均是本地验证,不新增生产验收或独立复核通过计数。

剩余事项分层:本批代码待按路径收口及只读审查,取得明确提交/推送/新候选发布批准后才能上线;C固定历史源配对恢复方案已写入08-23 task,真实源恢复/镜像加载待专项授权,最新自然备份/传输另需新时点只读事实;E自然新回单没有对象不造业务;F来源UNKNOWN保留风险结论、不轮换。A的22行对账是已完成初核,不代表全部历史PRD的验收证据已补齐;其余模块到期治理保留原负责人和期限,不能用当前通过回归宣称全项目所有技术债清零。

D已补齐invoicePool主路由、查验查询以及workflow路由剩余原因码,目标路由遗留清零;全库695→612,仍有其他域和utils/workflow的遗留,不统一延期。发票日期负例同时暴露日期溢出问题,已本地补UTC回读校验,未改历史记录。最终证据归09-05原task;不能将本地修改称为b7d2285d已发布。

B沿已有四交接浏览器用例执行PC/手机重验,不重写已上线投影。通知路由/渠道/dispatcher三文件27/27通过:本地合成证明配置过滤及发送编排,不证明真实企微消息到达。自然新回单和真实通知缺对象/授权时如实等待,不让员工反复代测。

F闭环口径:生产字段加密密钥来源UNKNOWN;仓库中测试生成器/固定合成值不证明生产来源。现有受控单页OCR隔离队列PASS只证明那条运行链可用,不证明生产密钥高熵。不再追问用户,不读取密钥值/历史命令、不自行轮换;未来如需轮换,必须独立制定双密钥解密、存量指纹兼容、恢复与回退方案。身份矩阵沿当前资格重验回归;实际人工例外须在真实来源人与提案人确定后判断,不能提前保证有人可审。

提交/推送/新候选发布、真实配对恢复及消息发送仍是需集中明确授权的操作,不沿用旧授权。所有本地完成项与外部验收等待项最终一起汇总,不按task数量重复实现功能或批量归档。

2026-09-15 连续实施第二阶段(以此补充首批记录)

最终14文件同轮367/367本地回归通过,涵盖登录、付款账户、选票/文件授权、发票查验、审批输入/权限/转审/退回通知/详情、门户与回单独立复核。未重跑公网或生产通知,不把合成回归当真实交接;本轮不要求员工代测。AST及流程治理通过,具体命令见09-05执行记录。

D继续完成auth/me、发票查验错误及七个审批输入parser,连同首批共新增34个注册原因;最终AST legacy695→656,未延长任何到期日。权限、审批状态、付款资格、云端发送及数据库结构均未改。各轮针对性测试通过,最终同输入合并验证另记。实现/具体错误名单/证据归09-05原task,不把第一批“auth/me待做”误读为当前未实现,也不把全部错误治理当作已完成。

下一顺序仍是:完成invoicePool上传/识别与workflow余项的逐操作迁移和验收;核四交接PC/手机证据及通知投递边界;把恢复源/目标/历史附件处置凭据集中成可批准清单。没有真实自然回单不制造业务,来源未知的密钥不猜测、不向用户再次索要,也不自行轮换。缺失历史附件不能仅据“按已确认处置保留”的历史文字就认定已落库治理完成。

整个六项主线未完成,本地提示修复尚未发布。提交、发布、真实配对恢复分别需要明确范围授权;不为上述本地工作反复提问,不沿用已消费的部署/OCR授权。

2026-09-15 统一计划首批实施进度

A:已形成下方22项四栏事实表,区分当前发布包含性与全量验收缺证据,不批量归档或重复部署seed/门户。A仍有历史验收证据关联工作,不能只靠表格标全完成。

B/F:实际运行portal、workflow.return-notifications、paymentReceiptManualReview三文件47/47通过(4/4/39)。这是已有本地逻辑回归,不是PC/手机重测或生产企微投递;本轮未发现要重写的状态/资格逻辑。密钥来源仍未知,用户此前不知道内容/时间/方式,不再向用户索要,亦不以“管理员创建”作证据。

D:付款账户和发票读取的14个具体错误解释已实施,AST legacy695→687,日期未延长;四文件同轮207项通过,客户端typecheck通过。代码与证据细节归09-05-error-explainability-payment-readiness/implement.md。新提示尚未提交或发布,不沿用b7d2285d公网通过宣称已上线。

C:在本执行副本已查任务记录与现有qa证据入口,没有找到能闭合历史缺失附件实际标记/删除决定的记录,因此不能按“测试件”自动剔除。当前仍准备具体隔离恢复范围:优先选最新已核完整的同manifest源,绑定源镜像而非当前任意镜像;恢复前核源时效、容量、隔离身份、禁外联及精确清理范围,生产原记录不改。缺失治理决定与恢复写入须在集中授权清单明确;不新造复杂runner掩盖这个证据缺口。

E:真实单页隔离队列PASS保留,不重复消耗腾讯调用;自然生产新回单仍等正常业务对象。上述等待不阻止D后续auth/me、发票识别与审批错误迁移,但这几域尚未做完,不把第一批当整个统一计划完成。

2026-09-15 A阶段22项对账结果(发布基线b7d2285d)

下表“包含”只指已有代码锚点是发布候选祖先;无登记提交则交叉查Git,不以元数据空值推断未实现。未核全量验收的行明确保留等待,不批量改status或归档。当前代码差异另列D阶段,本表不将未提交提示修复称为上线。

原task 代码事实 发布事实 业务/验收状态 剩余/等谁
08-23-isolated-backup-restore-drill 有现有工具/合同,无task提交锚点 运维工具不以应用发布计完成 历史DB恢复有PASS,配对恢复未证实 执行端准备源/目标并集中申请恢复授权
08-28-production-arm-backup-transfer-incident 有只读调查及传输阶段诊断 旧调查不证明当前异机传输 当前自然批次待重新核验 执行端只读核传输/异机完整性
08-28-reimbursement-detail-material-preview-fixes 46bfa7e包含 包含于当前发布祖先 父task不能按子项计数直接结案 对齐部署子项与只读投影子项
08-28-reimbursement-detail-material-preview-deploy task无提交锚点,不等于未发布 与父实现发布证据交叉核对 planning文字过期与否需按验收判断 补映射而非重复部署
08-28-reimbursement-nonparticipant-readonly-projection e8d6766包含 当前候选包含 原角色隔离验收不能由本次门户4项代替 核原测试/独立审查边界
08-29-reimbursement-expense-policy-invoice-guard 6e999d5包含 当前候选包含并有后续发票优先改动 不回退到旧流程重新实现 按最新合同关联后续验证
08-30-reimbursement-expense-policy-invoice-guard-deploy 无登记commit 与父task代码及部署证据对齐 缺本轮全量证据映射 补发布/业务验收分栏
08-30-reimbursement-assets-prior-approval-correction 36c86f1包含 当前候选包含 本次未测试资产业务 不扩改资产规则,核旧验收
09-01-reimbursement-one-page-approval-workbench 父task,无登记commit 子项有已包含代码 子项完成不等于父体验全部完成 核三子项最终验收
09-01-reimbursement-approval-content-workbench c840574包含 当前候选包含 本次不重做审批详情布局 补原UI证据映射
09-01-reimbursement-form-shared-component-migration 4b974fd包含 当前候选包含 本次未再做组件迁移 以原消费者回归核范围
09-02-reimbursement-readonly-content-consistency e48514d包含 当前候选包含 不能用付款页面验收覆盖只读页面 补只读角色及内容证据
09-04-approval-return-notification-gap 2e69fe4e包含 当前候选包含 本轮退回通知4项单测通过,不是生产投递 核routing及自然/受控投递,生产写入另批
09-04-reimbursement-state-gap-finance-view 后续229867f5等包含 finance-owner-release已有发布/公网回执 当前代码已上线,不再“待部署” 分开历史附件治理及未提交事实记录
09-05-error-explainability-payment-readiness a837912及后续原因码包含;本轮新增代码未提交 旧模块已包含,新一批提示未部署 本轮AST基线PASS,D阶段仍在实施 执行端按操作收口,不统一延期
09-05-existing-deploy-db-lifecycle-isolation f223bfb包含 本次部署证明DB未重启 本次运行证据不是首次初始化全路径测试 合并已存合同测试与发布回执
09-05-trellis-upgrade-rule-cleanup review状态,无登记commit 本地工作流无需公网发布 本轮治理检查PASS不代替原改动审查 核既有规则清理差异,不重装Trellis
09-06-release-gate-integrity 81102c26有提交 当前发布实际执行前后预检PASS 当前pending=none,不伪造故障生产演练 故障断言沿原合成证据对齐
09-07-manager-ap-access-scope 有既有权限修订历史,task未登记commit 不凭任务空字段宣称未上线 本轮未全量审角色/数据范围 查实际提交/矩阵,禁止顺手摘角色
09-08-reimbursement-payment-closeout 8d08d46d/b7d2285d 部署与公网只读验收通过 43项隔离链及单页真实队列PASS 自然生产新回单、密钥来源未知、例外职责按实际对象核
09-09-existing-deploy-seed-separation b87cc55a有提交 当前候选包含且existing发布执行成功 旧“本地未发布”只代表历史时点 不重复拆seed;对齐初始化与配置检查证据
09-11-reimbursement-payment-handoffs fedcaed1及后续身份取消修复包含 当前候选包含 本轮portal4项通过;PC手机历史66项不虚增重跑 身份切换原证据与实际交接验收分列

本轮已消除“22个活跃task=22项未开发”的误导;没有把以上待证据映射项记为全部完成。继续优先能影响当前报销付款业务的B/D/C/F,不为了归档历史大task扩做资产/采购新功能。

2026-09-15 六项统一执行计划(后续工作入口)

用户要求一次规划连续执行,非必要不提问。本表覆盖后续顺序,不覆盖下文已完成发布/测试证据;新产品实现归对应既有task,当前阶段不新建任务、不批量归档。执行端负责软件验收,真实资金决定仍由业务负责。

阶段 归属task 本轮交付及完成条件 等待/批准边界
A 事实对账 本task协调,各原task回填 22项逐个列代码、发布、业务验收、等待项;核候选祖先/实际文件及发布回执,旧文字加日期纠正,不抹历史 不用祖先关系代替全量PRD验收;归档/提交不自动执行
B 待办通知 09-11-reimbursement-payment-handoffs、09-04-approval-return-notification-gap 四交接角色矩阵、计数/入口/完成消失、站内与外部通知边界;补确认缺陷及PC/手机、真实隔离HTTP回归 企微发送/生产routing变更另列一次操作清单;不为测试制造真人退回
C 恢复可靠性 08-23-isolated-backup-restore-drill、08-28-production-arm-backup-transfer-incident;历史附件治理归09-04 核当前自然备份/异机传输、缺失引用处理决定及证据;准备并在获批隔离目标完成DB+附件+应用只读恢复,逐项PASS/NO_GO和清理回执 当前只有备份完整性及既往DB恢复证据;具体真实源/目标恢复另批,未知附件不删,不覆盖生产
D 错误到期治理 09-05-error-explainability-payment-readiness 重跑实际AST盘点,按操作修paymentAccounts、invoicePool、auth/me、workflow高频已启用路径,原因/映射/测试齐全;余项有理由、责任与复验点 不把673条基线当673个故障;不统一续期,不更改未启用模块的业务规则
E 自然回单验收 本task 保留已PASS单页真实隔离队列;新业务自然出现后只读跟踪queued→匹配/异常→登记前资格,记录生产链实际覆盖 等正常业务对象;没有对象不重复OCR、不重新开已付单,不作为其他本地工作阻塞
F 密钥/例外职责 本task,角色范围参考09-07-manager-ap-access-scope 只查非敏感来源/保管/恢复记录;未知有风险结论和后续处理方式;合成矩阵验证独立复核,实际例外按参与人核资格 用户明确不知道密钥内容/生成时间/方式,撤销“管理员创建已确认”的推断;不再追问、不换密钥或扩权

执行清单与里程碑

  • 确认官方指针09-08及当前生产候选b7d2285d,记录现有未提交差异,不跟随过期09-04注入换范围。
  • 扫描22个task元数据及历史commit是否为当前候选祖先;只形成初核,不声称全量对账完成。
  • 重新统计错误基线:673个entries,count合计695,expiresOn均2026-10-05;09-15距到期20天。计数不是当前源码仍命中的AST数量。
  • A逐项对齐验收与证据,优先已上线seed/preflight/AP/门户/付款,剩余页面和通知按实际commit核范围;缺证据项列出具体缺什么。
  • B确认业务路径实际缺口后做最小修复,不重复已上线的门户身份隔离;补站内/企微渠道分层验收。
  • D在09-18前完成首批高频操作迁移和定向验证;09-25复审余项,09-30前准备逐模块延期理由,10-02查漏。日期是检查节点,不声称已完成或自动计划任务。
  • C并行准备真实配对恢复清单,核旧附件治理结果;批准具体源/目标后执行一次简单恢复,不扩演练装置。
  • F先完成来源证据调查和职责合成矩阵;未知留结论,不以无限调查阻塞其他工作。
  • 一次联合检查:后端定向单测/真实隔离DB与HTTP、前端typecheck/build及PC/手机流程、文档与治理;权限/状态机差异要求只读复核,inline受限如实留待审。
  • 汇总需要提交/推送/部署/恢复/生产配置的准确范围及风险,一次呈报;批准后分笔提交、整批发布并由执行端公网验收,不逐按钮征询。
  • E等待自然业务对象时只读观察;最后交付已完成/外部等待/已知风险三栏,不用“全完成”掩盖自然业务或未知来源。

初核发现(不是全量验收)

22个task中12个登记的历史commit为HEAD祖先,10个未登记commit;未登记不等于没提交,登记旧SHA也不等于任务全完成。Git另查到seed=b87cc55a、预检=81102c26、门户交接=fedcaed1及后续身份修复、退回通知=2e69fe4e均有提交。当前发布包含性须结合后续差异核验,不据旧“未提交/未发布”段落重做。

错误基线首批候选计数:paymentAccounts 1;invoicePool主路由30/read7/verification7/shared schemas1;auth路由15+插件1、me2;workflow路由20+utils15。workflowDefinitions11单列配置域,不因名称相近扩入首批。下一实际AST扫描需识别已消除但未清理的基线,不能仅按这些数承诺修改量。

执行中只在范围/风险/验收实质改变、需要真实资金或新增生产敏感写入、无法从仓库确定的业务决策时提问。普通实现取舍、测试工具修正、同范围重验由执行端自主处理;外部等待转做其他已批项。不新建定时任务,不默认提交、归档、清理或使用旧发布授权。

2026-09-15 单页真实回单正式队列隔离验证通过

用户明确授权后,先以合成样本走同一工具。首轮worker已matched但验证工具错误把非唯一attachment_id用于findUnique,导致工具NO_GO;未调用腾讯且完整清理。修为按attachment_id及当前source_version查最新证据后合成PASS。此为工具修复,无产品源码变更,不消耗真实调用预算。

随后真实阶段仅执行一次:PASS_ISOLATED_QUEUE,externalCalls=1、pages=1、attachmentState=matched、claimedVersion=1、queueWorkerMatched=true、evidenceEncrypted=true。沿正式startReceiptPgBossJob→真实pg-boss消费→正式runReceiptOcrTick/recognizePaymentReceipt→腾讯BankSlipOCR→正式匹配/加密落库;原件与冻结付款信息来自此前批准的同一历史单页样本,金额与来源单金额在调用前核相等。normalized和账号/原件只存在主机管道及隔离tmpfs内,不输出普通日志,不保存至本地工作区。

paymentRecorded=false,隔离库claim为0、批次保持reviewed;productionBusinessWrites=false、productionRuntimeUnchanged=true、cleanupComplete=true。一次性数据库/runner容器及独立网络均删除,原件临时存储和加密证据随tmpfs消失。没有改生产executed批次、legacy附件、paid/claim或角色,没有额外调用和自动重试。

证据isolated-queue-synthetic.json与isolated-queue-real.json位于receipt-followup-release目录;运行器queue-isolated.cjs SHA256=d0fdcacbf7fb0bb0a23feaf7c466b3553aa2a9f298f7300fd971b52f3f06d36b,host脚本=fdf9abea5c70a40ac4b9f27f9ff0476be1bb45e6986e2fc45f44ec835689c7de。语法及diff检查通过。此轮未独立复核工具、不新增产品提交或发布。

结论边界:该真实单页逐笔回单的正式队列worker/腾讯/匹配/持久化适配已验证,不再列为纯合成未知。测试采用显式向隔离队列send一次(manuallyEnqueuedIsolatedJob=true),未证明自然cron触发、生产上传链或多笔汇总回单模型;银行验真/到账不在此证据范围。生产未来新回单正常上传后可只读跟踪自然消费,不能为了验收重新上传已付款历史。剩余密钥生成来源需要管理员提供生成方式/受控记录位置(不要密钥正文),实际人工例外复核资格须待具体批次/提案参与人出现后判定,不因当前无批次声称全部通过。

2026-09-15 授权单样本隔离队列验证

用户批准复用此前一份历史已付款回单、腾讯最多一次。实现为生产服务器上的一次性Postgres容器/独立Docker网络/当前候选镜像只读runner,数据库与原件临时存储均tmpfs;不绑定生产存储到runner。先以合成样本验证工具。真实阶段仅在生产容器执行固定原样本选择的只读事务及原件大小/SHA/单页校验,凭据/原件/解密候选仅经主机内存管道传入runner,不输出日志、不转移本地、不复制生产字段密钥;隔离库使用随机新密钥加密证据。

采用正式startReceiptPgBossJob注册真实pg-boss队列,显式向隔离队列send一次任务,由worker自行领取→正式recognizePaymentReceipt/Tencent→匹配及加密落库;不直接调用runReceiptOcrOnce,不调用付款登记。SDK方法加仅一次预算守卫,不替换真实阶段的返回值;单页条件在调用前强制。测试只能证明显式入队后的正式worker链,不冒称自然cron触发或生产上传链。真实尝试开始即留STARTED标记,失败/超时不能自动再发送。finally仅清理本轮容器/网络/tmpfs,另核生产服务身份未变;清理失败须报告,不删除旧制品。

2026-09-15 发布后业务就绪与队列再核

用户要求继续下一步,本轮执行只读元数据查询,无生产业务写入、原件读取或腾讯调用。北京时间16:14核到线上仍b7d2285d、Tencent/pgboss/jobs启用,最近30分钟payment.receipt.ocr任务30条completed,限定日志内tick失败0。有效附件仍两份legacy;reviewed/failed报销批次为空,因而不存在本轮可按真实来源/提案人核定独立复核人的对象。空集合不是“全部资格通过”,completed空转不等于真实回单消费。

密钥字段已配置,但受查现有部署指引/任务记录未提供生产密钥随机生成的来源凭证,不能通过长度、密钥摘要或测试脚本的randomBytes推断生产高熵;未读取密钥值、未查shell历史、未轮换。只读证据business-readiness-current.json与queue-current.json位于本轮release证据目录。

下一受控验证优先在隔离数据库/存储内运行正式pg-boss调度链,使用既有已授权样本的一份原件须重新明确读取/腾讯发送范围,最多一次provider调用;不得将已执行生产批次改回reviewed、重排legacy或伪造真实付款。允许范围未确认前仅准备方案,不实施真实原件重传。若未来实际业务产生新回单,可对正常业务自然消费做只读跟踪,避免额外发送。密钥来源需要管理员提供生成方式或受控记录位置,不发送密钥正文。当前仍未完成这两项事实验收,不新增任务、不将软件回归转交员工。

2026-09-15 b7d2285d发布及公网只读验收通过

授权发布b7d2285d8d1a2a912222917f7c74067f8bd9f810完成,部署命令退出0,build-init/run-init/build-server/build-switch-server均PASS,应用发布及自动备份合同刷新完成。发布前与发布后正式只读迁移预检pending=none。三份既有回单迁移finished=true/rolled_back=false且checksum逐一匹配候选SQL,无本次新增迁移。

公网/ready构建标识匹配、页面可达、bundle扫描105份资源/零finding;递归读取公网JS确认新的系统失败与受控重传文案已发布,匿名付款批次API返回401。运行版本精确等于候选,server/db均运行,db容器身份/启动时间不变,环境文件摘要不变。此为公网只读/资源验收,不伪称真实登录生产业务验收;完整密码JWT浏览器付款链证据仍为隔离合成测试43项。

队列只读回读payment.receipt.ocr已注册,jobsEnabled=true、Tencent provider、Asia/Shanghai每5秒调度,限定日志范围内无receipt tick失败;历史未归档附件仍两份legacy,未重传。本次检查不证明真实回单已消费,未代付、未改业务角色/银行资料或向腾讯新增发送原件。

证据位于artifacts/qa-layout/receipt-followup-release:deploy-fresh-preconditions.json、deploy-result.json、acceptance-result.json、runtime-after.json、queue-after.json。当前版本发布前备份与镜像归档已独立回读,未restore/load演练。可对外称本轮修复已部署且公网只读验收通过,不将项目全部任务、真实回单闭环、合格独立复核人或密钥来源核实标记完成。剩余:在明确原件范围授权下验证新回单真实队列消费及形态,按实际例外参与人确定合格复核人,并核实密钥生成来源;不让员工代测软件基础功能。

本次发布记录为b7d2285d提交后的本地task补记,尚未提交;候选内容未变,不自动创建额外记录提交或归档任务。

2026-09-15 当前版本恢复制品补齐与授权发布

用户明确批准当前线上版本备份和独立镜像归档写入,并承接b7d2285d本轮发布授权。复用已审查备份工具,固定8d08d46d构建与运行镜像、校验三份备份脚本SHA,持有自动备份互斥锁,只新增手工备份、不更新自动成功状态;数据库/存储大小与SHA核对后另连接扫描同源备份独立回读通过,manifest SHA256=56a9addf57556580c46205ae8e68b01a8e23a45ae7757d4cfce9ec9c92660c86。运行容器身份/启动时间未变,未声称恢复演练通过。

独立镜像归档1120237568字节、镜像配置和各层摘要验证通过,并另连接全文件SHA/权限回读PASS_IMAGE_INDEPENDENT_READBACK;同机Docker存储外制品,未docker load、未清理旧制品。证据位于artifacts/qa-layout/receipt-followup-release中create-backup-result/check-current-backups-result/save-image-result/image-readback/runtime-before-switch等JSON。

发布源为远端精确候选b7d2285d的干净克隆;发布脚本重新核验生产仍8d08d46d、手工同源备份24小时内且完整、部署身份归档匹配、剩余空间不少于15GiB、服务身份及环境摘要不变。预期迁移显式为空、SYNC_ENV=0、不开新worker/minio。仅所有条件通过才执行既有生产bootstrap部署;不自动退镜像、代付、发真实回单或改角色。实际发布/公网结果后记,不能将本准备记录称为已部署。

2026-09-15 b7d2285d已推送,发布停在备份与回滚前置

用户确认9路径提交范围,承接已同意的推送/发布顺序且前置不满足不部署。实际提交b7d2285d8d1a2a912222917f7c74067f8bd9f810,普通快进推送main并ls-remote精确回读;排除09-04两文件与统一审批中心文档。未amend、未归档。远端main克隆为独立干净发布源,不用脏工作树部署。

重新只读核验:线上仍为8d08d46d,服务运行且检查期间未重启;存储/数据库卷约30.64 GiB可用、使用率48%,无需清理。最新自动备份完成于2026-09-14T18:30:50Z,数据库/存储大小与SHA通过、manifest匹配,但备份build是229867f5,sourceImageMatches=false;不能视为当前8d08d46d同源恢复点。部署身份下独立回滚制品NO_MATCHING_ARTIFACT,旧版本归档不替代当前版本归档。

正式只读生产预检最终退出0、待迁移为空;首次包装参数误把无迁移写成none导致停止,改为显式空值后重新完整运行通过,不放宽迁移校验。证据目录artifacts/qa-layout/receipt-followup-release含两身份metadata、首次preflight.log和最终preflight-final.log;均无业务写入和部署。预检命令PASS不覆盖备份与回滚缺口,整体发布仍NO_GO。

下一步需补当前线上版本数据库/存储一致备份与独立镜像归档并分别回读完整性,再重核前置后发布;不删除旧制品、不自动回退或重传真实回单。本段为提交后的事实记录,尚未包含在b7d2285d中。

2026-09-15 浏览器同链与恢复指引收口

新增test-payment-receipt-browser.cjs作为既有DB脚本显式RUN_RECEIPT_BROWSER=1模式;要求RUN_ISOLATED_DB_TEST=1及RUN_RECEIPT_REAL_AUTH=1。正式buildApp/auth/me/付款路由、真实本地HTTP与Vite代理,不替换业务API。实际密码登录→上传合成PDF→真实文件读取及worker领取/匹配落库→UI明确登记→同库paid/claim/审计;另测错金额、缺密钥、重复交易不登记及财务退出→复核人登录→财务再登录。创建单据/批次复核预置,OCR provider合成,worker手动调用,不证明腾讯/pg-boss调度/生产全链。

账号切换仅验证正常退出再登录、真实/me身份及无残留对话框,不冒充迟到401竞争或全站缓存隔离。缺密钥浏览器反例是key_failed,不是数据库故障;SQL事务中止的独立失败回写由既有DB测试覆盖。负例浏览器未主动调用隐藏的execute接口,后端拒绝由既有HTTP/DB测试覆盖。首页portal开关未启用的409及服务测试残留不完整来源夹具导致的偶发列表404不计入付款链验收,不静默mock为成功。

前几轮曾发现preview导入形式、refresh Origin配置及来源夹具缺项,均在测试工具修正,未修改生产认证。正常链和三个反例、切账号在同轮43项通过,最终输入再验见后续记录。两套视口系统失败横幅不再引导禁用的详情,权限/状态机/readiness不变;管理员恢复按手册先修前提、另批原件重上传,保留失败历史,无新重排队接口。

只读独立复核发现app dotenv与Vite默认环境文件读取违反隔离合同,已将dotenv固定到本轮0600空文件、拒绝dotenv_config_*参数、删除override环境选项、Vite envFile=false。未据此认定曾读取生产秘密或发生云调用。禁用真实jobs/OCR/外部通知,清理WECOM/TENCENT/SMTP/LIVE_SMOKE环境并在finally恢复;随机口令/token不输出。重跑需先client npm run build,绑定当前dist摘要,不以旧dist证明新源码。

当前不提交推送、不部署、不生产写入。后续真实业务剩余:新回单实际队列消费、合格独立复核人安排、密钥高熵来源、汇总回单形态/存量legacy处理仍不可用合成测试替代;人员职责由业务决定,真实原件外调/重传另批。项目其他存量任务不因本轮局部完成批量归档。

最终源码输入绑定:DB脚本SHA256=cfbae0100e5b312bbd768c60c9604ad7770709230e086d2664d652a1b7040485,browser脚本=7f1fc1c5d264e8cc86e551ca233f45b21a9203c45b8335884119d3c2723a024a,PaymentBatchesPage=f62cbbfecc62df3d2d2ef0fa57b3192c0e34dff1006bb8f16c247ab9a3263786,system-action-confirmation.spec=511ff3d840335d76ba524ac754dbb40a9657d3d377c012c5bcf07976729e2242。client npm run build(含typecheck)通过后,按client/dist递归排序路径与文件SHA逐行拼接所得SHA256=e9b6ac54e53ee6dbd59180fb2c1106441db7b1de7d7ccb0a4c3a3717d08b0b1f;后续浏览器均使用该构建,未再改产品源码。

独立只读复核最终确认dotenv/Vite两条隔离阻断已闭合,无剩余静态阻断,未运行测试;上述覆盖自限保留。首次扩大UI回归23项中21通过、2项制单因未指定既有BIFF8解释器失败;改用既有PAYMENT_ORDER_PYTHON_BIN重新跑同23项,不改产品生成器。治理/process/diff通过;文档registry零错误、保留22项未登记文档的既有告警,不扩修。

最终执行结果(以上源码摘要输入):RUN_ISOLATED_DB_TEST=1 RUN_RECEIPT_REAL_AUTH=1 RUN_RECEIPT_BROWSER=1 node scripts/qa/test-payment-receipt-db.cjs为43/43 PASS;默认RUN_ISOLATED_DB_TEST=1 node scripts/qa/test-payment-receipt-db.cjs为36/36 PASS,两模式不相加为79个不同场景。一次性DB/存储/浏览器清理完成,无生产访问或云调用。client中以既有BIFF8解释器运行E2E_MODE=local E2E_BASE_URL=http://127.0.0.1:4318 playwright test tests/e2e/system-action-confirmation.spec.ts --grep '回单' --workers=1 --reporter=line,23/23 PASS(桌面及390视口);测试preview已停止。

本机证据SHA256:receipt-browser-final.log=30442ae9452f29dcd80331f2952bf721fb3d5b7ea1af53e600f203e5413de2e1;receipt-default-final.log=bde4416ec62e0a56c4feccc66d6e477902896e37bfd2787084ecce5b2905e224;receipt-followup-ui-final.log=0c70c6f033af62814ef1504ff998a71c7ebc5797b60ea30b8a010bac259a13e4;receipt-followup-build.log=2ba7c8d9a3f1cb7a545579e6a143d4e7b7199c9b34ebfecb2c35627c21ef6d14。暂存在/tmp,未形成正式冻结发布包;不能沿用R3宣称新增代码已获发布授权。

下一步:按当前任务路径整理本轮提交范围(排除09-04两文件与统一审批中心文档旧改动),获得明确提交/推送/部署授权后冻结新候选、重新只读核发布前置、部署并由执行端做公网验收。若只批准部分阶段则只做对应阶段;不让员工代跑软件回归。真实复核人/密钥来源/新回单队列验收仍单列,不用本地PASS填平。

2026-09-15 隔离正式认证第一段实施

在现有test-payment-receipt-db.cjs增加RUN_RECEIPT_REAL_AUTH=1显式模式,默认保留原合成actor夹具。新模式注册真实cookie/auth插件及auth路由,不覆盖authenticate或hasPermission;随机合成密码使用正式hashPassword落一次性数据库,通过POST /api/auth/login获得JWT和refresh cookie后用于既有付款业务HTTP链。伪造原synthetic-finance字符串在新模式下401。无生产.env、真实票据、云调用或外部通知;不用预签token绕过登录。

执行RUN_ISOLATED_DB_TEST=1 RUN_RECEIPT_REAL_AUTH=1 node scripts/qa/test-payment-receipt-db.cjs,38项通过、数据库容器清理完成。结果authentication=actual_password_login_and_jwt、browserTested=false;真实密码/鉴权到手工核验/独立复核/付款登记与重放拒绝已在同一数据库验证,使用Fastify inject而非浏览器网络,不称真实JWT浏览器全链。随机密码/JWT未输出。源码语法通过,默认模式另做回归。

当前仅测试工具修改,未改产品源码、未提交推送/部署。剩余实施是可选浏览器模式、真实本地API代理及上传→worker链;本轮通过不能消除浏览器全链缺口,也不改变生产已发布版本8d08d46d。实际入口继续复用本脚本,不扩第三笔产品改动。

默认模式回归36项通过、清理完成;真实认证38项与默认36项是两个模式,不相加成74个不同场景。git diff检查、node语法及Trellis治理通过。两轮安全回执分别为本机/tmp/receipt-real-auth.json和/tmp/receipt-auth-default-regression.json,尚未形成冻结交审包。

2026-09-15 正式认证浏览器全链准备

用户同意下一阶段先做隔离验证准备。官方指针仍为09-08,不因注入09-04换任务。此轮只检查本地测试入口并补当前PRD/执行合同,未访问生产、未新调用OCR、未创建测试数据库或运行产品测试。

已核代码入口:scripts/qa/test-invoice-first-http.cjs已有真实hashPassword、auth插件、auth路由、浏览器及Vite代理;但存在自定义/api/me和辅助API拦截,且ocrProvider默认选择tencent,不原样跑整套脚本冒充本轮无云验证。scripts/qa/test-payment-receipt-db.cjs目前真实DB/Fastify但authenticate是合成actor注入,不能继续称真实JWT链。server/src/app.js导出buildApp并提供startJobs依赖注入,正式auth路由POST /api/auth/login提供密码登录。

准备采用路径:

  1. 在现有回单隔离脚本中添加显式可选浏览器模式,保留默认36项DB/HTTP验收;先搭loopback正式app/auth与随机合成账号,不拷贝生产环境、不启动真实通知/ERP或未授权worker。
  2. 注入外部识别响应仅用于合成样本,复用runReceiptOcrOnce的真实认领/版本/落库流程;不得直接写matched/claim模拟后台完成。是否覆盖pgboss调度另列,手动触发一次worker不算调度端到端。
  3. Vite代理全部业务API到真实本地Fastify,浏览器实际密码登录、上传、等待匹配并确认登记;不拦截业务API、不改/api/me输出伪造权限。明细和批次等前置业务数据允许由合成夹具建立,哪些前置跳过UI明确记录。
  4. 先单笔正常链,再错金额/系统失败/切身份/重复交易反例。只有对应脚本完成并实跑才增加“真实JWT+浏览器+DB同链通过”,否则继续保留缺口。
  5. 清理本轮浏览器、preview/app、DB连接/容器与临时文件,摘要记录exit和cleanup;真实生产单据及历史回单不碰。最终独立复核与提交按既有明确授权边界,不把测试准备当产品再次发布。

下一实际实现入口为现有test-payment-receipt-db.cjs的可选真实认证浏览器模式,不新建Trellis任务,不混做管理员恢复功能。发现必须改产品合同才重新讨论;既定范围内本地测试实现不反复索要确认。

2026-09-15 发布完成与上线验收

授权候选8d08d46d16bad2a571e034a6c02ab20801273be4发布命令退出0,build-init/run-init/build-server/build-switch-server均PASS,应用发布及备份合同刷新完成。部署后正式预检pending=none;三份迁移finished=true/rolled_back=false,数据库记录checksum与候选SQL逐一一致。没有执行初始化seed或业务付款。

公网验收PASS_PUBLIC_READ_ONLY_ACCEPTANCE:ready短SHA与候选一致、首页正常、bundle扫描105份/重点2份/buildMarker PASS/findings0;server及db运行、数据库容器身份与启动时间未变、env文件摘要未变。新增receipt-readiness及manual-verification两个GET接口匿名访问均401;这是权限入口拒绝验证,不是正式JWT业务链。

00:13:29Z首次队列检查:payment.receipt.ocr唯一队列、cron=*/5 * * * * *、时区Asia/Shanghai,pgboss+jobsEnabled+tencent,已见completed任务1条。两份未归档旧回单仍legacy,无queued/processing;最后15分钟最多2000条日志中tick failure/attention均0。不能因completed就宣称真实回单已消费;本轮没有手动enqueue、上传或发送OCR,调度仅正常空轮询。第二次跨调度观察结果另记。

00:15:10Z第二次只读观察完成:completed从1增至3,最新完成00:15:08Z,未见其他job状态;旧回单仍legacy两份,受限日志内tick failure/attention仍0。确认调度持续执行空轮询,不推断配置为五秒就实际每五秒产生任务,不把空轮询计作三份真实回单消费。上线技术验收完成,未让员工操作测试;未发起付款或历史回单重传。下一步不再重复部署,后续只处理真实使用中出现的例外与尚未覆盖项。

证据在artifacts/qa-layout/receipt-release-preconditions:deploy-result.json、public-acceptance.json、runtime-after-deploy.json、migration-acceptance.json、queue-first.json/queue-second.json、anonymous-access.json。R3旧冻结包和独立旧镜像归档保留,验收文档修改未自动提交。

边界继续保留:真实JWT浏览器DB同链、真实新队列消费、多笔/汇总回单形态及密钥高熵来源不因发布成功变成已验证;真实一份逐笔回单仅证明R3匹配器适配该样本。无待登记对象时不伪造真人流程,未来人工例外按实际参与人核独立资格。新门禁写入数据后旧镜像不具语义兼容,不能自动回退。当前验证是授权发布后的技术只读验收,不宣称整个业务任务归档完成。

2026-09-15 8d08d46d部署授权与执行中

用户对明确范围回复“是”:部署8d08d46d,执行本批3份附加迁移、启动回单OCR队列,并由执行端上线检查;不代付、不操作历史已付款单据、不自动重传旧回单,异常停止放行。此授权绑定本候选及已披露回退/验证边界,不引用旧发布例外作为放行依据。

执行前再次确认干净published-main副本及远端main均为8d08d46d;生产仍229867f5,备份未超过24小时且库/附件摘要正确,部署账号当前镜像归档校验通过,余量超过15GiB,runtime/env摘要与归档后状态一致。正式来源/目标/迁移预检通过后进入build-init;existing模式、SYNC_ENV=0,不初始化seed、不重启数据库、不启用额外容器服务。部署脚本完成和上线验收分开记录,不在执行中宣称上线成功。

执行证据入口artifacts/qa-layout/receipt-release-preconditions/deploy-fresh-preconditions.json、deploy-result.json(仅执行结束形成)。部署输出只保留白名单阶段事件和整体摘要,不落原始敏感输出。若返回失败先回读实际版本与迁移,不自动重跑有副作用阶段或退旧镜像。

2026-09-15 当前线上版本独立镜像归档完成

用户明确批准仅创建当前线上镜像独立归档并回读。复用既有save-image/read-image操作,限定build 229867f5fd4223d6efadb543a134696f65095763及image sha256:a4824e86baf34271eb32164b0eec1c1ec56f80924f743638eabbd0c7b94b615c,按当前余量检查后写部署账号标准目录的新唯一子目录;旧归档不删、不覆盖。

2026-09-14T23:49:05Z(北京时间09-15)创建完成:archiveBytes=1119437824,SHA256 e1dc2bf3ac8933bb21013bf39708b9ef7eb560967360b646ffa6a73526b38668。归档config摘要对应预期image,14/14层摘要匹配;目录0700、文件0600,归档独立于Docker存储,但仍是同机副本,不是异机灾备。

另起SSH连接从磁盘完整回读,于23:49:35Z返回PASS_IMAGE_INDEPENDENT_READBACK,大小/SHA/权限再次通过;未docker load、未恢复演练。归档前后容器身份/启动时间不变,后置server与db均运行,server仍229867f5,未切换镜像、未部署或执行迁移。写后可用33882103808字节(约31.6GiB)。

证据:artifacts/qa-layout/receipt-release-preconditions/rollback-created.json、rollback-readback.json、runtime-after-archive.json。原先当前版本独立归档缺口已闭合;不等于附加回单证据产生后可随意退旧代码。既有未覆盖项和发布风险边界不取消,部署仍需针对8d08d46d另行批准;正式执行前重核生产/备份时效,不沿用旧授权。

2026-09-15 推送与发布只读预检

用户明确批准推送8d08d46d16bad2a571e034a6c02ab20801273be4并做发布前预检。远端main原为229867f5,祖先核验后普通快进push成功,ls-remote确认精确目标SHA;未force、未部署。

只读生产元数据观察2026-09-14T23:42–23:43Z(北京时间09-15早间):生产仍229867f5、容器运行且检查期间未变;数据库/存储/备份文件系统可用32.6GiB、使用率44.7%。最近备份完成2026-09-14T18:30:50Z,约5.2小时,同生产build/image,manifest及数据库/附件大小SHA均匹配;本轮未恢复测试。部署账号不能读取备份,root视角完成验证。

独立回滚制品:root标准目录ACCESS_UNAVAILABLE,部署账号标准目录NO_MATCHING_ARTIFACT,已有其他旧版本归档,不存在当前build/image匹配记录。结论限定已检查的既有约定目录,不宣称整机任何位置绝无制品;不能用运行镜像缓存或旧版本包替代独立当前版本回滚保障。未创建归档、未清理空间或旧制品。

正式预检初次在detached干净副本因upstream_missing停在来源校验,未进迁移检查;未绕过校验。改为克隆远端现有main并核HEAD精确等于已推送SHA后重跑,13项聚合检查全通过,来源/目标/DB身份通过,待迁移精确为本批三份,rollbackWindow=OPEN、terminatedRows=0,退出0且明确未进入deploy.sh。此脚本的回滚窗口状态不等于本批附加门禁已能安全退镜像,也不替代独立归档。

证据在artifacts/qa-layout/receipt-release-preconditions:root-metadata.json、deploy-user-metadata.json、preflight.log(初次失败)、preflight-published.log(最终通过)。检查副本保留用于可追溯发布准备,不擅自删旧副本。

当前结论:推送完成,正式只读身份/迁移预检通过;完整发布仍待补齐当前线上版本独立回滚归档及其摘要回读,并处理既有密钥来源/真实消费与例外资格等发布边界。下一建议仅创建并验证当前线上镜像的独立归档,需明确授权写入归档;不加载、不切镜像、不写业务、不清理旧包。部署仍另批,生产三份迁移未执行。

2026-09-15 本地提交授权

用户对33路径一笔本地提交明确回复“是”。提交前实际HEAD为229867f5,真实暂存区为空,R3清单33份中仅本implement.md有已披露的复核/样本/发布准备记录差异,其余32份内容与冻结摘要一致。只按R3 manifest.files逐路径暂存;排除的09-04两份文档及统一审批中心文档不纳入,不提交artifacts或workspace。此次授权不包含推送、部署、归档或更改分支;实际提交SHA以git回执为准,不预先声称成功。

2026-09-14 提交清单与发布执行方案(待授权)

再次核对R3后:仅本implement.md因外部复核结论、生产只读/样本记录增加而不同;其余32份冻结文件零漂移。产品代码仍为已独立审过的R3,不因事实记录更新冒称源码重验。本轮未再次访问生产、发送OCR、提交或推送。

提交合同

建议一笔:fix: 增加回单核对与付款登记门禁(09-08-reimbursement-payment-closeout)。

范围严格采用R3 manifest.files的33个路径:2份模块spec、当前task的prd/design/implement、5份client文件、隔离DB脚本、3份附加迁移及schema、3份常量/原因文件(含服务端夹具)、job接线与worker、付款路由、5份服务和相关后端测试。精确名单以manifest为准,implement使用本次事实记录更新版;实际提交前再次逐路径核对,禁止git add .。

排除09-04的design.md/implement.md及docs/需求-统一审批中心规约.md;artifacts内原件检查工具、发布包和日志不混入源码提交;workspace日志不提交。不得根据detached HEAD自动切分支、改远端、amend或归档任务。用户批准提交后只提交,不默认推送/部署;提交完成记录实际SHA及相对R3仅文档差异。

发布门禁与验证步骤

  1. 提交后若另获推送/发布授权,固定实际候选SHA、树和三份迁移清单;已有生产版本229867f5和元数据只是观察时事实,发布前重查版本/迁移/磁盘/备份时点与完整性/独立回滚镜像,不沿用旧容量或例外。使用existing数据模式,不跑初始化seed。
  2. 未决事项逐项交代:生产密钥高熵来源未有生成记录;一份真实逐笔单页样本成功,不证明多笔/汇总模型;当前无reviewed/failed报销批次,不证明未来人工例外一定有合格复核人;真实JWT浏览器DB同链未测。不得把单页通过描述成全面生产验收。若当前使用情形必须依赖未验证的模型或没有合格例外复核人,暂停相应上线决定,不靠默认放行。
  3. 部署动作会执行已审附加迁移,并在应用启动时创建/调度payment.receipt.ocr队列;这些不是只读检查,必须包含在明确发布授权中。若生产版本或迁移前提变化,停止重新核对,不盲目应用旧候选。
  4. 上线后首先验公网ready/build、容器健康、迁移成功;受控只读核验pgboss队列/调度已注册及周期任务完成记录/失败统计,跨至少两个已配置周期观察。空队列成功tick只能证明调度及空轮询可用,不能说真实回单已消费。无允许的排队回单时不伪造paid或自动重排旧附件;真实端到端任务需另获明确样本/云调用与测试写入授权,禁止以财务实际付款探路。
  5. 执行端检查桌面/手机已构建页面、失败状态提示和权限拒绝;不要求员工做软件回归。没有对生产附件操作的授权不上传、作废、人工复核或登记付款。单元/合成HTTP/browser证据如实复用,不冒充生产真实认证链。
  6. 发现新队列启动失败、迁移失败、健康异常或错误增加即停止继续放行。先冻结进一步业务动作、保存脱敏故障证据,再按独立授权处理恢复。全局JOBS_ENABLED会影响其他任务,不作为无条件回退开关;不删除claim/alias/人工证据,不降级为仅附件存在即可登记。旧镜像忽略门禁,不能自动以镜像回退宣称安全恢复。

人工例外的人员安排

按实际批次列制单人、提案人、所有来源owner/submitter,再从在职且具manager/ceo角色和payment.batch.review权限者排除这些人。不得把普通付款复核人直接视为回单例外复核人;本人报销且仅本人持CEO时可能无人合格。无人合格即报告业务阻断,由用户另行决定职责安排,不加通配、不摘审批角色、不自动改账号关系。当前无需让任何员工提前操作或等待测试。

完成状态:提交/发布方案已准备,R3内容复核通过,真实一份逐笔样本匹配通过;提交、推送、部署和上线消费验收均尚未完成。

2026-09-14 一份历史已付款回单受控样本

用户明确授权一份已付款历史回单、最多一页一次腾讯调用,仅回传状态与匹配结论。选择此前已确认的历史单笔批次及报销,对象须唯一、executed/paid、附件approved且未归档,生产版本仍229867f5;不扩大搜索其他原件。先在RepeatableRead READ ONLY事务读取必要的冻结快照/原单金额及附件引用,退出事务后在生产容器内存读原件并核大小/SHA/单页,解密冻结账号只用于内存精确比较,不回传账号或金额。

实际2026-09-14T13:58:05.284Z完成,externalCalls=1,使用R3冻结matching源码(SHA256 9a1a42d0ec5a9a60ce7de1a58f1ef505e88526d0515e4a854fd617c2107d5fb8)在内存执行:normalizedTransactionStatus=success;amount/currency/payerAccount/payeeAccount/reference均可解析,normalizationIssues=[],matchStatus=matched,matchReasons=[],receiptMatchesSourceAmount=true。原件及原响应未保存到开发机或新文件,未写paid/claim/附件状态,未新增OCR重试。

证据artifacts/qa-layout/receipt-release-preconditions/sample-result.json;受控脚本check-sample.mjs只留安全结果,传输/执行结果不明时明确UNKNOWN_DO_NOT_RETRY,不自动重发。该样本证明当前冻结匹配器适配这一份真实单页逐笔回单,不证明多笔批次/汇总回单模型,不能称银行验真或到账证明;也不证明新worker在生产消费,因为它未部署。

发布前剩余:多笔形态如需宣称支持需另取授权样本;高熵密钥来源及真实JWT浏览器DB同链仍未验证,例外独立复核人须按实际来源/提案人判定。当前无待登记reviewed/failed批次,不伪造真人付款来验。未提交/推送/部署、不覆盖R3包;提交范围与发布/上线队列验证仍另行授权。

2026-09-14 发布前受控元数据检查

用户“执行”后按已说明边界开展一次生产只读元数据检查;未发送真实回单、未读账号/原件、未改配置或业务数据,不执行部署。使用既有SSH别名和systemd Compose身份,运行内存脚本;数据库RepeatableRead READ ONLY、statement_timeout10s、有界100条,仅回传聚合资格/配置存在性。证据artifacts/qa-layout/receipt-release-preconditions/result.json,观察时间2026-09-14T13:49:50.438Z。

结果PASS_METADATA_ONLY:生产BUILD_SHA仍229867f5fd4223d6efadb543a134696f65095763,OCR_PROVIDER=tencent、JOB_DRIVER=pgboss、JOBS_ENABLED=true,腾讯凭据字段与加密密钥已配置。未输出值,配置存在不证明权限/解密可用或高熵来源。

新增paymentReceiptOcrJob.js在线上不存在,符合未部署事实;不能将jobsEnabled说成新回单队列已消费,queueConsumptionTested=false。当前reviewed/failed报销批次0,因此没有本轮待登记对象可验证例外复核人,也没有这些批次的legacy附件恢复对象;不据此宣称没有其他未付款/草稿报销或所有报销已完成。历史“唯一待登记批次”记录不沿用。

真实回单状态/逐笔或汇总形态仍未核验。既有脱敏历史证据只能证明一次单页OCR调用及金额匹配,不能替代新模型。下一受控样本建议限定已登记历史回单一份、最多一页/一次腾讯调用、仅回传字段存在性与规范化状态及匹配布尔值,不改原件/paid/claim,不留原响应;样本对象和调用范围明确后再执行,不将本轮元数据读取扩大为任意原件读取。密钥生成来源需依据受控生成记录,不通过读取密钥猜测熵。

本轮不动R3冻结包、不新增产品源码,未提交/推送/部署。仍需受控样本验证、新版本部署后的队列检查及发布时重新核生产资源/备份/回滚制品;本次结果不构成发布放行。

2026-09-14 R3独立复核通过与发布说明

用户独立只读结论:R3包完整性及内容通过,无阻断项;A1/A2/错误分类成立。适用manifest a415ccde2121d927d3aea77d54cba584ef30bd1cda691a1c4fa2d9d9b4f4b74a、树a972f00b80b78ae6cff66cff154b149e854145ce。记录前重新核对33份工作源码零漂移;本节是复核后发布说明增补,形成task文档差异,冻结sources/README/manifest/证据不覆盖。reviewer未重跑产品测试,不新增独立测试通过计数;内容通过不等于生产已可用或获得发布授权。

发布说明必须保留的边界

  • 系统失败禁止普通重试仅适用于已成功落库的system_failed/key_failed/snapshot_failed。若失败状态本身也写不进去,附件可能仍为processing,15分钟后现有超时分支允许人工重试,可能再次发送OCR。超时不证明故障已修复;管理员应先查安全告警与系统前置,财务不要反复重试。此例外不称为自动重试,也不宣称已彻底禁止故障后的云重传。
  • 当前没有管理员重排队路由或脚本。“联系管理员”首先是诊断并修复密钥/快照/数据库等前置,不代表有现成恢复按钮。修复前置后,在批次仍可编辑、有权限及真实数据/云操作授权的条件下,可重新上传同一份原回单作为新附件进行识别;旧失败附件保留作证,不删除、不伪造新回单,也不重新银行付款。重复交易守卫照常执行;如系统判多笔/歧义不能强行绕过。直接数据库重排队只能另批受控方案,不作为现成能力承诺。
  • 全人工录入是「原件留存 + 经办录入 + 独立人员复核」,不是机器核实内容一致,更不是银行验真或到账证明。
  • 批次级横幅/readiness/execute在缺有效证据时仍可能提示人工核验,与系统失败附件卡不一致。以附件系统失败提示为准,不尝试禁用的核验入口;这是已知非阻断体验问题,留原任务后续小修,不另建任务。
  • 批次离开可编辑状态后附件可能保留processing展示;越界queued清理会消耗一个tick。二者作为已知非阻断限制保留,不解释为付款已失败或实际已执行。

其他发现的明确处置

  1. 登记事务的employees/employee_roles FOR SHARE:本版暂保留,保障当前资格重验;优化须有并发撤权验证,不能为了缩锁面删除安全保证。
  2. claim RESTRICT与批次item Cascade:当前无删批次路径,本版保留证据保护;未来清理/纠错需专门设计,不顺手改级联删除。
  3. manual_rejected后先重做OCR:本版保留并披露额外云调用,后续在原任务评估可复用原证据的修订提案,不静默改当前状态机。
  4. key_id明文摘要:仅在高熵随机32字节密钥前提下接受设计;生产密钥生成来源仍待受控核实,不能把“代码校验32字节”说成已证明高熵。不读取或展示密钥,不批准轮换。

发布前顺序与未覆盖

先准备明确范围的受控核验方案,另获生产/真实回单/腾讯调用授权后核实:逐笔或汇总回单模型与状态、实际OCR provider和job消费、合格独立复核人、legacy未付回单路径及高熵密钥来源。财务创建、CEO复核批次不代表该CEO可复核本人报销的人工回单例外。真实JWT+浏览器+DB同链、断电/断网仍未测;软件本地验证由执行端承担,不让员工反复探路。

随后冻结待提交范围并按授权提交推送,刷新生产版本/迁移/磁盘/备份完整性/独立回滚制品,另批新候选发布;不得沿用旧发布例外。新门禁证据写入后不能以仅退旧镜像恢复安全语义。当前未提交、未推送、未部署、未连生产,仍不是任务整体完成。

2026-09-14 A2与错误分类实施

用户批准按修订合同执行。利用已有varchar状态字段持久记录system_failed/key_failed/snapshot_failed,不新增迁移、不储存异常原文。证据事务失败后另开maxWait5s/timeout10s事务,先锁批次,再按附件id/批次/SHA/版本/processing/未归档/approved进行条件更新(UPDATE取得附件行锁);批次不可编辑或条件失效返回discarded。回写也失败明确failure_recording_failed,日志保留安全outcome,不宣称已落库。没有把数据库整体故障伪装为可可靠持久化。

缺密钥在读文件/云调用前拦住并尝试写key_failed。密钥轮换、业务/银行不支持、身份不全有独立原因码,前后端及夹具同步;batchCandidates显式核密钥,避免通用crypto错误绕过原因映射。系统失败无普通重新识别/人工录入资格;页面指向管理员并阻断登记,不自动重传。管理员恢复须修好前置后另批按版本重排队,本轮不提供无门禁“解除失败”按钮,也未执行生产回填。全人工路径是经办录入与独立人员复核,不是机器核实原件内容。

验证:后端8文件412/412;隔离Postgres及HTTP36项通过并清理,新增缺密钥零文件/云调用、真实SQL除零导致证据事务中止后独立事务持久写system_failed。job单测新增安全分类、回写失败及旧版本条件不命中。测试覆盖不等于实际断网/断电实验;尚未验证真实生产worker及真实回单状态。前端最终构建与新增双端错误提示验收进行中,结果在交审包记录,不提前宣称通过。

最终前端build/typecheck通过(PWA115);桌面1440/手机390共16项浏览器通过、零重试,含三类系统失败无重传/无核验/无付款动作及原人工关联更正/复核/OCR重试回归。预览已停止。严格原因码检查发现动态查表无法静态登记,改为四个字面量分支后重验,不把脚本退出0误认JSON pass=false通过。R3入口artifacts/qa-layout/receipt-verification-review-20260914-r3/README.md;旧包不覆盖,未提交/推送/部署。最终路由映射改为等价静态分支后重跑八文件;DB36证据来自该机械调整之前,其事务/job输入未变化,明确复用,不新增DB通过计数。

2026-09-14 外部六项复核归属与后续修订合同

收到用户只读内容复核:A1发送范围、A2落库失败悬挂为阻断,其余六项为建议及未覆盖项。现场以SHA核对:被描述的7处漂移精确对应原manifest afc15486f000f6edac6724b313a55734a914474527a49455a632d57de4c42929、树5f58dc07f8b2e1d127f7fe3ca5d0561201532d67;R2 manifest 214be14fed3e1c0588f7b60e8450c656237e2487424e1096a618849fe9e2f762、树e1a9c52f40a421c2952ff4a7e53ee90483ea4871当时33份源码零漂移。不能根据目录称呼/mtime把这份结论错绑R2,也不把R2自检当外部通过。此记录写入后工作树文档自然不同于R2,旧包均不覆盖。

A1本地修复与402/34验证仍成立,新增范围闸待独立内容复核。A2确认尚未修复:持久化事务异常会留下processing,仅返回persistence_failed,不具备持久的失败分类。本次只核验审查对象并细化处理合同,没有宣称新增代码或测试通过;不为了目录改名生成无代码变化的R3。

下一修订顺序:

  1. 在原证据事务回滚后,以独立有界事务、批次→附件锁和版本/SHA/processing条件写安全失败分类;晚到失败不覆盖重试、作废、已完成或人工结果。数据库整体不可用时不能保证回写,输出安全失败告警并明确回写未完成,不返回已持久化成功。
  2. 系统/密钥/银行快照问题与OCR识别失败分开;识别失败可以人工例外,系统失败引导管理员,不把无证据的失败伪装为可直接人工核验。不得自动循环发送腾讯,修复系统前不能用“重新识别”掩盖故障。
  3. 为密钥不可用/轮换、银行或业务不支持、参与身份缺失补独立原因解释,前后端与原因码夹具同步;保留匹配问题的原通用提示。
  4. 补持久化抛错、回写抛错、晚到旧版本、作废竞争、错误分类和零重传测试;实际数据库故障注入及页面失败提示验证后冻结R3,提供相对R2及原包的追溯,不继承旧包审查通过。

其他备注处置:HR行锁不能在无并发替代方案下直接删除,保留登记时当前资格保证;RESTRICT是证据保护,不改为级联删除,未来删批次另审;人工否决后重发OCR作为后续体验项记录,不顺带改状态机;密钥高熵来源在发布前受控核验,不读取或展示密钥;全人工例外必须描述为“原件留存、经办录入与独立人员复核”,不是机器验证内容一致、银行验真或到账证明。

外部未覆盖项继续保留:真实逐笔/汇总回单形态与状态、运行中worker、legacy未付回单恢复、合格例外复核人、真实JWT浏览器DB同链。不能将曾成功调用腾讯或本金字段匹配扩成完整真实回单模型已验证。生产/云读取、角色更改、提交推送及部署仍未执行。

2026-09-14 交审后主会话发现:OCR发送范围

用户批准继续既定范围。六项主会话检查发现上传统一queued,retry及worker没有银行报销范围门,非银行/历史差旅回单可能在付款守卫拒绝前已发送云端。这是本地源码路径发现,未证明生产发生外传;原冻结包不改,包完整性PASS不覆盖此行为。

修正范围:上传仅待登记银行报销入队;retry同样限制;worker在批次锁内重查,不合范围的旧queued恢复legacy,不读文件、不调用云端。保留现金/差旅附件保存与既有付款路径。补上传/retry/worker反例及银行正例,定向回归后重新提供增量交审证据;不改角色、迁移或生产配置。

最终验证:八文件402/402同轮通过;真实一次性Postgres及HTTP34项通过,新增现金/差旅/已登记项的worker零读取零云调用检查,清理完成。语法、diff及Trellis治理通过。上传/查询响应也同步关闭非范围重试资格。前端源码没改,原16项浏览器与build只作为复用证据,本轮未重跑;真实JWT浏览器DB同链仍未完成。

执行命令:server下沿上一轮八文件npm test命令(使用既有PAYMENT_ORDER_PYTHON_BIN);根目录RUN_ISOLATED_DB_TEST=1 node scripts/qa/test-payment-receipt-db.cjs。首轮定向131/131及中途DB31项为过程记录,最终402/34取代,不相加。原包不覆盖;R2交审入口artifacts/qa-layout/receipt-verification-review-20260914-r2/README.md,含整批及相对原包的增量补丁、脱敏单测日志和隔离DB回执。整批独立内容审查、提交推送和受控生产核验仍待完成。

2026-09-14 整批交审准备

用户同意下一步,继续本地交审与发布前提准备;不是生产访问、真实回单发送、迁移或发布授权。官方task指针仍为本09-08任务,注入的09-04流程状态不改变执行合同。

交审包入口:artifacts/qa-layout/receipt-verification-review-20260914/README.md。以当前HEAD为基线,冻结本任务tracked及新增文件的补丁、逐文件摘要与重放树;排除09-04的design/implement及统一审批中心文档。使用临时index,不改变真实暂存区、HEAD、远端,不生成提交。包内不复制真实票据、OCR响应或银行资料。

本轮仅修正文档当前状态,不修改产品源码,不重复计入上一轮398/31/16项验证。inline模式下不派实现/检查代理,整批独立复核标为待外部只读复核,不以主会话准备材料代替独立结论。交审重点和发布前受控检查见包内README;先交审,发现项闭合后再申请有明确范围的生产核验,最后另批候选发布。

2026-09-14 最终输入验证与交审边界

本节更新下列历史阶段的“尚未接线/待重跑”状态,不抹去中间失败及分轮记录。最终银行候选过滤只处理银行项;补现金/银行混合历史回归,现金项不要求银行快照或占用。

  • 后端八文件同轮398/398通过:付款路由119、匹配40、OCR9、核验证据20、人工核验39、OCR任务8、pgboss3、错误原因160。沿用既有BIFF8 Python环境,没有新增云调用。
  • 一次性真实Postgres与真实Fastify HTTP共31项通过,含提案、独立复核、只读资格检查、登记、重复拦截、来源金额变化全事务回滚以及混合渠道;容器和临时数据清理完成。认证是合成actor夹具,不是正式JWT登录。
  • 最终前端build(含typecheck)通过,PWA115项;最终构建浏览器16/16同轮通过、零重试,覆盖桌面/窄屏核验及登记状态。浏览器API/auth为mock,不将它和另一组真实DB HTTP证据合称真实登录浏览器全链。
  • 最终浏览器输出为artifacts/qa-layout/receipt-execution-gate-final-ui;本轮自有预览进程已停止。Prisma、语法、严格原因码、process baseline、Trellis治理及diff检查通过;源码输入未变的检查复用,不增加一次通过计数。

交审重点:整个回单增量的角色/参与人隔离、原证据不可覆盖、异步版本竞争、原/新交易身份占用、最终付款事务、掩码与密文边界、双端动作及新增迁移兼容性。既有局部复核不能替代整批独立只读复核;当前inline主会话自检完成,独立复核仍待完成,不宣称已放行。

发布前仍需另批受控核验真实回单交易状态、运行中的OCR/job配置及例外可用的独立复核人,再刷新生产版本/迁移/磁盘/备份/独立回滚制品证据。真实样本不能自动匹配且无合格独立复核人时,应报告业务阻断,不能改为通配或本人批准。已有paid历史不重开;占用/别名/人工证据写入后旧应用不识别新门禁,不得声称只退镜像即可安全回退。

代码 发布 业务验收 等谁
自动/人工核验到付款登记已接通,本地定向验证通过 未提交、未推送、未部署,生产迁移未执行 合成隔离链通过;新增门禁尚无生产验收,不替代既有真实付款事实 整批独立只读复核;生产/云核验及发布另行授权

2026-09-14 付款登记最终门禁与交易别名占用

已接execute:仅银行渠道报销项消费有效OCR/人工证据;保持原批次复核、来源行锁、金额/状态检查和事务边界。补PaymentReceiptClaim.manual_proposal_id与原/新交易身份唯一别名表,同namespace1002锁串行化;最终登记、claim、别名同事务。人工更正的原参考也被占用,另一文件/批次换回原参考不能复用;审核人当前在职/角色/复核权限和所有来源owner/submitter再次验证。不改变既有非银行/差旅历史处理,不重开已付款;新增migration只在一次性DB验证,生产未执行。

新增只读receipt-readiness,以RepeatableRead无行锁/无claim写入重新计算回单资格;前端绑定身份、批次和附件版本/状态,查询成功ready才显示登记动作,加载/错误/未匹配均不放行,可重新核对或查看详情。它不是付款授权,execute仍加锁重验。已登记批次不显示“尚未登记”或“当前渠道不需银行回单”等矛盾说明。

后端8文件397/397通过;其中原正例因没有核验证据首轮7项失败,补明确verifiedReceipt合成冻结快照和真实纯匹配服务生成的证据,未mock最终claim放行;另补无证据、旧版本、错金额、作废、重复、只读readiness零占用和实际execute占用用例。旧差旅历史不并入新报销OCR规则。Prisma validate/generate、语法和diff通过。

真实一次性Postgres30项通过,包含新增原/新别名原子回滚、双身份唯一及幂等、当前角色/参与人变更拒绝、自动与人工并发仅一个claim。新增真实Fastify路由+真实DB链:提交人工核验→ready=false/execute409→独立复核→只读ready=true零占用→execute写paid及具体提案claim→重放409;来源金额变化使claim/alias/付款整体回滚。身份为显式合成actor fixture,不冒充正式JWT登录;邮件/IM/ERP全关闭,无云调用、无生产访问,容器/tmpfs已清理。

测试过程保留:首轮HTTP集成夹具把featureFlag.flag_key写成key,验证失败后修正;随后一次Docker子命令失败未定位(原输出只有行号),补安全operation/exit诊断及“容器已不存在时不覆盖原异常”的清理处理后完整重跑30项通过,不把未知原因说成已定位。DB脚本出口只有安全结果,没有原票据/账号/原始payload。

浏览器第一轮12/12通过(1440/390未核验不得登记、人工关联/更正、独立复核、重试,加非银行路径与查询失败),API/auth为mock,真实DB HTTP另行验证,不宣称同一浏览器完整真实JWT链。最终文案后需以最后构建再跑对应浏览器集合。整个OCR增量仍待独立只读复核及发布前受控样本/运行前提验证;真实样本交易状态值未在本轮读取,不假定都能自动匹配,缺独立合格复核人的例外不得靠通配自审。未提交/推送/部署,不沿用旧发布授权。

2026-09-14 核验详情与双端操作页面接入

新增GET manual-verification,沿既有登录/批次读取/功能和来源部门守卫,RepeatableRead只读事务内核附件版本/SHA;只返回规范化摘要、掩码账号、提案更正字段与说明,不返回密文包/原响应/完整账号。canReview由同一独立复核规则按全部来源参与人计算,仍非写入授权。保存支持只提交字段差异,服务端从绑定原证据补齐其他字段;不让客户端回传掩码账号覆盖真实账号。

沿回单卡“核验详情”打开既有Dialog风格组件,按页展示原识别和人工结果。仅选对应明细不重填字段和理由;更正只提交非空改动字段并要求说明;原状态不明不默认成功。独立审批人查看更正并复核,不合格账号只见等待说明。详情身份/批次/附件query key加signal,关闭后台表单刷新;切身份/批次关闭,卸载后的变更回调不刷新新身份页面。上传/在线查看/下载保留,人工保存/复核均零execute请求。未使用新视觉体系,沿现有组件和样式。

验证:8文件391/391同轮通过,真实隔离Postgres24项通过并清理(新增只读详情事务与掩码检查);真实DB仍为服务级测试,HTTP为Fastify注入+mockDB。前端初次typecheck因三个未使用参数失败,改用明确_unused参数后最终typecheck通过;build/PWA115项通过,最终固定源码又运行npx vite build后进行浏览器验收。1440/390的仅关联、字段更正、独立复核、OCR失败重试共8/8同轮通过、零重试,保存载荷无账号重填且上传/execute计数为零。测试API/auth为mock,不宣称生产或真实认证整链。

浏览器命令:client下E2E_BASE_URL=http://127.0.0.1:4188 npx playwright test tests/e2e/system-action-confirmation.spec.ts --grep '回单人工核验|回单独立复核|回单OCR失败' --workers=1 --retries=0 --reporter=list --output=../artifacts/qa-layout/receipt-manual-detail-ui。server八文件联合命令同上一节并新增断言到现有路由文件。根目录RUN_ISOLATED_DB_TEST=1 node scripts/qa/test-payment-receipt-db.cjs。diff与Trellis治理通过;旧punycode/Browserslist/NO_COLOR警告未扩修。

仍未完成:execute最终事务消费自动/人工证据、人工更正前后交易身份持久唯一占用、具体提案关联、来源金额/状态及当前审批资格重验,以及真实DB HTTP/双端全链和整个增量独立只读复核。此次inline主执行自检,不继承前轮局部review结论。页面完成不代表最终付款门禁启用;未部署、未提交/推送、未连生产或调用真实OCR,不重开已付款。下一步直接完成登记门禁与整链,不让员工承担软件QA。

2026-09-14 人工保存与独立复核事务接入

实际task指针仍为09-08;注入09-04状态未作为换任务依据。新增PaymentReceiptManualProposal附加迁移及内部持久化服务,绑定原verification、SHA和递增版本,原记录保留。内容及理由加密;只关联未改事实为association_ready、系统关联理由,不要求二次录入或审批;更正为pending_review。原/新指纹和明细已有claim时拒绝,未知密钥轮换拒绝。复核重验原件版本/匹配/占用以及全部source owner/submitter,审批者不得为制单人/提案人/申请参与人;批准manual_approved、拒绝manual_rejected,均不写paid。拒绝记录保留,允许显式OCR重试取得新版本。

接入两个受控POST:receipt-attachments/:attachmentId/manual-verification与manual-verification/:proposalId/review;沿既有登录、财务管理或manager/ceo复核角色权限、开关与来源部门守卫,服务内再次锁批次→claim advisory→附件。保存/决定/版本/审计同事务;响应只有id/status/version,未知内部错误不透出原payload。新增四项注册错误说明并前后端对齐。前端只补新状态文案,人工表单/核验详情还未接。

验证:8文件387/387同轮通过(付款路由109、manual39、verification19、matching40、job8、OCR9、pgboss3、错误原因160)。一次性Postgres全迁移22项通过、容器/tmpfs清理完成,新增保存/审计回滚、并发版本、加密安全摘要、自审拒绝、独立复核仅一次且不付款、原指纹跨批不可改掉、SHA变化拒绝、拒绝留痕及显式重试、审计FK失败全回滚、同额消歧无需重填。HTTP测试为Fastify注入+模拟DB,真实DB测试为服务层,不冒充真实DB HTTP或浏览器全链。

命令:server下PAYMENT_ORDER_PYTHON_BIN=/tmp/hyb-oa-biff8-test-venv/bin/python npm test -- tests/unit/routes/paymentBatches.reimbursement.test.js tests/unit/services/paymentReceiptMatching.test.js tests/unit/services/paymentReceiptOcr.test.js tests/unit/services/paymentReceiptVerification.test.js tests/unit/services/paymentReceiptManualReview.test.js tests/unit/services/paymentReceiptOcrJob.test.js tests/unit/jobs/pgBossJobs.test.js tests/unit/scripts/error-reason-client.test.js;根目录RUN_ISOLATED_DB_TEST=1 node scripts/qa/test-payment-receipt-db.cjs。Prisma validate/generate、node --check、错误原因strict、process baseline、diff通过。旧SDK punycode警告未扩修。

最终补验:保存递增与复核读取的整数上界分开,最后有效版本仍可复核、不溢出;付款路由109/109再次通过,真实DB完整重跑23项通过并清理,包含最终整数版本回归。之前387为修正上界前联合运行,未变输入复用、不增加累计通过数。前端npm run typecheck及npm run build(含116项PWA预缓存)通过;Trellis治理和最终diff通过。旧Browserslist提示未扩修。

当前主线仍未完成:受控核验详情/人工表单/审核页面、execute对自动/人工证据同事务最终重验与claim、真实DB HTTP和双端整链验收。本轮新增事务/接口待独立只读复核;不继承上一轮纯函数局部复核通过。无生产访问、无真实云调用、无提交/推送/部署;不提前发布门禁,不让员工试错。

2026-09-14 人工提案内部校验(接口未接入)

当前继续原09-08,未新建task。新增paymentReceiptManualReview内部服务:完整页数/逐页关联、逐项精确金额币种和完整账号匹配、同额消歧、字段更正来源清单、原交易指纹保留。只关联且事实未变不额外复核;字段更正、缺字段或OCR故障须独立复核。新增身份守卫要求既有manager/ceo业务角色加复核权限,排除制单人、提案人以及所有报销归属人和提交人;未知身份拒绝,admin通配不能代替业务角色或绕过自审。

规范化保留失败/处理中别名冲突的否决线索,人工不得改为成功。只读复核发现原跨页重复可改参考后变成普通更正,已补原指纹重复硬阻断,增加改参考/付款账号不能掩盖重复的用例。原指纹返回仅供未来事务内跨批占用检查,不是公开API字段;规范化账号仍限内部加密存储。

验证:8文件联合362/362通过;修复复核finding后两文件79/79(manual39、matching40),其余输入未变,不宣称365同轮。运行server下npm test -- tests/unit/services/paymentReceiptManualReview.test.js tests/unit/services/paymentReceiptMatching.test.js;联合付款回归使用已登记PAYMENT_ORDER_PYTHON_BIN。RUN_ISOLATED_DB_TEST=1 node scripts/qa/test-payment-receipt-db.cjs的13项通过并清理完成,无生产/腾讯调用。node --check、git diff --check、Trellis治理通过。数据库检查仍针对既有OCR/claim服务,不冒充人工提案落库测试。

独立只读复核补记:本轮manual helper、状态别名否决和对应测试在修复后复核通过,无新增finding。reviewer报告79项内存断言通过,非Vitest,不与主执行79/79累加;未审整个OCR增量/HTTP/事务接线,不以本次局部复核抵扣最终全量复核。

未完成:人工提案持久化/版本与SHA/audit事务、跨批原指纹检查、受控接口及前端、execute同事务接线、完整HTTP和双端验收、整个增量独立复核、授权发布。当前不改变线上付款流程、不重开已付款、不提交/推送/部署。下一步按上述顺序接人工提案与复核事务,再接登记门禁,不单独部署此内部helper。

2026-09-14 上传入队、调度与重试接入

已按批准接入新上传receipt_ocr_state=queued(与附件/审计同事务),既有附件仍legacy不自动外发。cron及pgboss均唤醒共同DB领取器;pgboss独立payment.receipt.ocr队列、retryLimit=0,不借发票落库链。上传/重试接口不在HTTP请求内调用腾讯,失败不反复外发;off/mock配置禁止回退真实腾讯调用。

重试POST receipt-attachments/:attachmentId/ocr-retry要求财务管理权限、功能/来源部门、可编辑批次、有效未作废回单及expectedVersion。queued/matched不重排,processing满15分钟才允许显式重试,失败/待核验/legacy可重试;同事务递增版本及写重试审计,双击/并发旧版本409。前端从服务端接收资格布尔值和状态/版本,桌面手机保留原布局,展示识别状态和“重新识别”,queued/processing按5秒刷新。不返回OCR明文;重试不上传新文件、不登记付款。

验证:7文件联合324/324(付款路由91、verification19、matching40、job8、OCR7、pgboss3、错误原因156);之后补off/mock禁止真实外调两项,OCR文件9/9,去重总326,不宣称326同轮。Prisma schema前轮已验证且本轮未改;typecheck/build/PWA、错误原因strict、process baseline、Trellis和diff通过。13项一次性Postgres检查通过,含并发重试仅一个版本成功;容器/tmpfs清理完成。本轮无生产访问或真实OCR外调。

双端页面:初次dev服务1440用例在login-identifier出现前超时、390通过,不算该轮全绿;使用本轮已通过build的preview,不改断言/超时,1440/390同轮2/2通过、零自动重试。证明识别失败→重试→queued、按钮消失,重试一次且付款登记/上传请求零次;API mock,不冒充真实认证/后端整链。两组证据分别为artifacts/qa-layout/receipt-ocr-retry-ui与receipt-ocr-retry-built-ui。首轮付款测试缺BIFF8解释器导致两例409,恢复已登记解释器配置后原84与新增7路由全部通过;新增重试测试首轮漏认证头,补合成认证头而非放宽鉴权。

仍未交付:人工更正/消歧及独立例外、execute接核验claim同事务、核验结果详情与完整HTTP/双端闭环、独立只读复核和授权部署。因此不把当前匹配文案或已接队列当作付款核验门禁已经启用。下一步重点完成异常处理与登记门禁后一次交付,未提交/推送/部署。

2026-09-13 实施第三段:后台单次识别执行器

新增claimReceiptJob/runReceiptOcrOnce,仅处理显式queued、未作废且治理approved、批次reviewed/failed的回单。锁序为批次→附件,SKIP LOCKED使两个worker只能一个取得任务;领取时版本递增,旧匹配立即失效。真实文件读取前限制大小,完整性检查失败不向腾讯发送;无自动重试,返回只含安全状态。结果落库复用批次/附件/版本守卫,晚到结果discarded,持久化异常保留persistence_failed而不伪报OCR成功。

迁移新增receipt_ocr_state默认legacy及started_at:既有附件不会自动被外发。新上传入队、cron/pgboss调度、停机超时后的人工重试及页面尚未接入,当前executor未自动启动;processing失败不能静默重传,后续提供显式重试并递增版本。未改变生产或实际上传行为。

验证:四文件同轮69/69单测通过;Prisma generate/validate通过。一次性Postgres全迁移及12项检查通过,新增并发worker单次领取/旧证据失效,以及文件错误零外调且失败状态真实持久化;容器/tmpfs已清理。执行命令为server下npm test -- tests/unit/services/paymentReceiptMatching.test.js tests/unit/services/paymentReceiptOcr.test.js tests/unit/services/paymentReceiptVerification.test.js tests/unit/services/paymentReceiptOcrJob.test.js,以及RUN_ISOLATED_DB_TEST=1 node scripts/qa/test-payment-receipt-db.cjs。非HTTP/浏览器验收,无腾讯/生产调用,未独立复核。

下一步仍需调度/上传入队和重试、人工核验、execute API接线、错误解释与双端页面,再完整验收;69/12不替代这些未执行项。产品入口不得在人工异常处置未完整时先发布强门禁。当前未提交/部署,用户已批准同范围不重复索取实施授权。

2026-09-13 实施第二段:持久化与事务占用守卫

新增三张核验/页匹配/交易占用表、附件OCR版本列和附加迁移;规范化白名单字段加密存储、无原始响应。storeReceiptRecognition在批次/附件锁内检查版本与SHA;claimVerifiedReceipts在调用方事务内重验附件治理、来源版本、完整页数、冻结金额/账号与持久化匹配指纹,跨批/并发重复用advisory锁和数据库唯一约束共同防护。key ID变化阻断,不允许轮换加密密钥绕过去重;后续密钥迁移另审。

最终63项单测(matching40、OCR7、verification16)同轮通过,之前47/62为子集不累加。Prisma generate/validate及服务语法通过;生成使用现有链接node_modules,不修改其他工作树源码。RUN_ISOLATED_DB_TEST=1 node scripts/qa/test-payment-receipt-db.cjs在一次性Postgres16中重放全部迁移,10项检查通过:迁移、事务回滚、幂等、跨批重复、并发重复、作废、晚到作业、SHA变化、版本失效、数据库唯一约束。退出后容器/tmpfs清理完成,无生产访问/云调用/真实文件,非HTTP测试。

中间失败保留事实:首轮数据库失败只有通用错误,补安全code/行号后定位Prisma P2010;直接选择pg_advisory_xact_lock的void返回不兼容,将结果投影为整数后数据库通过。未取消锁、增超时或降低断言。随后补版本与过期结果守卫后按最终输入再次跑完整10项,最终结果才作为当前验收。

仍待:队列/上传实际接入、权限受控人工核验与独立例外、execute路由同事务调用、错误原因客户端映射、页面、HTTP/双端完整场景与独立只读复核。当前新守卫是未接入产品入口的服务,不能声称线上已启用;未提交/推送/生产迁移/部署,不归档任务。下一步从队列版本化调度和路由接线继续,不重复当前测试通过计数。

2026-09-13 实施第一段:OCR适配与纯匹配服务

用户授权继续完成,沿当前09-08任务实施,无生产访问/外调/写入。本段新增paymentReceiptMatching与paymentReceiptOcr及对应两个单测文件;既有09-04发布记录、根checkout治理改动保留,不混提交。

  • 字段别名覆盖真实样本返回的“小写金额/币别/付款人账号/收款人账号/凭证号/单据状态”;测试仅用合成字段值。金额严格千分位和两位小数,BigInt最小单位字符串比较,不使用parseFloat或去掉所有非数字来猜值;账号保留前导零,掩码不作完整账号匹配。
  • 别名冲突、重复字段(可能页内多笔)、缺失或歧义保持待核验;同人同额候选不自动选第一条、不比较批次合计。受理/处理中/状态不明不能被认作成功;显式失败/撤销/冲正/退汇返回不匹配。
  • 专用BankSlipOCR适配只在调用时创建客户端,默认有界30秒请求、不自动重试;PDF逐页处理并记录预期/实际页数,后页失败保留失败状态;5MiB原件/7MiB编码/20页为当前技术安全上限,超限进入待核验而非拒收附件。WEBP在内存转换PNG,校验实际格式及像素/多帧限制,不暴露URL或保存原始响应。
  • 纯服务返回的规范化账号/交易参考仅为内部敏感输入,禁止直接作为API响应或日志;匹配结果仅包含状态/候选ID/原因。matched不表示银行验真,也未包含跨批数据库去重、源单复核或交易占用,不可直接替换execute门禁。

验证:首次新测试因模块尚不存在而收集失败(不是40项断言已跑红);实现后matching 40/40,适配加入后两个文件同轮47/47。命令为server下npm test -- tests/unit/services/paymentReceiptMatching.test.js tests/unit/services/paymentReceiptOcr.test.js;两个服务node --check和git diff --check通过。SDK加载产生既有punycode弃用警告,不影响通过;本轮全mock客户端,没有追加真实腾讯调用。

尚未完成:持久化schema/迁移和加密/交易去重约束、后台作业及晚到取消、权限受控人工核验、execute事务门禁、页面、隔离数据库/HTTP/浏览器整链及独立复核。当前产品入口尚未接入新服务,没有给线上系统宣称已核回单。下一步从核验持久化/事务合同接续,不重复请求已批准同范围授权;提交/推送/生产迁移/部署仍另批。

2026-09-13 权限调整后真实回单OCR复验

用户告知已添加权限并明确要求重试。对同一限定单页回单执行两次BankSlipOCR:13:32:13Z接口成功,返回17字段,但初版探针仅按“交易金额”读取而未取得金额,故当次金额核对为null,不能算失败金额或全量识别失败;13:32:53Z仅扩展探针金额别名和安全字段名诊断后,识别“小写金额”成功,回单/冻结付款明细/源报销单金额三者一致。返回字段包含付款人账号、收款人账号、币别、凭证号、单据状态等;本次未比较账号值、未解释状态值、未核凭证去重或银行验真,不能把字段名称存在当成内容已核对。

两次各1请求,无自动重试,均仅内存读取原件/响应,不保存字段值或原始响应、不改付款记录;旧授权错误回执保留。证据为receipt-ocr-retry-result.json、receipt-ocr-field-diagnostic.json。BankSlipOCR实际字段有版式差异,正式适配须覆盖别名并保留未知/歧义待核验,不能使用初版fields白名单布尔值判定回单缺字段。本轮仅诊断脚本调整,不是产品接入或部署。

用户扩大了云权限,成功只说明当前调用获准,不证明新增权限全部必要。建议管理员保留既有发票功能所需权限和本次BankSlipOCR最小授权,移除无关新增权限后再验证;执行端未读取或修改CAM策略。下一步实施字段规范化/交易匹配与安全登记门禁,已有paid历史不重开。

2026-09-13 获批真实回单OCR试验:授权门阻断

用户明确授权读取刚上传的目标付款回单并发送腾讯BankSlipOCR,仅反馈字段/金额匹配,不展示账号/正文、不修改付款记录。沿此前已核单号/批次限定唯一明细与唯一未归档且治理approved的回单;事务RepeatableRead READ ONLY、10秒语句超时、ROLLBACK。真实文件仅在生产进程内存读取,核大小/SHA/PDF签名和单页,未下载到开发机、未保存原始响应。

12:02:14Z生产229867f5回读batch=executed、报销=paid且paid_at非空,批次明细金额与源报销金额一致;仅此目标单据,不代表三张重提单已独立核验。回单1页且完整性检查通过,已有腾讯凭据和SDK具备BankSlipOCR方法。

调用BankSlipOCR一次,返回AuthFailure.UnauthorizedOperation,试验PAUSED,未取得识别结果、未核回单金额。不能将凭据存在/发票OCR可用解释为回单API已获授权;不自行放宽CAM策略、不换凭据或回退调用其他OCR绕过拒绝,也不重复重试。

待腾讯云管理员核查当前调用身份对ocr:BankSlipOCR的最小调用权限及该服务开通状态;本轮只证明服务返回授权错误,不断言是欠费、未开通或某条CAM规则的具体原因。修复后可按同一限定样本复验,不改OA付款流程或历史paid状态。执行脚本try-receipt-ocr.py及receipt-ocr-result.json在既有finance-owner-release证据目录,Python/内嵌Node语法检查通过。没有生产业务写入、部署、云权限写入或自动补审计事件。

2026-09-13 回单自动核对接续

用户采纳“自动识别与匹配、正常不加负担、异常待核验”的方案。本轮复用09-08更新PRD/design/实施清单,官方current已切换并回读;保留09-04未提交发布记录及根checkout其他改动,不混入当前任务。当前只完成规划与接口调查,运行时代码、迁移、测试和部署尚未实施。

  • 确认当前上传只保存附件及审计、登记要求有效回单存在并比较源单/批次金额;没有回单金额解析或匹配。
  • 固定已批准范围、异常保存/阻断边界、腾讯专用识别与真实数据外发授权边界;明确不以OCR代替验真。
  • 细化核验数据结构/索引、页级作业幂等、敏感字段加密和交易去重、人工核验资格;先审既有队列/付款事务/加密合同,不复用发票业务写入路径。
  • 先写金额、账户、币种、交易状态、重复、同额歧义、多页漏页及人工来源的失败测试,再实现纯规范化/匹配服务。
  • 接入专用Tencent/mock适配与隔离作业、附加迁移和权限受控核验接口,处理作废/重试/晚到作业及并发占用。
  • execute增加服务端核验门禁;覆盖非本人独立复核、普通理由不能绕过、历史已付款不改及旧未登记批次不豁免。
  • 现有付款详情显示处理结果与异常入口,正常不多确认;仅维护已有样式,桌面/手机及批次多笔回归。
  • 本地单测、一次性Postgres/HTTP/浏览器全链与独立只读review;真实OCR与合成结果分别报告。
  • 更新业务事实源与稳定spec,冻结审核输入;提交/推送/生产迁移/部署另批。真实回单外调及实际付款不在本轮自动操作范围。

下一步是数据/匹配合同与失败测试,不继续调整制单备注、不新建任务、不重跑或重复计数上轮519项单测。现有09-04发布验收不作为新回单核验通过证据。

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

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

2026-09-11 制单备注小改(已批准,独立执行副本)

基线5d8cdf12;独立remarks工作副本执行,官方current已切本task。原integration副本的既有制单准备/恢复/账号隔离记录不覆盖、不混入本补丁。不新建task,不提交、推送或部署。

  • 核制单一单一行、冻结payee来源、模板没有备注长度说明,BX配置驱动/PB按日三位流水;编号实现不改。
  • 先补备注、多人/同人多单及缺失输入回归,跑红后改备注拼接。
  • 跑制单单测与真实BIFF8读回、编号/付款路由相关回归、语法与流程检查。
  • 主会话复核最小差异,记录银行导入未验证和候选未发布;不要求真人代测。

本轮验证:旧实现15项中3项按预期失败(备注缺姓名与用途),修改一行运行时后4个测试文件121/121通过:制单15、编号8、付款路由82、付款就绪16。追加用途/备注BIFF8文本类型断言后,制单15/15再通过;不将重复执行累加为新测试数。真实固定模板生成并用xlrd读回,验证15列、3个sheet、模板表头/列宽、中文备注、金额、账号前导零、稳定客户流水号。node --check、git diff --check、Trellis治理和process-contract baseline检查通过。

主会话检查确认运行时只改备注拼接,不动权限、状态、审批、编号或数据迁移;本轮不是独立复核。现有银行模板没有长度上限说明,网银实际导入及长备注接受性未验证。仅本地完成,未连接生产、未导出真实制单、未提交/推送/部署。下一步将本增量纳入候选复核与提交准备;提交/推送和部署须明确授权,不能直接覆盖原integration任务记录或将原有冻结候选视为包含本改动。

2026-09-11 业务就绪只读检查准备(未执行生产查询)

复用已确认身份和经理/主体回填回执,不再猜邮箱或索取工号。排除 smoke 账号,分别核对能登录、能提交、能审批/复核、能组批/登记,不能合并成一个笼统 ready。

  • 登录:真实业务账号在职/启用及角色组合,只回传角色与布尔状态,不读取凭据或个人登录历史。
  • 提交:核对直接经理和适用审批人解析;财务经理已修正和 CEO 自报兜底只作为历史证据,不推断所有规则都能提交。
  • 审批/复核:保留 CEO 审批路由及非制单复核;不用 admin 通配代替业务角色,不修改六个 view_all。
  • 付款:主体、付款账户、收款银行资料只回传是否存在/启用/关联匹配。受控解密可用性需另列范围,仅回传成功/失败;门户待办不解密、不输出银行信息。
  • 有缺项只报告脱敏对象、阶段、维护职责;真实回填另批,不由本地测试自动推导生产 UPDATE。

报销详情一致性与四类业务待办的本地实施分别归 09-04 和 09-11 任务,联合验证已通过:135 单测、39 页面及真实隔离 HTTP/双端流程。证据见联合副本 artifacts/qa-flow/20260911-combined/;只登记合成回单,没有银行连接。本轮未查询生产、未调用真实腾讯 OCR、未实际付款或发消息;独立复核、提交和部署未完成。

2026-09-10 本轮付款体验已发布

  • 代码:付款提交 fe025e65 与删除提交 73fcd5a6 已分别提交并推送,最终统一候选 fe025e65;中文“报销制单”文件名、下载免手填理由但保留敏感/重复下载确认、操作卡下方处理进度及 filename* 解析修复随本轮上线。本节覆盖下文历史阶段的“未提交/未发布”状态。
  • 发布:用户明确批准后,23:11:59(Asia/Shanghai)正式 deploy-existing 第二次执行退出 0。第一次依赖下载 ECONNRESET,确认未执行迁移/切换后按原候选重试,无更改锁文件或跳过门禁。新迁移仅来自删除提交;existing 无 seed,数据库容器不重启、环境文件不变、备份合同 refresh 成功。
  • 验证:本轮生产只读核验版本、代码/结构摘要、68 条迁移、HTML 与 12 份相关资源、匿名权限守卫和回滚制品;正式公网资源扫描 106 份、buildMarker PASS、findings=0。证据位于主 checkout 的 artifacts/qa-flow/20260910-release-fe025e65/,发布细节和回退限制共用删除 task 最新回执,不另建 task。
  • 公网浏览器补查桌面/手机未登录入口,控件可见、无横向溢出、console errors/warnings 为 0;不是已登录付款页面验收。关闭回报 closed 但外层退出 143,已另核本次浏览器进程退出,不包装为整组浏览器命令全绿。
  • 业务边界:本次不登录真人账号操作真实批次,不重复导出真实制单、不复核或付款;真实 BIFF8/中文下载/桌面手机付款流程的执行证据仍为合并候选已有真实隔离联合测试,不冒充生产真实付款验收。独立 reviewer 未审制单/前端/BIFF8、完整候选验收缺口保留。
  • 下一步:实际付款与回单继续按业务办理,不要求财务或经理替执行端发现基础缺陷。F1 非阻断加固留原删除 task 后续处理;不自动归档、提交补记或清理回滚制品。

2026-09-10 当前执行

合并候选验证与发布边界

  • 最终页面回归:合并构建产物 preview,Playwright system-action-confirmation.spec.ts 按“财务先制单/制单失败/付款/银行回单/报销”选择,19/19,退出 0;ui-final.log 为最终证据,ui.log 为中断记录。已检查桌面与手机截图:操作卡下接进度,窄屏无横向溢出,底栏动作可达。当前本地实现与联合验证完成,等待独立复核及提交发布授权。

  • 本轮独立付款副本基线 e5685f1;与退回删除按补丁合入 artifacts/isolated-worktrees/20260910-reimbursement-payment-integration,没有提交或覆盖主 checkout 的既有改动。

  • 合并 focused 后端:23 文件、296/296;另下载文件名解析 7/7。命令以删除 task 的 focused 列表加 paymentOrderXls.test.js 为准;文件名测试为 tests/unit/utils/client-download-filename.test.js。记录见合并副本 artifacts/qa-flow/20260910-combined/unit.log、filename.log。

  • 真实隔离执行:RUN_ISOLATED_DB_TEST=1 RUN_RETAINED_DELETE_TEST=1 RUN_BROWSER_TEST=1 RUN_PAYMENT_EXPERIENCE_TEST=1 node scripts/qa/test-invoice-first-http.cjs;BIFF8 使用既有受控测试解释器。real-db-browser.log 为 PASS_REAL_DB_HTTP,退出 0,数据库、合成文件及浏览器完成清理。

  • 联合验证涵盖上传选票填明细、退回重提与三步审批、退回留痕删除与票据复用、并发/事务回滚、财务组批、CEO 复核、非授权下载拒绝、桌面/手机真实下载中文 BIFF8、不要求理由、再次下载警告。不执行真实银行付款,OCR 为真实 worker + mock provider,不能称为本轮腾讯 OCR 新验证。

  • 前端 typecheck/build、Prisma validate、UI strict/self-test、错误解释 strict、process baseline、task validate、Trellis governance、diff 检查通过。文档 registry errors=0 / warnings=1,为既有 22 个未登记文件,不扩修。

  • 最初真实付款 fixture 缺环境功能开关导致 409,修正仅限隔离配置;浏览器实际复现中文名称被旧解析器丢弃,已修产品代码并补七项解析测试。合并页面首轮受 SIGTERM 中断(143),不能视为通过,单独重跑结果另记。

  • 保留生产边界:未提交/推送/部署,未触碰真实单据/账户;六个 view_all 与审批角色不变,不能宣称经理只能看相关报销。退回留痕删除含新增迁移,旧镜像可能重新显示留痕删除记录,不能复用“无迁移、只改权限”旧例外。

  • 主会话执行本地自审与自动验证;独立只读 reviewer 未执行。下一步先复核两份独立补丁,再按明确授权分别提交、冻结统一候选、重新发布预检和部署后自动验收,不交给员工发现基础缺陷。

联调发现并已修:共享下载客户端只解析 filename,忽略 filename*,导致服务端中文名仍被 ASCII fallback 替代。现优先解析 UTF-8 扩展名;损坏编码、不支持编码、空值回退原 filename。新增 7 项客户端解析回归,已通过。付款路由/BIFF8 93 项通过;最终浏览器和合并验证见本节记录,本地通过不代表已发布。

用户批准本轮报销/付款改动全部完成、合并验证后再部署。付款在独立副本实施,基线 e5685f1,不混入退回删除的迁移。既有历史阶段不代表当前发布状态。

  1. 中文制单文件名、无手填理由的敏感下载确认、操作卡下方处理进度。
  2. 制单独立请求合同允许省略原因;旧客户端真实填写的原因仍保留,系统用途及来源独立记录,不伪造用户原因。
  3. 路由、BIFF8、桌面/移动浏览器定向回归,再与退回删除合并做隔离数据库全链验证。
  4. 独立复核、提交和发布尚未完成;生产动作另行授权,不以员工正式业务代测。

2026-09-08 获批技术执行

  1. 检查 CLI/项目/npm 稳定版本及官方 update dry-run;保留现有定制,稳定通道无新版则不切 beta、不强刷文件。
  2. 从业务先后、身份权限、资料安全、状态一致性、模板兼容、运行依赖、失败重试、部署边界八方面审查计划与实现。
  3. 先运行付款 readiness、公司账户、复核/执行、BIFF8、审批退回相关定向单测;浏览器仅运行本地合成的付款路径,不运行已挂起的合同/真实账号全链用例。
  4. 发现影响本业务的具体代码缺陷先用最小失败用例复现,再修复并回归;只缺生产资料的项目不冒充代码故障。仅存在覆盖缺口则补针对性验证,不宣布实际业务已完成。
  5. 输出已修技术项、仍须真人操作的数据项、未验证生产项;只读复核由用户完成,不派代理,不自动提交或部署。

证据根目录:artifacts/qa-flow/reimbursement-payment-closeout/technical-review-20260908/。开始前完整 Git 状态、tracked 摘要、未提交 diff 和 index diff 已保存;既有 AP 修订/其他 task 不回滚、不混报。

技术阶段结果(本地完成,待用户复核,不等于业务完成)

2026-09-08 追加单字段生产授权

用户在“另行批准只补 0014 归属人的主体;银行资料由授权管理员直接录系统”之后回复“同意,批准”。本次仅执行 0014 归属人 legal_entity_id 从空值关联当前唯一启用未归档主体;不扩展为银行资料写入、解密、提交、推送、部署或真实付款授权。

只读预检通过:0014 唯一、approved 且未付、归属人是已确认 majianyong、角色 ceo+employee、主体字段为空、无付款批次项占用、目标主体唯一。员工 UPDATE 触发器/规则摘要与前次已审单字段修正一致。生产仍为 f223bfb。执行时再次锁定核对身份/状态/原值/目标摘要,条件更新恰好一行,再提交并以独立连接只读回读;失败不自动重试,提交状态不明时不宣称回滚。

证据目录:artifacts/qa-flow/reimbursement-payment-closeout/legal-entity-correction-20260908/。脚本仅读取身份与状态必要字段,不读取金额、票据、银行字段或真实密钥,输出脱敏核对结果。

执行结果:2026-09-08 北京时间 22:30,PASS_APPLIED_AND_READBACK;条件更新 1 行,原值为空,独立连接回读与获批主体一致,角色保持不变。仅更新 employees.legal_entity_id,不改单据、批次、银行字段或审批关系。个人银行资料当前是否补齐未重新查询,不宣称财务已可组批或付款。语法检查、task validate、治理及 diff 检查通过;主会话自审,不冒充独立人员复核。回退需要另批,且应以本次目标值为原值进行条件检查,不自动清空。

  • Trellis:CLI/项目均为 0.6.16,npm 的 CLI/core stable latest 同为 0.6.16;beta 为 0.7.0-beta.3,不切预发布通道。按官方 upgrade --dry-run 和 update --dry-run 核验,无稳定版本升级;11 个项目定制文件保持原样,没有执行 force 覆盖、全局安装或改模板哈希。记录见 trellis-registry-tags.json、trellis-core-registry-tags.json 和两份 dry-run 日志。
  • 八角度规划审查已完成并写入 design.md 第 7 节:业务先后、角色、资料隐私、操作顺序、格式、运行环境、失败重试、发布/银行授权。保留单据资料与技术问题的区分,不批量回填、不扩大角色或付款规则。
  • 确认并修复一项界面顺序债:已复核且可制单、尚未生成且无回单的详情优先下载,生成后转上传回单;手工付款用户仍可在更多直接上传,已有回单仍可登记。使用既有样式/动作模型,运行时仅 client/src/pages/PaymentBatchesPage.tsx 一个文件新增变化;前后端权限、付款接口、审批及数据库均未修改。
  • 先补断言再修:browser-red.log 明确复现首个下载动作被隐藏,1 条失败;该失败发生在登录成功后的动作断言,不是认证/网络前置。后续桌面/移动端测试实际收到了合成 .xls 文件,核对文件字节、原因/取消、重下载警示和不触发付款,且通过真实 filechooser 保留手工上传路径。
  • 后端最终 9 文件 158/158 PASS(backend-verified.log),包括 readiness、付款账户、复核/执行/回单/导出、报销提交与退回通知、CEO/经理解析及新增的独立 BIFF8 逐列读回。新增 readback 初次因测试直接访问未配置的第 15 列宽触发 KeyError;改用 xlrd 的有效列宽 API 后通过,保留诊断日志,不当作生产缺陷。
  • 浏览器同一最终源码的 16 条目标用例全部已覆盖通过,分两次完成:browser-final.log 为 13 PASS + 3 因本地 Vite 退出导致登录连接拒绝而未能执行;未改代码/断言,恢复同源服务后仅补跑这 3 条,browser-boundary-rerun.log 为 3/3 PASS。不是一次 16/16 全绿;自动 retries 始终为 0。之前 browser-payment.log 的 2 条失败是新增合成文件 helper 在 ESM 中误用 require,改为 createRequire 后通过,不混入业务缺陷清单。
  • 本地环境前置:全新 context、原生在线采样 true、无 cookie、表单可见、监听 refresh=0,不安装 route mock;见 browser-environment.json。随后用例 API 均为合成 mock,不能冒充真实后端端到端或生产账号验收。Vite 中途退出原因未进一步归因;补跑把服务与测试绑定在同一受控 shell 生命周期,结束自动停止,未改全局诊断 harness。
  • 当前生产容器 f223bfb 的纯合成制单探针 PASS(runtime-synthetic.json):内置模板摘要、BIFF8/3 sheet/15 列、表头、前导零账号文本、01 行别、金额均由独立 Python 读回确认。使用独立合成密钥与资料,不访问 DB、不读真实银行数据、不用真实密钥、不调用正式导出接口、不落制单文件;不代替真实账户解密或网银验收。
  • npm run typecheck、独立 artifacts 目录 vite build、task validate、Trellis governance、process contract、git diff --check 均通过。文档注册检查通过但保留既有 1 项 warning(22 个未登记文档),构建保留既有 Browserslist 陈旧提示,不升级无关依赖。
  • 范围核对 scope-check.json:相对本轮开始只改变 4 个已跟踪文件(付款页面、两份测试、前端规约),外加当前未跟踪 task 文档;既有 AP 包及其他 tracked 改动摘要不变,index 不变。原始 input 和归档截图没有写入,不提交/推送/部署,不更新生产资料。新动作顺序尚未上线,线上仍可使用既有更多中的制单入口。
  • 桌面和移动端截图已主会话查看,确认主动作切换使用既有区域、人工路径保留;它们是合成页面,不是生产截图。本轮是主会话多角度自审及验证,不冒充独立人员复核;用户可审 technical-code.diff 和本 task。

复验命令

trellis upgrade --dry-run
trellis update --dry-run
cd server
PAYMENT_ORDER_PYTHON_BIN=<既有固定BIFF8虚拟环境解释器> npm test -- tests/unit/services/paymentOrderXls.test.js tests/unit/services/paymentBatchReadiness.test.js tests/unit/services/paymentProcessingProgress.test.js tests/unit/routes/paymentBatches.reimbursement.test.js tests/unit/routes/paymentAccounts.test.js tests/unit/routes/reimbursements.payment-batch-gate.test.js tests/unit/routes/reimbursement.submit-side-effects.test.js tests/unit/utils/workflow.test.js tests/unit/routes/workflow.return-notifications.test.js
cd ../client
npm run typecheck
./node_modules/.bin/vite build --outDir ../artifacts/qa-flow/reimbursement-payment-closeout/technical-review-20260908/build
PAYMENT_ORDER_PYTHON_BIN=<同一解释器> E2E_MODE=local E2E_BASE_URL=http://127.0.0.1:23121 ./node_modules/.bin/playwright test tests/e2e/system-action-confirmation.spec.ts --grep '付款|回单|制单|移动端固定操作区' --workers=1 --retries=0 --trace=on --reporter=list --output=<独立结果目录>

最后三条补跑使用同一 spec 与参数,仅 grep 改为“只有超级管理员职责|兼任付款复核职责|回单查询失败”,服务生命周期与测试同一 shell 管理。针对性结果不抵扣 58 条清单,也不充当 R1 所需完整候选全绿耗时。

优先级/工作包 主责 动作 结束判据 当前状态
P0 0014 付款资料解阻 执行端核对,用户批准,管理员录资料 主体已单独获批补齐并回读;管理员录真实收款银行/卡;获准检查公司付款账户可用性 实际财务页面不再因这些缺项禁用,其他 readiness 阻断如实列出 主体已补;银行资料与完整 readiness 未验,不宣称可付款
P0 三张退回单重提 majianyong,实际审批人 按退回理由逐张修改重提并实际审批,不代操作 每张有重提/审批结果或具体缺项,付款进度另算 待本人操作
P1 付款复核与 .xls 制单 wangzhiling,合格非制单复核人 财务组批,实际独立复核,填写原因下载模板制单;必要时先跑合成回归与获准运行时预检 reviewed 后成功生成同模板 .xls;未复核拒绝;无敏感日志 既有功能,真实闭环未验
P1 银行付款与回单 用户指定的银行操作人,财务 网银导入核对、银行批准执行、回单核对、系统登记 实际银行结果与系统付款状态/回单一致 尚未付款;操作人待实际指定
独立 AP 发布收口 执行端,用户批准 仅已审 AP 增量提交/推送、新候选、时效与漂移复核、单独授权部署 正确新版本及 AP 角色矩阵验收 复核通过,未提交/部署,不阻塞以上资料整理

本轮完成的准备

  • 阅读 input 中三份制单 xls 的结构;空白模板与内置模板字节相同,均为 3 sheet/15 列合同,两份已填样例表头一致。未输出真实数据、未修改原件。
  • 确认现有 reviewed 后制单功能、财务导出守卫和导出审计;相关功能文件相对生产基线 f223bfb 无 Git 差异。不把源码存在当作生产成功生成或银行导入通过。
  • 新建一个业务闭环 planning task,复用旧付款准备包/已完成制单实现/AP task,不一次拆出多份待实施任务,不启动产品开发。

汇报纪律

后续只按“0014 是否可组批/已复核/已制单/银行已付/回单已核”“三张单各自是否重提/审批”汇报。维护业务进度与部署进度两个独立判断,不以文件数、测试数或已通知代替业务结果。

暂停项

全员主体回填、新员工自动关联、工资/公积金业务扩展、银行自动付款、六个 view_all、58 条红项、阶段 B、R1 均不进入本轮实施。

2026-09-09 综合审查后的后续任务规划(待批准,不扩展本 task 实施范围)

本节按用户要求综合主会话三视角审查与外部审查建议,复用当前记录保存后续独立任务清单;不批量新建 task、不自动提交/推送、部署、执行真实恢复或修改生产配置。后续新任务只在到达队首且范围获批后创建,现有任务只做经批准的方案修订。付款主线目前由用户要求等待。

业务最新证据:用户于 2026-09-09 提供财务页面截图,0014 已创建付款批次,待付款复核 0/1、银行制单未生成、报销仍待付款。证明组批已发生,不证明负责人已收到提醒、已复核、已制单或银行已付。既有“资料待补/尚未组批”是此前历史状态,不再当作当前阻断;本节未查询生产。

规划裁决

  • 恢复验真改用受控人工最小路径,不继续叠加安装器/runner。不能把 Attempt 3 非零且底层原因未知归结为已证实工具故障,也不能认定备份损坏。
  • “数据库还原并数表”只回答该批次数据库能否恢复,不代表附件、应用启动、正式切换或完整灾备能力。恢复目标隔离、合法管理员通道、批次身份/完整性、失败诊断和精确清理不得删除。
  • 统一待办上调为跨模块业务交接任务,不再仅作为页面文案优化。既有依据为 09-05 错误解释 task implement §12、09-06 付款观察 task design §3;当前没有已批准的独立统一待办实现任务。
  • 2026-10-05 距当前 2026-09-09 为 26 天。错误基线有 673 条指纹记录、695 次调用、73 个文件;不是 673 个已确认缺陷。清单分流现在启动规划,不等恢复/seed/待办做完;实施按独立提交单元排队。
  • 不承诺“一个下午必成功”;第一次最小恢复以一个有界操作窗口为目标,遇失败收集脱敏原因并停止,不在现场加装置或自动反复尝试。

队列与验收合同

工作包 Trellis 归属 范围/交付 完成判据与停止边界
T0 两笔已审改动收口 复用 09-07-manager-ap-access-scope 与本 task 按路径拆 AP 与付款按钮/制单测试两笔,分别引用 task;在 AP 包内纠正 task.json 的“保留 CEO 财务读取”陈旧摘要;分别记录代码/发布/业务验收/等谁 不漏既有文件、不混其他 task;提交、推送须明确批准,部署另批;必要复验针对各自增量,不批量归档。不以 Git 暂存路径隔离冒充 worktree 物理隔离
T1 最小正式备份恢复验真 修订 08-23-isolated-backup-restore-drill,保留原历史 AC ARM 已获准管理员通道,读取执行时最新正式备份;一次性无宿主端口 PG16,使用现有 restore-db.sh;先形成数据库结果,再单列配对附件结果 批次身份/摘要/新鲜度核验;目标非生产且无生产数据库连接;恢复命令全程退出 0、源 migration 对照及既定关键表可读;附件需另验解包/引用/适用摘要。DB PASS 不关闭原整体 task;任一失败保留阶段与安全原因,清理仅本轮目标,不删正式归档
T2 日常发布与初始化分离 待新建独立 existing-deploy-seed-separation task;关联 09-05-existing-deploy-db-lifecycle-isolation 保留 initialize 的初始化能力;existing 不再无条件运行覆盖既有配置的 seed;确有升级数据变更时走明确版本化步骤 合成库验证 initialize 可用、existing 不改管理员既有配置、重复发布语义稳定、缺配置有明确停止/补救路径;迁移、配置版本、旧版本兼容与回滚边界明确;既有 DB 生命周期隔离回归不退步。先验证再改变默认发布路径,真实部署另批
T3 统一业务待办投影 MVP 待新建 reimbursement-payment-todo-projection task;复用 09-06 观察记录 首批仅报销退回补改、财务待组批、付款待复核、复核后财务制单/付款登记四类;既有业务状态为事实源,复用待办/首页/通知能力,不建第二套审批引擎 接收人不用口头转述即可从工作台找到本人的下一步,数量与明细一致、深链有权可达;制单人不自审、不扩 AP 读取;处理后消除陈旧待办,通知失败不丢待办且有可观测重试,重复刷新/投递不重复任务。正式通知和真人流程另批;缺失交接样本保留未验,不用管理员代验抵扣
T4a 员工业务就绪检查 待新建 employee-business-readiness task 能登录/能提交/能付款分阶段检查;解释缺项、维护责任与入口,复用现有审批解析/readiness,不另造一套判定 覆盖负责人兜底、普通员工、缺经理、缺主体/银行卡、无权限维护、smoke 排除;不在入职时强收银行资料,不自动回填真实记录,不为补资料扩大财务权限
T4b 职责与数据范围表 先做设计交付,关联 AP task;实现单独定范围 按已确认真实账号列审批/复核、全量读取、资料维护、付款执行四类能力;明确 view_all 未决项 用户逐项裁决;保留 CEO 审批路由、多角色权限并集及现有合法业务上下文。没有业务裁决不改六个 view_all,不摘角色,不以任务完成声称全部数据范围已收窄
E 错误豁免到期分流 复用 09-05-error-explainability-payment-readiness,新增经批准的后续阶段 现在按文件/调用指纹列“本期迁移/有理由延期/已失效待核销”,指定责任人与各自验收/复审日期 保留首批主链路不得豁免、新旧调用结构校验、到期失效规则;延期逐模块审查并保留原到期日与原因,不批量改日期、不删规则凑绿;不能把目录删除或无命中直接当豁免已解决

T0 是新增代码工作的前置;T1 数据库路径获成功证据后推进 T2,配对附件仍作为独立恢复缺口保留,不能用 DB PASS 自动授权 T2 生产发布。T1 若有未解释的恢复非零,不以“时间已到”越过风险继续生产部署。T3 的已发生交接证据整理、T4b 职责设计和 E 分流可与 T1 规划并行,但主会话不派实现/检查代理,不在当前脏树叠加第三笔产品改动。T2 本地实施通过后,T3/T4 按业务价值排队,不要求所有基础任务整体归档才允许业务规划前进。

T1 最小操作与保留保障

使用 ARM 现有正式归档与已有合法管理员操作路径,不把真实备份下载到开发机,不用生产容器作为恢复目标,不新增 sudoers 或修改目录权限。执行前确认资源余量、唯一批次、manifest 配对、大小/摘要、备份年龄和 PG/来源版本;创建本轮专用影子库、只挂载该批次只读数据或使用 stdin、无宿主端口,不挂生产数据卷,不启动 OA/worker、不执行迁移或 seed。

先独立确认数据库目标就绪并符合 restore-db.sh 的 shadow/名称确认门禁,执行既有恢复脚本,检查其退出码及源 migration/关键表可读性。表计数仅为一致性线索,不能代替完整恢复退出状态或凭空声明与生产逐表一致。若只完成数据库,结果明确写 DB_RESTORE_PASS、STORAGE_NOT_TESTED、APP_NOT_TESTED;附件完成后才补相应状态。原任务完整验收不被这项缩小后的实验替代。

操作保留简短脱敏回执:批次指纹、开始结束时间、数据库结果、附件结果、失败阶段/可安全提取的原因、清理结果。不强制新增 RTO 分段框架;不删除原正式演练要求,相关指标未测就保留未测。原始敏感错误仅留受控位置按既有隐私规则处理,清理前形成安全诊断,避免重演 Attempt 3 丢失原因。精确清理本轮一次性容器/卷/临时数据并回查,不清理旧镜像备份、正式归档或未知对象。

T3 输入边界

目前只确认资料已补且财务成功组批,并观察到后续操作需通过聊天指引;尚未实际观察 majianyong 是否从现有待办/消息找到复核、复核后财务是否收到交接。三张退回单的“本人未处理”不能单独证明没有发通知。规划阶段分别核对业务状态投影、接收人解析、通知创建/投递和消息深链,不把四类不同故障预先合并成同一个已证实代码缺陷。已发生样本先定合同,后续样本用于补验,不伪造、不中断当前真人流程抓证据。

E 初步模块分流与建议日期(待批准,不是已承诺全部迁移)

  • 优先审查名单:auth/users/employees(登录与员工资料),workflow 路由及解析(审批人/退回),paymentAccounts/AP(付款资料和权限),todos/notifications/portal(交接可解释性),invoicePool(报销票据主链路)。按具体仍为 legacy 的调用选高频阻断,不重复迁移已覆盖的报销/付款主链路,也不假设这些模块的全部调用都必须本期完成。
  • 次优先核对:采购/差旅、部门与主数据、预算/项目、合同;根据当前真人使用和变更范围决定迁移或有理由延期,不能仅因调用数大就统一延期。
  • 其余模块:逐文件列剩余指纹、业务影响、现有兜底、责任人、拟新日期与理由后交审;低频或暂未使用需有依据,不把工资/绩效/资产等默认判定无人使用。当前仅形成模块初分,没有修改任何豁免。
  • 建议 2026-09-11 前完成 73 文件全量处置清单;09-18 完成首批高频调用的迁移与定向验证;09-25 复审剩余容量和延期理由;09-30 前完成逐模块延期裁决;10-02 做一次剩余到期项检查。不得等到 10-05 才改日期。
  • 当前门禁以 UTC 日期判断 expiresOn <= today 即失效,因此 2026-10-05 00:00 UTC(北京时间 08:00)即触发该日期的到期项,不按北京时间当天午夜前仍有效来安排。全部 673 条同日到期属于计划风险,不等于当天线上功能会自动停用。

明确不做

本轮不执行提交/推送/恢复/部署,不改变任何账号或真实银行资料,不自动发送通知或审批/付款;不增加通用 workflow 引擎、全站重设计、微服务、大文件专项重构、全员主体回填;58 条红项、合同阶段 B、R1 仍暂停。独立任务规划不改变当前付款 task 的业务完成判据,也不授权把其余改动顺带提交。

2026-09-09 综合规划批准后的首批本地执行

用户回复“开始实施”,综合规划的本地工作进入执行。审批、真实付款仍按用户要求等待;此次未获得提交/推送、ARM真实恢复或部署的单独授权,不将开始实施扩大解释为这些操作。

  • T0:AP和付款建立两个独立detached交审副本,另一个ops-preparation副本仅维护原恢复task及错误解释task的准备文档。不是新开第三笔产品开发;原工作树保留,未重置或覆盖已有改动。
  • 付款副本仅包含4个已审tracked文件和本task;未包含AP撤权差异。后端9文件158/158通过,使用已有固定BIFF8环境,无安装新依赖。浏览器未重新运行,不把此前13+3分轮证据改成新的同轮通过。
  • E:673指纹/695调用/73文件逐项对上当前源码,原expiry和门禁不改;全量清单在独立准备副本的原错误解释task implement §13。16文件优先审查、25文件业务影响复核、32文件逐模块审查延期理由;未逐调用完成业务裁决,未批准任何延期,也未迁移新原因码。
  • T1:独立准备副本内修订原恢复task的最小人工操作阶段,复用3份既有恢复/校验脚本,保留正式演练AC;没有创建新runner、修改sudoers、连接远端或读取真实备份。
  • T2/T3/T4未开新的代码任务,既有58条、阶段B、R1不动。原因码分支迁移尚未开始,不能以“清单完成”宣布技术债清零。
代码 发布 业务验收 等谁
付款按钮/制单验证已审,独立副本已隔离复验 未提交/推送/部署,线上仍是既有更多入口 用户截图确认0014已建批;待复核0/1、制单未生成、未确认付款 业务按用户要求等待;技术先等两笔提交的明确授权

证据根为原主工作区 artifacts/qa-flow/project-roadmap-execution-20260909/。提交建议标题:fix: 优先引导下载银行制单(09-08-reimbursement-payment-closeout);不自动提交或把其他准备文档混进这一笔。

2026-09-09 提交与推送授权

用户对“AP 与付款修复分两笔提交并推送,不部署、不执行真实恢复、不混入后续准备文档”明确回复“是”。本次只提交本 task 对应已隔离交审文件及当前授权记录;原恢复 task、错误豁免后续阶段和另外两个未跟踪 task 不进入这两笔。实际提交 SHA 与远端结果以 Git 回执为准,不提前宣称 push 成功;生产仍未部署,业务验收状态不随提交改变。

2026-09-09 后续工作执行顺序(按已确认选票流程更新规划)

本节为最新规划,旧阶段结果保留;已确认付款独立复核和制单下载,不确认实际付款。当前只更新已有 task 需求与设计,没有创建 task、改代码、运行产品测试或部署。

  • 收口用户取向:报销制单中文名;首次/再次不强制手填理由但保留确认与审计;处理进度右移;退回单可以删除后新建;验证由执行端承担。
  • 将删除阶段归入 09-04-reimbursement-state-gap-finance-view,将“选票自动生成明细并关联”归入 08-29-reimbursement-expense-policy-invoice-guard,付款优化留本 task;对应 PRD/design/implement 同步。明确替换旧手工关联方案,不新建 task。
  • 综合方案确认后,先为第一批补齐存储/绑定接口设计与隔离端到端夹具,复现两个原始阻断;评估是否涉及迁移,不默认免迁移。
  • 第一批在干净副本实施:退回单删除留痕与发票占用释放、选票自动生成明细并关联及已有明细直接加票;验证所有旧状态的拒绝边界,核实真实腾讯 OCR,异常不交给员工发现。
  • 并行准备部署后专用合成测试条件;缺失项由执行端列出具体配置和授权请求,不调用真人单据或凭据。
  • 第一批完成真实后端角色链、桌面/窄屏验证及只读交审,取得明确提交推送授权后收口;不把另一批产品变更叠入同一脏树。
  • 第二批按已确认付款方案实施中文名、独立下载原因合同和布局;完成文件内容/审计/权限/布局回归及本批交审。若第一批遇真正外部阻塞,第二批可在独立副本提前完成,不扩大范围。
  • 每批冻结候选并提出发布方案,附可执行的部署后自动检查;部署另批,上线后由执行端运行验证、报告失败与回滚建议,必要回滚按具体授权执行。
  • 功能交付后回到统一待办投影;同期维护原错误豁免截止日队列,不批量归档或延期。

首个实施动作明确为“用空报销合成数据复现发票顺序问题,并核查退回删除事务/材料关系”,不是继续生产清理或让 majianyong 再尝试一次。主工作树在旧基线且有治理差异,执行副本须从最新 origin/main 核验建立,按任务登记分批文件清单与测试命令。