diff --git a/.trellis/tasks/08-23-isolated-backup-restore-drill/implement.md b/.trellis/tasks/08-23-isolated-backup-restore-drill/implement.md index 6a07eb40..506f15da 100644 --- a/.trellis/tasks/08-23-isolated-backup-restore-drill/implement.md +++ b/.trellis/tasks/08-23-isolated-backup-restore-drill/implement.md @@ -1,5 +1,21 @@ # 隔离备份恢复演练实施计划 +## 2026-09-15 简单配对恢复的集中批准边界(未执行) + +不新增runner。已知可识别的历史输入为receipt-followup-release回滚备份:manifest `56a9addf57556580c46205ae8e68b01a8e23a45ae7757d4cfce9ec9c92660c86`、来源8d08d46d;对应镜像归档SHA256 `d17d7efaef073b5cc6b78f1ce2a73e938835e4910946c83e855b48e61780541b`,历史回读通过。它不是已核最新自然备份,不能报24小时内,也不能换成b7或当前本地代码假装同源恢复。 + +拟定单次范围:在ARM侧隔离的一次性Postgres16及匹配应用容器中恢复该固定源DB和storage,使用专用空卷、无端口映射的internal网络、禁OCR/通知/支付/ERP等外联和定时任务。实施前只读重核源manifest/包摘要/镜像身份、目标容量与生产ready基线;无法获得无业务副作用的应用启动配置则停在DB+附件结果,不把app记PASS。镜像加载、源副本、容器/卷创建和恢复均待专项批准。 + +验证仅限迁移集合/校验和、关键表聚合计数、附件引用存在性及可用大小/摘要、隔离应用健康与授权可读性;不回传原件或账号,不改生产引用。历史缺失附件仍无可定位的治理落库证据,若再次出现,分类报告NO_GO,不自动排除“测试件”。只删除本轮确实创建且身份可核的容器/网络/卷/临时副本,保留原备份、旧回滚镜像与生产服务;末尾复核ready及清理结果。 + +此固定历史源方案只回答“已备份的数据能否配对恢复”。最新自然批次/异机传输/当前生产灾备就绪是另一个只读时效核验,必须以执行时的新事实作结论,不能用此历史恢复代替。当前状态PREPARED_SCOPE_NOT_AUTHORIZED,不是恢复通过或完整生产就绪。 + +## 2026-09-15 统一收口接续 + +统一计划入口见09-08-reimbursement-payment-closeout/implement.md六项计划,本task负责C的配对恢复,ARM传输事实由08-28-production-arm-backup-transfer-incident核对。当前已知有历史DB恢复PASS和近期备份/镜像完整性PASS,不能回退说“从未恢复数据库”,也不能因此宣称DB+附件+应用恢复已完整通过。 + +先核09-04任务历史缺失附件的实际治理结果/批准范围,不能把“可能是测试”当可删除授权清单。准备同一manifest的DB/附件、匹配应用镜像、固定隔离目标/禁止生产连接和通知OCR外联、容量上限、清理范围与停止条件;形成一次准确受控恢复请求,不重复升级复杂runner。授权后一次简单恢复核迁移、关键表、附件引用及适用摘要、应用只读健康/可读性,原件内容不出日志。任何缺失归因分清备份不全、历史源缺失与工具误判,不强行删除引用通过门禁。 + ## 2026-09-11 配对恢复准备(未执行) 用户曾回传一次 DB_RESTORE_PASS:66 条迁移集合匹配、12 类表已验、隔离资源已清理。这是管理员回执,不是本轮独立复验;不能继续写“数据库从未成功恢复”。附件与应用配对恢复尚未证明。 diff --git a/.trellis/tasks/09-04-approval-return-notification-gap/implement.md b/.trellis/tasks/09-04-approval-return-notification-gap/implement.md index c89a28ac..5fb0896e 100644 --- a/.trellis/tasks/09-04-approval-return-notification-gap/implement.md +++ b/.trellis/tasks/09-04-approval-return-notification-gap/implement.md @@ -1,5 +1,17 @@ # 实施计划:审批退回结果通知缺失治理 +## 2026-09-15 本地通知链再验(未发生产消息) + +现有workflow.return-notifications随本轮联合19文件471项回归通过,额外运行`npm test -- tests/unit/routes/notifications.test.js tests/unit/services/imRouting.test.js tests/unit/services/notificationDispatcher.test.js`,3文件27/27通过,日志/tmp/followup-channels-tests.log。覆盖站内/派发编排、渠道管理和过滤逻辑,不代表真实企业微信接收成功。本轮未变routing、未修改生产配置,也未制造真人退回单或发送测试消息。 + +现有实现不需要重复开发;外部验收剩余是执行时只读核实际渠道开关/过滤矩阵与自然投递回执。若必须新建测试消息或改配置,按具体接收对象/消息数量/脱敏内容集中批准后再执行,不让员工承担软件回归。 + +## 2026-09-15 统一收口接续 + +统一计划入口见09-08-reimbursement-payment-closeout/implement.md六项计划,本task负责B的通知部分。2e69fe4e为已有提交且是当前候选祖先,不重复新增notification type;先核业务类型、投递routing、站内待办和消息delivery四层的已测/已发布/待验事实。对应09-11门户任务只读投影不依赖消息成功。 + +默认自主做现有实现和证据核对、合成退回/重提及失败容错测试;新生产routing或企微写入、真实员工消息验收列入集中操作清单后另批。不能为拿到PASS制造真实退回,不让员工承担软件基础回归;真实投递缺证据要分列,不以代码包含性作完结依据。 + ## 实施顺序 1. 在通知类型常量中新增 `leave.returned`、`purchase_request.returned`、`travel_request.returned`,加入 IM 支持表和领域映射。 diff --git a/.trellis/tasks/09-08-reimbursement-payment-closeout/design.md b/.trellis/tasks/09-08-reimbursement-payment-closeout/design.md index cfe3ef5b..c1d7f4a3 100644 --- a/.trellis/tasks/09-08-reimbursement-payment-closeout/design.md +++ b/.trellis/tasks/09-08-reimbursement-payment-closeout/design.md @@ -1,5 +1,15 @@ # 业务闭环方案(分阶段实施,发布状态见执行记录) +## 2026-09-15 统一收口编排 + +以本task implement作为唯一协调清单,各模块原task仍为实施合同。执行顺序:事实对账→待办/通知缺口及错误原因并行准备、串行代码实施→配对恢复工具与受控操作包→合成联合验收→按范围分笔提交/整批发布→自然业务观察。一个模块的外部等待不暂停其他模块;不能为追求“一次完成”跳过独立审查或混合权限状态机改动。 + +对账依据优先使用当前发布候选b7d2285d及签名/摘要证据,再回溯Git和task历史。task.json.commit是历史锚点不是总完成凭证;共享文件按补丁集成,不覆盖整份spec。现有09-04两份文档、统一审批中心文档及当前09-08发布记录是已知未提交差异,不纳入新产品补丁而不说明。 + +待办只投影真实状态,不另建审批引擎;退回通知先核已提交实现与生产routing,再决定是否需要代码修复。错误治理保持服务端原因/客户端映射/断言同一变更单元;不全文件替换泛化错误。恢复沿最简单一次性DB+空附件目录+禁外联应用,先列固定源和目标身份、资源上限、清理列表和停止条件,再集中请求真实数据恢复授权;不继续扩复杂runner。 + +回单自然验收与密钥来源是事实/运维工作,不通过改生产记录制造测试结果。没有真实待处理批次时,先用合成职责矩阵验证maker/proposer/owner/submitter排除,实际参与人出现后再确认人选;不自动给admin/finance加复核权限。新证据只保存安全摘要,明确合成/真实、手动入队/自然调度、隔离/生产等边界。 + ## 2026-09-15 系统失败引导最小收口 从未归档附件投影是否存在system_failed/key_failed/snapshot_failed;仅在现有readiness未满足横幅中优先展示管理员排障引导,不修改canRegisterPaymentComplete或服务端资格。其他可用证据满足readiness时不因旧失败附件新增阻断。重新核对按钮仍只读refetch,不发OCR。恢复沿用修复前提后另批重新上传原件的现有路径,旧附件与审计保留,不引入新的管理员角色权限或批量SQL重排队。 diff --git a/.trellis/tasks/09-08-reimbursement-payment-closeout/implement.md b/.trellis/tasks/09-08-reimbursement-payment-closeout/implement.md index 3fb4deee..301b318d 100644 --- a/.trellis/tasks/09-08-reimbursement-payment-closeout/implement.md +++ b/.trellis/tasks/09-08-reimbursement-payment-closeout/implement.md @@ -1,5 +1,177 @@ # 执行顺序(本地技术审查/修复已批准,真实业务动作另批) +## 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 | 只查非敏感来源/保管/恢复记录;未知有风险结论和后续处理方式;合成矩阵验证独立复核,实际例外按参与人核资格 | 用户明确不知道密钥内容/生成时间/方式,撤销“管理员创建已确认”的推断;不再追问、不换密钥或扩权 | + +### 执行清单与里程碑 + +- [x] 确认官方指针09-08及当前生产候选b7d2285d,记录现有未提交差异,不跟随过期09-04注入换范围。 +- [x] 扫描22个task元数据及历史commit是否为当前候选祖先;只形成初核,不声称全量对账完成。 +- [x] 重新统计错误基线: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调度/生产全链。 diff --git a/.trellis/tasks/09-08-reimbursement-payment-closeout/prd.md b/.trellis/tasks/09-08-reimbursement-payment-closeout/prd.md index 76f89c7e..0b0aa621 100644 --- a/.trellis/tasks/09-08-reimbursement-payment-closeout/prd.md +++ b/.trellis/tasks/09-08-reimbursement-payment-closeout/prd.md @@ -1,5 +1,21 @@ # 报销付款与银行制单业务闭环 +## 2026-09-15 六项统一收口合同(本轮最新) + +用户采纳后续六项并要求一次规划、连续推进,非必要不提问。复用本任务承接报销付款闭环的统一协调,具体实施仍归已有模块task,不创建新总控系统或每个修复一个task。此增量是后续批准范围,历史阶段的未部署描述不代表当前状态。 + +目标是让员工按正常业务流程独立办完,让系统异常可解释、数据可恢复、交付状态可信;不是以一次提交囊括全部历史技术债。范围:22个活跃task的代码/发布/业务验收/等待项对账;四类报销付款待办与退回通知;数据库+附件+应用配对恢复;10-05错误豁免模块治理;新回单自然消费验收;密钥来源和人工例外职责核实。 + +共同验收: +- 对账区分代码包含、局部已发布、任务全量验收完成,不因Git祖先关系自动勾完PRD;没有证据标待核,不让过期文字驱动重复开发。 +- 待办计数/列表/责任人/动作/处理后消失一致;通知失败不改变审批事实,站内待办不依赖企业微信成功;普通账号与身份切换不串数据。 +- 配对恢复在批准的隔离目标使用同一manifest,数据库、附件引用/摘要、应用只读检查均分开报结果;源备份不改,缺失件不可按“可能是测试”自行删除。 +- 错误治理先覆盖高频已启用业务操作,每项有注册原因码、客户端提示和行为断言;延期按项/模块说明原因和复验点,不统一改日期。 +- 当前已通过的真实单页回单隔离队列证据不重做;生产自然业务出现后执行端只读观察,不制造真实付款、重传历史或要求员工代做软件回归。 +- 密钥生成来源目前未知,用户不知道内容/时间/方式;先查非敏感部署证据,查不到如实记录,并列保管/恢复证据风险,不读取值、不查可能含Secret的shell历史、不轮换、不继续追问用户。 + +默认自主执行本地对账、明确范围内修复、合成验证、文档与证据整理。提交/推送/部署、新生产配置或数据写入、真实原件额外外调、恢复真实备份到具体隔离目标仍按明确范围另批;旧授权不无限继承。将需要批准的操作集中成一次清单,非实质变化不反复确认。等待真实业务或批准不阻塞其他可做模块,也不能伪称全部完成。 + ## 2026-09-15 后续收口范围 用户要求自主继续后续本地任务。本轮完成正式认证浏览器验证后,继续修复回单系统失败横幅与卡片引导矛盾,并将现有受控恢复路径写入操作手册。保持现有布局、权限、付款门禁和状态机;不新增管理员一键重排队或自动重传。失败前提由管理员定位修复,另获原件重传授权后由有上传权限的人员重新上传,旧失败证据保留。无法修复快照等前提时停止,不以重上传承诺恢复成功。 diff --git a/.trellis/tasks/09-11-reimbursement-payment-handoffs/implement.md b/.trellis/tasks/09-11-reimbursement-payment-handoffs/implement.md index f7cd6b40..0eca5b87 100644 --- a/.trellis/tasks/09-11-reimbursement-payment-handoffs/implement.md +++ b/.trellis/tasks/09-11-reimbursement-payment-handoffs/implement.md @@ -1,5 +1,30 @@ # 执行清单 +## R1复核F5与R2验收补充 + +新增断言已随R2新构建重跑visual-portal.spec.ts,22/22、零重试,日志/tmp/followup-r2-browser.log。PC与手机财务两段href、BX/PB处理后均消失本次实际断言通过;仅合成API/认证,不宣称公网或自然交接验收。 + +R1财务两段当时只断言文本/计数及PB消失,未覆盖href及BX消失;下表R1记录中相应“入口/处理后消失”覆盖声明过宽,按此更正,不改变原22项日志。R2已补PC/手机的BX/PB正确href及两项均消失断言,新的执行结果另记。employee/ceo的旧href及消失断言已存在,不虚报本次新增。 + +## 2026-09-15 四段交接双端重新验证(本地PASS) + +使用本轮新构建与仅回环地址的vite preview,执行`E2E_MODE=local E2E_BASE_URL=http://127.0.0.1:4177 ./node_modules/.bin/playwright test tests/e2e/visual-portal.spec.ts --workers=2 --retries=0 --reporter=list --output=../artifacts/qa-layout/followup-stage3-browser`,22/22通过、零重试,日志/tmp/followup-stage3-browser.log。测试文件自身串行执行,输出实际1worker;不按命令参数声称并行。临时preview已停止。 + +| 业务交接 | 对象与双端验收 | 本轮结论 | +| --- | --- | --- | +| 退回后改重提 | employee冷进入、正确报销入口、处理后消失、错误可重试 | PC/手机PASS | +| 已批未付组批 | finance事项、计数与入口、不显示旧泛化计数、处理后消失 | PC/手机PASS | +| 付款独立复核 | ceo冷进入、正确付款入口、非财务不出现组批事项、处理后消失 | PC/手机PASS | +| 付款与回单处理 | finance制单后待付款/回单事项、刷新后消失 | PC/手机PASS | + +同时覆盖甲乙甲同文档切换的慢响应、失败、晚返回、迟到401取消及同身份401刷新正例,超过8条事项不截断。本次浏览器确实运行真实前端,但auth/API/事项是合成fixtures,未操作真实付款,也不是生产JWT+数据库同链新证据。测试未发现需重写门户的缺口,旧已发布身份隔离不重复开发。真实通知送达及自然新回单仍另列外部验收,不靠页面绿测替代。 + +## 2026-09-15 统一收口接续 + +本task承接统一计划B的待办投影部分,退回通知仍归09-04-approval-return-notification-gap;总顺序见09-08-reimbursement-payment-closeout/implement.md六项计划。Git已存在fedcaed1及后续门户身份隔离提交,历史“未提交/未部署”只代表当时,不能据此重做。本轮先逐验收点关联当前b7d2285d发布与先前证据,再决定真实缺口,不直接勾完独立复核/业务验收。 + +检查矩阵保持退回修改/财务待组批/独立付款复核/财务登记四阶段,核PC与手机计数列表、权限/责任人、入口动作、处理后消失、通知失败不遮蔽待办;重点复用迟到401取消和甲乙甲隔离回归。真实消息投递和真人退回另批,不把合成测试算自然业务完成;范围内最小修复与针对性验证连续执行。 + ## 2026-09-11 只读复核后取消旧请求(原范围接续,未提交/部署) 冻结树 dcde0d44 的双端合成浏览器复核发现:甲旧请求在乙登录后返回 401,会用乙 token 重放,并把乙结果写到甲 queryKey;甲再次登录等待新响应时显示乙待办。原 6/62/真实隔离通过记录不改写,它们未覆盖该分支。只读回执见 postpush-identity/readonly-review.md。本次沿原批准的门户隔离范围返回实施,不改变全局认证或业务权限,不新建任务。