回填5d8cdf12部署与验收账号隔离裁决记录 [09-04-reimbursement-state-gap-finance-view]

从孤儿 worktree(artifacts/isolated-worktrees/20260910-reimbursement-payment-integration)
合并回填 2026-09-11 从未提交的真实执行记录:

- 候选 5d8cdf12 的生产预检、发布与公网部分验收(员工 smoke 双端登录、
  零明细选票入口、合成草稿创建与清理)全过程记录。
- 验收测试账号只读盘点:财务 smoke 已归档、CEO smoke 凭据 0 条匹配、
  一个经理 smoke 需改密;更关键的是角色任务/通知无测试隔离——付款复核
  按当前事实投影会指向非 smoke 的真人 CEO,通知总开关和企微绑定均已
  开启,存在真实外发风险。
- 提出 A(推荐,隔离环境验收+保留公网员工侧验收)/B(先设计完整合成
  隔离方案再做生产公网全链)两条路径,待用户选择,未擅自降级验收口径。

未同步更新 task.json 的 commit/notes 字段——origin/main 该字段已推进到
2026-09-12 财务本人报销 CEO 审批的更新内容,回填旧字段会造成状态倒退。

无产品代码改动、无账号/角色/生产写入。

Co-Authored-By: Claude Sonnet 5 <[email protected]>
这个提交包含在:
2026-09-25 19:55:39 +08:00
共同撰写人 Claude Sonnet 5
父节点 c81ed9ca69
当前提交 7abb410be5
共修改 2 个文件,包含 79 行新增和 0 行删除
@@ -24,6 +24,38 @@
根因:共享detail-workspace-grid使用比例列,而报销壳另有max-w-7xl,付款壳无同一上限。新增局部共享detail-workspace-grid--payment类供两处使用,lg起固定320px侧栏,主列minmax(0,1fr),保持各自正文宽度和手机规则。frontend-design不可用,仅复用现有表格、边框和按钮样式,不创建新视觉体系。已关联票据采用响应式表格,窄屏按行紧凑排列;未关联票据保留原纠错控件与唯一锚点。姓名和号码允许换行,预览、移除及OCR告警按原capabilities保留。
## 2026-09-11 公网合成验收的账号与路由隔离裁决(待选择,不实施生产修改)
用户批准继续只读准备测试账号最小修复清单,不代表批准解归档、改密、创建CEO账号、调整角色/所属主体/银行卡或全局关闭通知。当前生产保持5d8cdf12。本轮直接归本任务的交付验收前置;根工作区09-07-e2e-auth-preconditions是本地mock/认证启动合同,不把同名“认证前置”误当生产账号维护授权,不新建细碎任务。
### 最新事实与最小处理清单
来源:artifacts/qa-flow/20260911-release-5d8cdf12/synthetic-isolation-readonly.json。一次READ ONLY事务、8条账号元数据;不输出姓名、邮箱、手机号或银行值,不读数据库密码哈希、不解密银行卡、不尝试登录。本地受控凭据文件只用于按真实登录规则(邮箱或手机号)定位;“凭据存在”不证明密码正确。
| 对象 | 实际状态 | 最小处理结论(尚未授权写入) |
| --- | --- | --- |
| 配置中的员工smoke | 活动、无需改密;经理为配置中的经理smoke;无主体/银行资料,通知开启且有企微绑定 | 登录无需修复;不能为了跑付款直接绑定真实公司付款资料。现有绑定不能被“smoke”名称推定为安全通知接收端 |
| 配置中的经理smoke | 活动、必须改密、无上级;通知开启、无企微绑定 | 如日后选生产测试,先批准正常改密/凭据更新,不直接清must_change_password绕过流程;密码未核验 |
| 另一经理smoke | 活动、无需改密,但无已确认可用凭据;上级为非smoke | 不是可随手替换的测试经理,不借用或改其上级关系;不自动重置密码 |
| 配置中的财务smoke | status=archived且archived_at非空,不只是“未启用” | 不直接解归档;先确认历史保留目的。隔离验收可使用新合成财务身份,不恢复生产归档账号 |
| 配置中的CEO | 登录规则精确匹配0条;生产CEO角色由非smoke持有 | 不猜人、不用真人、不把经理改成CEO;新测试CEO也不能单独解决路由隔离 |
| 管理员凭据 | 精确匹配非smoke | 排除出合成验收,不使用其通配权限顶替业务角色 |
### 账号修好仍不成立的隔离边界
- workflow role分派保留assigneeRole;notifications/index.js按角色取所有活动账号,没有按测试身份划分。当前ceo/finance均有活动非smoke接收人。仅禁用测试账号通知不能阻止这些真人的站内任务或通知。
- paymentBatches.js:resolvePaymentReviewRecipientIds按工号/id排序,优先选CEO、再经理。按当前只读事实投影将选到非smoke CEO;这不是创建真实批次的实测,也不能通过给测试CEO换排序靠前的工号来规避隔离设计。
- IM_NOTIFIER_ENABLED=true;非smoke CEO/财务的推送开关和企微绑定存在。实际渠道发送未测试,不声称已经通知过真人;当前存在外发风险,不能继续完整公网提交/组批。
- 全部4个smoke缺所属主体、加密收款账号和建行关联。银行路径读取快照会解密,不能靠假定“可以不解密”或选非bank渠道来冒充中文银行制单验收。也不能把测试账号绑定真实付款账户后称其与真实财务隔离。
### 推荐路径与验收边界(需要用户选择)
A(推荐):生产不改账号/角色/归档或通知;保留已经完成的公网员工双端门户和合成草稿验收,完整角色/审批/制单链在与5d8cdf12一致的隔离环境,用专用合成账号、银行夹具和禁外发配置执行,复用已有隔离验证装置,不另造管理系统。隔离通过不能标为完整公网链通过;如这是验收口径调整,必须明确接受,不能由执行端自动降级。优先核现有同树证据是否已满足,输入未变不无目的重跑。生产恢复副本含真实数据时,访问和脱敏另批,不默认复制。
B:坚持全部流程在生产公网做,需要先批准一项有边界的合成业务隔离方案,覆盖角色任务可见性、指定测试复核人、站内通知/外发、付款主体及银行制单隔离和清理,再谈账号修复。这是实质范围变化,不是几行数据回填;当前没有设计实现或测试证据,不承诺“补几个账号就能跑完”。
不建议:全局关通知、解归档财务测试账号、借真人CEO审批、构造工号优先抢单、给smoke加通配权限、直接修改生产审批定义。这些做法会影响真实职责或绕过被验证的业务规则。下一步先选A/B;未选择前不新增生产写入、不部署新代码。
## 2026-09-11 下一步与侧栏一致性方案(已批准本地实施)
本轮只读核对已发布候选,未查询生产。ReimbursementDetailPage 的 approved 分支无条件显示“等待财务组建付款批次”,其主动作只再检查 payment.batch.manage;同一页面 ProcessingProgress 已消费服务端按真实批次状态构造的阶段。修复必须连接这两处投影,不能只把错误文字换成另一句固定文案。
@@ -157,6 +157,53 @@ Trellis治理、process-contract baseline、原因码strict及git diff --check
未提交、未推送、未部署、未做生产写入;制单备注仍在另一独立副本。本轮不归档整个task。下一步按路径汇总本UI增量与独立备注增量的候选复核输入,经明确授权后再分别提交/推送及准备发布,不覆盖原integration任务历史。
## 2026-09-11 专用账号只读盘点与隔离决策(最新,待选择)
本轮只读核清专用账号后,确认不是单纯登录问题:财务smoke已经归档(status及archived_at均确认),CEO凭据精确匹配0条;另有一个经理smoke但其上级是非smoke,不能盲目借用。角色通知会覆盖活动真人CEO/财务,付款复核按现有优先CEO规则投影指向非smoke;通知总开关、相关真人推送开关及企微绑定存在。所有smoke缺主体和收款配置。没有登录尝试、改密/解归档/改角色、解密或业务写入。
最小修复清单与A/B验收路径已写入本任务design的最新节,脱敏回执保存于既有release目录synthetic-isolation-readonly.json。推荐生产账号保持不变,复用同候选隔离环境完成全链,将公网已测范围与隔离结果分开;这属于验收口径选择,待用户确认,不擅自降级。若坚持生产公网全链,必须先设计测试任务/通知/复核/付款数据隔离,而不是先启用账号。既有09-07本地认证夹具任务不承接未经批准的生产账号操作。
当前5d8cdf12已部署、员工公网部分验收通过、合成草稿已清理的事实不变;完整公网付款链仍未验收,任务不归档。下一步等待验收路径选择,不继续反复尝试同一组不适用账号,不让员工代测。
## 2026-09-11 新候选已部署与公网部分验收(已完成阶段)
用户已明确批准5d8cdf12发布例外、部署及有限合成验收/清理,不含真实单据、实际付款或删除回滚制品。使用独立干净main克隆,候选树精确匹配dd2e96e0,无来源override。首次因预检超过15分钟在本地停止、尚未部署;重新只读刷新后通过正式13项聚合门及迁移预检,再以existing模式完成构建/init/应用切换、部署后迁移核验、公网版本/资源检查和备份合同刷新。初始化seed未运行。部署于北京时间09-11 20:58完成,生产与公网短版本5d8cdf12b456一致,68条迁移无pending;数据库未重启。最终磁盘33.6%/39.10GiB可用,原fe025e65独立镜像制品仍在且摘要匹配,未清理镜像/备份。
公网部分验收实际通过:唯一安全普通员工smoke账号真实浏览器登录一次,PC与手机均实际请求门户且不展示财务卡;创建一张本次标识的空合成草稿,双端在零明细时可打开“我的发票”。未上传发票、未调用腾讯OCR、未提交/审批/组批/付款;合成草稿已删除,HTTP404及另一次数据库只读回读确认记录为0且删除审计保留。编号消费和审计不回滚。浏览器与上下文均关闭,无待清理业务对象。
完整付款链未验收:配置中的管理员不是smoke,未使用;经理smoke必须改密,财务smoke非活动,CEO测试凭据未匹配唯一账号,员工smoke缺主体。这是测试身份前置缺口,不推断真实员工账号故障。未尝试这些账号登录,未绕过密码或角色校验、未启用账号/重置密码/修改主体,未使用真人兜底。下一步沿既有认证前置任务只读明确专用测试身份修复清单,生产账号变更另批后再跑完整链;当前不宣布全员验收完成,不让员工代测。
回执见artifacts/qa-flow/20260911-release-5d8cdf12:deployment-receipt.json、postcheck.json、employee-acceptance.json、synthetic-role-preconditions.json、cleanup-readback.json。此前预检和交审快照保留,不把新部署状态写回冻结manifest。完整门禁、正式附件/应用恢复等例外继续保留;本轮没有触发新备份,合同已更新不等于已有新版本恢复点。状态补记留在候选之外,未新增提交/推送。
## 2026-09-11 新候选生产只读预检(发布前历史)
已按用户确认执行下一步,只读连接生产,未部署/清理/写业务数据。2026-09-11 20:36 北京时间回读:生产 fe025e65,检查期间运行身份和环境摘要一致;候选与生产 68 条迁移全部一致,无 pending/未知/异常/checksum 差异,查询使用 READ ONLY 事务。数据库、附件、回滚目录所在文件系统使用率 32.1%,可用 40.03GiB。
最新同源本地备份于北京时间 09-11 02:30:49 完成,观测时18.09小时;manifest及DB/附件包尺寸摘要匹配。当前生产独立镜像制品1,119,357,440字节、尺寸摘要匹配,仍同机;没有执行恢复或docker load。独立worker profile未创建,主server配置JOBS_ENABLED=true/OCR_PROVIDER=tencent,不据此宣称腾讯调用成功。
证据与审批材料:artifacts/qa-flow/20260911-preflight-5d8cdf12/readonly-receipt.json、release-request.md。复用已审只读探针,迁移输入来自候选Git对象,不运行旧候选入口、不覆盖旧证据。未重跑本地测试,未修改冻结候选或追加提交。
下一步必须单独批准绑定5d8cdf12的发布例外、部署及有限合成验收写入范围。完整候选门禁、正式附件/应用恢复、真实OCR/公网角色链与构建峰值未因此通过;部署时还须新鲜核验并执行正式门禁,不直接从脏工作副本部署。只操作获准合成对象、保留审计,不实际付款、不发送外部通知、不删回滚制品、不让员工代测。
## 2026-09-11 独立复核接收与预检准备(历史时点,未部署)
用户回传新候选 5d8cdf12/树 dd2e96e0 的独立只读复核:放行、无阻断。覆盖输入/拆分、双端身份 key/enabled、signal 到 fetch 及 401 重放;未审按钮/窄屏/附件定位具体内容与测试断言,未运行测试、未复现浏览器、未验证生产或服务端。接收外部结论,不扩写为全量独立验收或已证实生产泄露。
F1 已更正交接 README 的未提交/未推送过期描述,并区分当前状态与 commit-plan/manifest 历史快照;F2 复用输入未变测试、不新增计数的措辞保留。独立结论存入 postpush-cancellation-commit-preparation/independent-review.json,原冻结包及历史 NO_GO 不变。两任务元数据同步最新 commit/状态,本节及元数据是候选外未提交补记,不新增代码提交。
下一步准备绑定 5d8cdf12 的只读预检,按下方既有发布验收清单核生产版本/镜像、迁移 checksum、磁盘峰值余量、最新同源备份完整性与独立回滚制品。旧 run-precheck.mjs 固定先前 push-receipt/输出目录且要求整个工作副本干净,不能直接重跑、覆盖旧证据或清理脏文件;执行时从冻结候选提取输入,另存新回执,复用已审只读探针。权限不足停在边界,不绕权限。
本轮仅更正文档和准备预检,未连接生产;所有历史磁盘数字均不能作当前容量。此次有限范围复核不解除完整门禁、附件/应用级恢复及公网验收缺口;部署例外必须重新绑定新候选获批。原已批准的提交推送已经完成,不再重复索取;部署、真实数据及公网合成写入仍不在该授权中。
## 2026-09-11 补充修订提交推送回执(历史时点,候选外补记)
用户明确批准两笔提交并推送,仅供独立复核,暂不部署。详情修正 9e41f107(9 文件)与门户修正 5d8cdf12(10 文件,共享规约按内容拆分)已按顺序提交;最终候选 5d8cdf12b45685b2bd5d8a36a0cea376cac366f3,树 dd2e96e0506885640eb462499e230926800cd832,与 postpush-cancellation 冻结树完全一致。远端 main 和本地 origin/main 回读一致,待推送 0;7 个恢复/付款准备脏文件未纳入、未改动。
本轮只做输入摘要核对、提交和推送,未重跑未变测试,复用联合 66/66 页面、构建与真实隔离链结果及按输入核对的 135 单测。原 manifest、NO_GO 与历史证据不改写。提交准备目录 postpush-cancellation-commit-preparation 保存计划、两笔补丁、commit-receipt.json 和 push-receipt.json;本节是候选之外的未提交状态补记,不另建任务或追加第三笔提交。
独立复核仍 PENDING_INLINE,不能把本轮提交或主会话验证当作独立通过。下一步将新候选交独立只读复核;通过后刷新执行时生产预检,再按候选专属批准部署并由执行端完成公网合成验收。本轮未连接生产、未部署、未让员工代测;不沿用历史生产观测冒充当前现状。
## 2026-09-11 迟到 401 复核接续(最新,门户取消修正本地通过)
主会话只读核对 dcde0d44 的 33 源文件、3 补丁重放及历史证据后,双端合成浏览器补查甲→乙→甲:甲旧请求迟到 401 后按乙会话重试,结果进入甲缓存,甲再次登录等待新响应时显示乙待办。该包 NO_GO;独立复核仍 PENDING_INLINE,原 6/62/真实隔离通过记录不改写。回执在 postpush-identity/readonly-review.md。