From e57ed0533b2a84424ef230137d9eeed05c7a5cd3 Mon Sep 17 00:00:00 2001 From: shunli Date: Fri, 25 Sep 2026 19:45:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E5=A1=ABe5685f1=E5=85=AC=E7=BD=91?= =?UTF-8?q?=E5=90=88=E6=88=90=E9=AA=8C=E6=94=B6=E5=AE=A1=E8=AE=A1=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=20[08-29-reimbursement-expense-policy-invoice-guard]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 从孤儿 worktree(artifacts/isolated-worktrees/20260909-invoice-first)合并 回填 2026-09-09 部署 e5685f1 后从未提交的公网验收记录: - 部署执行计划与 deploy-existing.sh 中途 exit=255 异常的只读排查(构建/ 迁移/健康检查实际均已完成,255 原因未定位但不代表发布未发生)。 - 公网止于草稿的合成验收:真实腾讯 OCR 队列、选票、分类编辑、跨端持久化 全链路通过;清理工具认证问题(缺 x-device-fingerprint)排查与修正。 - 2026-09-10 最终 PASS:SCOPED_CLEANUP_PASS,测试数据精确清理确认。 无产品代码改动、无生产操作;仅补齐审计记录,使任务文档反映已发生的部署 与验收历史。 Co-Authored-By: Claude Sonnet 5 --- .../implement.md | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/.trellis/tasks/08-29-reimbursement-expense-policy-invoice-guard/implement.md b/.trellis/tasks/08-29-reimbursement-expense-policy-invoice-guard/implement.md index 14d803de..8211a247 100644 --- a/.trellis/tasks/08-29-reimbursement-expense-policy-invoice-guard/implement.md +++ b/.trellis/tasks/08-29-reimbursement-expense-policy-invoice-guard/implement.md @@ -1,6 +1,59 @@ # 实施清单:报销费用口径与票据明细门禁 -## 当前接续点:只读复核与发布候选准备 +## 当前接续点:已部署,公网草稿闭环验证完成 + +### 2026-09-10 公网草稿最终 PASS(本节替代前次样票阻塞状态) + +- 用户再次批准继续验证。未修改产品代码、权限、审批定义或生产配置,运行版本仍 e5685f1;本轮仅维护受控验收脚本和记录,无再次部署。 +- 生成新版全合成 PDF:采用表格化票面布局,明确标注不可报销/支付,无真实交易/账号/票据内容。每轮独立合成票号,不修改真实样票、不绕查重。先走部署环境已有 provider 检查,再经线上 UI 上传走真实队列及腾讯;最终样本摘要与 probe manifest、生产持久化发票逐一一致。 +- 最终命令:`node artifacts/qa-flow/20260909-release-e5685f1/probe-synthetic.cjs && node artifacts/qa-flow/20260909-release-e5685f1/verify-live-draft.cjs`,exit=0,证据 live-draft-result-v6.json=PASS_DRAFT_ONLY。专用 employee 真实浏览器登录1次 HTTP200,上传、OCR available、用户点击添加前零明细、一票一明细、批量分类、编辑说明、桌面刷新持久化均通过;同单转手机路径修改说明、保存刷新通过;真实 precheck POST 正常返回。submitRequests=0、blockedWrites=0,不是公网审批验收。 +- 只读最终回验:6 张本阶段合成票均 archived/manual 且无单据/明细/差旅绑定,标记测试草稿0,测试时间窗口内活动会话0。最后样票的哈希、合计1.00、税额0.00、日期2026-09-10、provider=tencent 均匹配;原始合成文件及OCR审计资料按正常保留机制留存,不能宣称物理删除。证据 live-draft-final-readback.json。 +- 中间失败保留而不抹掉:v2 桌面通过但拦截10次 precheck;核实该 POST 是只读预检查后放行,仅禁止提交等范围外写入。v3 分类后马上编辑的持久化断言失败,测试改为等待已分类视图并回读类型后再编辑,后续通过;这不证明所有快速点击竞态均无风险。v4/v5 手机说明定位超时;本地最小 HTML 复现 `getByLabel('说明', exact=true)` 对已有内容的 textarea 命中0,按 label 的 span + textarea 定位命中1,v6 补验通过,无产品修补。 +- 清理工具根因补验:Fastify 合成 DELETE 带 application/json 却没有 body,稳定返回400/FST_ERR_CTP_EMPTY_JSON_BODY;不发送多余 Content-Type 返回200。修正后各轮均经业务API删除草稿及归档合成票,不再直接写库。登录必须带设备指纹;logout 必须使用浏览器Cookie上下文,不把无Cookie返回200写成会话已撤销;最终数据库只读计数提供撤销证据。 +- 现已补上“公网真实腾讯→队列→选票→可编辑草稿”的同环境证据,不再沿用先前只能分层推断的缺口。边界仍是公网不提交、不审批、不付款;提交及三段审批沿既有隔离环境证据,不能扩成真实用户/全票种/整站全面验收。 +- 主线本阶段完成;下一阶段按已有顺序进入 09-04 退回删除修复,再做 09-08 付款文件名/下载理由/进度布局,复用原任务、不叠改当前产品。部署/验收记录与新增经验尚未提交,不自动归档整个历史任务。 + +### 2026-09-10 公网止于草稿的实测结果 + +- 用户批准公网只验上传/OCR/选票/分类编辑/保存刷新,不提交审批。定位到既有仓库外 live-smoke.env(0600),仅在进程内读取 employee 凭据;此前“常规 env 无配置”不等于专用凭据不存在。生产只读前置确认唯一 active、未锁定、无需改密且角色精确 employee 的 smoke 账号,未改账号或生产配置。 +- 执行 `node artifacts/qa-flow/20260909-release-e5685f1/verify-live-draft.cjs`:真实浏览器登录一次 HTTP 200,创建标记草稿,上传一份 Chromium 生成的中文 PDF,显式标注“合成测试样张、不可报销、无支付效力”。未使用用户真实票据、未改 provider 或注入 OCR 结果。上传创建成功,轮询终态 ocr_failed,结果 STOPPED/SYNTHETIC_OCR_NOT_AVAILABLE。 +- 这证明登录、草稿创建、上传及识别失败终态路径;不能证明腾讯能识别该合成版式,不据此认定生产 OCR 配置坏了,也不记自动建明细/分类/编辑刷新通过。submitRequests=0;浏览器安全拦截了 6 个未列入本次写入白名单的请求,具体类型未记录,不谎称全部请求均正常。未产生审批任务或付款。 +- 验收脚本自动清理未成功,后续仅清理用途的 API 登录也未通过;已核实该清理请求缺少生产要求的 x-device-fingerprint,不能记为账号密码失败,不继续重试登录。原脚本 loggedOut=true 仅表示无 Cookie logout 返回成功,不证明会话撤销,该结论撤回。 +- 随后只读确认恰有本次前缀标记草稿 1 张(draft、明细0)与合成文件名票据1张(ocr_failed、未绑定)。按已获准清理范围执行专用 Serializable 事务:锁单/票后重验唯一数量、smoke精确角色、owner=submitter、标记、状态、无明细及无绑定;只删除该草稿、归档该失败合成票、撤销按该次建单/上传时间窗口唯一定位的测试会话。任一条件不符全事务拒绝。 +- 最终 SCOPED_CLEANUP_PASS:草稿删除回读0、合成票归档、测试会话撤销。合成 PDF 与 OCR/审计记录按既有保留机制留存,不声称物理文件已删除。未清理其他账号、单据、发票或会话;未做真实业务写入。 +- 证据在既有发布目录:live-draft-result.json 保留原失败,live-draft-cleanup.json 保留清理API失败,live-draft-cleanup-final.json 记录最终定点清理。仅测试工具与本记录变化,无产品改动、未再部署。 +- 后续缺口:需要可被腾讯识别且不会占用真实报销票号的专用测试样票,或另行批准真实样票在确认无业务占用/查重风险后的受控用途;不能以随意排版的合成 PDF 冒充已验证发票样本。先修正测试器认证/会话清理与失败诊断,再安排下一次受控验证,不交给用户手工测试,不反复消耗账号登录。 + +### 公网合成业务验收前置(用户已授权,停在写入前) + +- 用户已明确授权专用测试账号的合成报销上传/OCR/选票/分类编辑/提交审批及测试数据清理;不包含真实报销、真实付款、修改真人账号或生产审批路由。 +- 本轮只读查询运行容器的账号状态及当前报销工作流,事务/连接强制 read only,仅回传测试别名、角色与状态。四个既有 smoke 候选:两个 active employee+manager(其中一个 must_change_password=true),一个 active employee,一个 archived employee+finance;启用 smoke 角色集合只有 employee、manager,没有 ceo。不得将已归档财务视为可直接登录,也不以管理员替代财务验收。 +- 当前活动报销工作流 assignee_rule 为 role=ceo,不是直接经理步骤。即使测试员工有测试直接经理,也不能据此保证提交不会派给真人;目前缺少仅限本次测试的审批隔离路径。不能为了跑通而给测试账号增加 ceo(会影响全局角色路由)、修改活动工作流或擅自启用财务。 +- 当前执行进程、常规本地 env 与生产容器未配置 LIVE_SMOKE 凭据键。这不证明仓库外凭据不存在,也未尝试密码、重置账号或复制生产身份。获准的此前真实样票只做过 provider 检查,不能直接占用为合成报销材料或绕过真实票据查重。 +- 本次 loginAttempts=0、businessMutationCount=0、workflowSubmitCount=0,无新建单据/票据/会话需清理;没有尝试完整公网闭环,不能记 PASS。已部署健康检查结论不受此影响。 +- 建议调整验收边界:公网用获准专用凭据及腾讯可识别的测试样票验到可编辑草稿,不提交进入真人待办;提交审批继续沿已通过的隔离数据库/真实认证/队列/浏览器三段审批证据。若要求公网全链独立通过,先另审仅测试数据的审批隔离方案和财务启停窗口,不在本轮临时改生产规则。 + +### e5685f1 已部署与后置检查补齐(2026-09-09) + +- 生产实际运行 `e5685f18b233901cffc9a12c9c277cc5c642725c`。原 deploy-existing 调用最终 exit=255,日志仅回传到 build-init,不能改写为原脚本 exit=0;255 原因尚未定位,不凭退出码断言产品失败或发布完全没发生。 +- 中断后只读核实已完成构建、切换与迁移,未盲目重发整次部署或回滚。运行源码摘要与候选一致;init 日志顺序为 validate_config → migrate → check_required_configuration,INIT_PASS/existing,无 seed 阶段。 +- 单独补跑生产身份/迁移后置预检 PASS,pending=none;数据库只读校验费用类型列 nullable,金额/日期仍 NOT NULL,本迁移成功记录一条、当时 null 分类明细为 0。该计数会随用户操作变化,不构成以后随时切旧镜像安全的保证。 +- 单独执行既有 external-deps smoke 与 runtime smoke 均 exit=0;公网 ready/home/主脚本 HTTP 200,buildSha=e5685f18b233;既有公网 bundle-copy 扫描 106 项、focused=2、buildMarker PASS、findings=0。 +- 受控身份 probe/refresh 均 PASS,最终回读 backupContractBuildMatches=true。本次属于应用已部署后补齐后置检查,不把原 exit=255 回执覆盖成成功。未新增产品修复、未执行数据库恢复。 +- 发布前正式备份完成于 15:33:41 UTC,属于 b87cc55,manifest/数据库/附件大小与摘要匹配;旧 b87cc55 镜像保存为独立文件,14 层摘要通过,未演练 load/恢复。刷新备份合同不等于已产出 e5685f1 新版本备份;旧备份及回滚制品保留。发布后可用空间 43.55 GiB,无追加清理。 +- 公网 Chromium 打开站点后进入登录页,登录内容可见;未登录业务账号、未创建真实或合成报销。两条控制台资源错误均为 favicon.ico 404,本任务未改图标,记录为非阻断观察,不擅自扩修。首次 CLI 默认 Chrome 缺失,改用已安装 Chromium 后通过;首次 /ready 检查误读顶层 buildSha,按既有 data 包装修正检查后通过,均非产品修复。 +- 证据入口仍为 `artifacts/qa-flow/20260909-release-e5685f1`:原 deployment-result.json、备份与独立制品回执、recovery-smoke.json、post-preflight-result.json、final-postcheck-result.json、public-check.json、浏览器快照。原日志受控留存,不输出原始环境或票据。 +- 当前结论:已部署、发布健康及结构检查完成;不是公网带账号的报销完整业务验收。下一步由执行端取得专用测试账号及线上合成单据写入/清理的明确授权后,验证上传→识别→选票→分类编辑→提交审批,不让真实员工代测,不以此授权真实付款。退回删除、付款体验两个 task 仍未实施,整个 task 保持 in_progress。 + +### e5685f1 发布执行计划(2026-09-09,用户明确授权部署) + +- 固定已推送候选 `e5685f18b233901cffc9a12c9c277cc5c642725c`;使用干净发布 clone,不将本记录或其他未提交内容同步生产。证据目录 `artifacts/qa-flow/20260909-release-e5685f1`。 +- 只读前置已通过:运行版本 b87cc55、最低配置 39/3/1;待迁移仅 `20260909210000_reimbursement_draft_expense_type`;磁盘可用 45.52 GiB。预检 rollbackWindow=OPEN 仅是 terminated 状态统计,不是数据兼容或恢复演练结论。 +- 发布前保存当前 b87cc55 独立镜像并核归档层摘要,触发既有正式备份服务,再核同运行版本的 manifest/数据库/附件完整性。失败停止,不绕权限、不清理旧制品。 +- 沿 deploy-existing.sh:existing、SYNC_ENV=0,预检待迁移显式匹配,执行本次 DROP NOT NULL,不运行 seed、不重建数据库容器;随后核迁移无 pending、版本、ready、依赖/runtime smoke、公网资源及合同 refresh。 +- 此次仍无完整候选门禁通过证据,附件/应用恢复未演练;分层腾讯与本地流程证据不等于公网完整报销验收。用户已授权准备并部署,不记录为完整门禁通过。 +- 回退目标为 b87cc55,不是此前 f223bfb。迁移后若未生成 null 分类,旧应用兼容仍需核验;若存在 null,不自动切旧镜像、不逆迁移、不猜分类回填。失败先确定应用切换和数据库阶段,保全证据并报告;数据库恢复及可能丢失恢复点后数据不自动执行。 +- 上线自动化由执行端承担;不处理真实报销、不真实付款。本次未额外授权线上合成单据写入,先做既有发布健康/smoke与只读版本/结构检查,不能以此冒称已走通公网报销全链路。 ### 用户复核与提交授权(2026-09-09)