文件
hyb-oa/.trellis/tasks/archive/2026-10/09-18-local-concurrency-product-fixes/prd.md
T
wangsli和Claude Opus 5.5 89f46790e8 归档本地并发问题修复任务并补收口记录(09-18-local-concurrency-product-fixes)
- 已完成 P1–P4、P6–P10,实现 1f8d5b65/合并 46a70aa5 包含于生产 4a5cd8f2
- P5 旧 WebKit 派生 registry 保护余项转由 09-08-reimbursement-payment-closeout 跟进
- 仅 P9 经补审,全量独立复核未做,不补记为通过;原清单保留

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 10:49:22 +08:00

6.4 KiB
原始文件 Blame 文件历史

PWA 更新事件与本地并发产品缺陷最小修复

2026-10-11 收口记录(待归档批准)

已完成的范围:P1–P4、P6–P10 已勾选——PWA 更新后页面收敛,采购创建/保存草稿、资产创建、单个账号创建与报销提交的事务过期最小修复。本地完整候选 g20-full-r6:后端 4437 通过/1 原条件跳过、372 本地浏览器全过(证据入口见 09-06 implement 顶部)。实现随 1f8d5b65 进入候选分支,合并提交 46a70aa5 已包含于当前生产 4a5cd8f2;其后 10 月历次发布均经完整门禁通过。2026-09-27 用户关于事务上限的决定由已归档的 09-27-purchase-submit-tx-timeout 实施。

未完成、如实保留:

  • P5 保持未勾:旧测试材料中一份 WebKit 派生 registry 已披露的字节变化使“旧材料保护”合取项未恢复,原 baseline 不改。这是测试材料保护问题,不是产品代码缺陷;作为余项由 09-08-reimbursement-payment-closeout 继续跟进。
  • 独立复核:仅 P9(报销提交)经补审 PASS,且 reviewer 未逐行审全部路由分支;本任务全量独立复核未做,不补记为通过。

已分流:预算池 used_amount 无锁读改写缺陷已单列 09-19-budget-pool-concurrency 修复并归档。

原未勾清单与历史“未发布/PENDING”表述为当时记录,保留原样。

来源与批准范围

用户已批准按余项连续推进,未规划内容先落方案。09-06 G18两次同样的四文件4-worker并发验证复现采购500及PWA45秒不收敛;环境与输入/清理PASS。此task拥有两个在用产品缺陷的最小本地修复,09-06仍拥有完整覆盖合同。不能改变R2/R1或自动取得真实操作与发布授权。

Goal

修复已复现的 PWA 更新后页面不收敛和采购创建事务过期,在原并发、预算与业务规则下完成本地验证。

Scope

  • PWA:页面已经受A控制,B worker安装/激活并接管后,当前普通业务页自动收敛到B。新版本监听须在异步注册前建立,不能只依赖Workbox注册完成后的updatefound/activated。首次安装不重复刷新;登录/改密/找回/重置密码页保留输入并使用既有更新提示,用户选择后才刷新;前台版本提示原合同不变。
  • 不在更新过程中删除刚安装的Workbox precache;旧独有预缓存由worker激活清理。运行时缓存清理与显式登出/人工刷新清理区分,保留后者原行为。

2026-09-27 用户决定(取代下列「不提高5000ms事务预算」约束):负载复现与分段计时显示提交事务无单一瓶颈(事件循环/连接池排队导致整体变慢),P9/P10 缩短事务后仍复现 P2028。采购提交、报销新建/提交三处改用项目既有 { maxWait: 5000, timeout: 10000 },见任务 09-27-purchase-submit-tx-timeout。其余事务未改。

  • 采购创建:写事务只创建草稿及其审计,最小字段返回后提交,再按相同详情select读响应。权限、切换控制、默认字段、成功响应、审计内容和二者原子性不变;不提高5000ms事务预算或绕过任何审计。

  • G20续修:资产创建的关系详情读取移至原业务写事务提交后,保留事务内校验、编号、资产与领用写入及原异步审计语义。

  • G20续修:单个账号创建的原cost12哈希移至事务开始前,保留权限/引用校验、账号/角色/审计原子性及原提交后同步;不改批量导入哈希位置。

  • P9:修复本地已复现的报销提交事务超时。先核事务步骤耗时/数据库等待及已编号提交路径,再定稿最小优化;保持FOR UPDATE、权限、票据金额、预算、审批历史和审计的同事务一致性,不提高5000ms预算或增加重试。

  • P10:g20-full-r5暴露采购PATCH保存草稿P2028(6529/5000ms),沿用已批准的在用缺陷最小修复范围:保留锁、所有权/状态、主数据、项目关联、明细替换、金额/两次父记录更新顺序及审计同事务,只把响应详情投影移至提交后,不增加重试或超时。

Out of Scope

保留现有差异及旧冻结包。仅本地合成、禁止外联/真实配置密钥备份/生产ARM/恢复/通知付款/提交推送部署归档。

Acceptance

  • P1:本地 production 构建 A→B同profile,原45秒窗口、无测试刷新/清缓存,B文档/active控制器/worker摘要/实际新资源及旧缓存清理共同成立,零页面/静态404/登录回退/重载循环。

  • P2:可执行生命周期回归覆盖注册Promise未完成时控制器已切换、首次安装、重复事件、worker未激活/失效、认证页延后刷新;已有前台提示与登出缓存清理合同保持。

  • P3:正式采购路由回归证明草稿/审计同事务、失败不返回成功,详情仅提交后读取、完整响应保持;原采购提交/附件/审批及预算回归不退化。

  • P4:不带预载观察器的原四文件4-worker/零重试/原预算运行通过;仅证明该组,不能关闭旧full-r2或全负载可靠性。

  • P5:前端typecheck/build、Prisma/受影响语法、任务治理和保护检查通过;2026-09-19代码/治理验证保持通过,但新增一处旧WebKit派生registry保护异常未恢复,故此合取项保持开放;只读独立review仍按inline限制单列PENDING,不虚报。

  • P6:资产原响应/可选领用/异步审计语义与提交前后失败边界通过;原资产整链原配置重验。

  • P7:单个账号原cost12在事务前完成,账号/角色/审计保持同事务;原写入/敏感角色/导入回归及R75完整文件通过。

  • P8:续修后的完整候选从static重新执行并如实记录,不用旧定向证据抵扣完整验收。

  • P9:报销提交的重复读取/无效事务开销按证据优化,确定性边界回归和真实合成R75通知原整文件通过;已编号提交不重新取号,失败事务不遗留部分审批/预算写入。

  • P10:保存草稿写入/审计仍原子,完整响应投影只在提交后读取;写入/明细/审计/commit失败不读取、不假成功,提交后详情失败不得宣称回滚或自动重试。原采购主链原预算重验。

Test Plan

使用现有server Vitest与浏览器专用tsc;复用受管retained-local四文件命令。精确命令/结果落implement与本轮独占证据,不读取真实输入、不联网安装依赖。