From 9cbefdf2433e32a03284737bed2f22c31d145a54 Mon Sep 17 00:00:00 2001 From: shunli Date: Sun, 27 Sep 2026 15:18:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=BA=8B=E5=8A=A1=E4=B8=8A?= =?UTF-8?q?=E9=99=90=E5=86=B3=E5=AE=9A=E3=80=81=E6=8A=A5=E9=94=80AC11?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E5=B9=B6=E5=BD=92=E6=A1=A3=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E6=97=A7=E7=8A=B6=E6=80=81=E8=B0=83=E6=9F=A5=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=20[09-27-purchase-submit-tx-timeout][09-01-reimbursement-one-p?= =?UTF-8?q?age-approval-workbench]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 09-18 PRD 注明「不提高5000ms」约束经用户 2026-09-27 决定被取代; 09-27 任务记负载验证结果(采购提交 0 次 500)。 - 父任务记用户确认:退回的报销单已重新提交并经财务审批通过(来源为 用户确认,未读生产数据);核查 SW 缓存仅含报销摘要,符合 R8。 - 09-26-approve-success-state-unchanged 验收完成并已上线,归档。 Co-Authored-By: Claude Opus 5.5 --- .../implement.md | 7 +++++++ .../tasks/09-18-local-concurrency-product-fixes/prd.md | 2 ++ .../09-27-purchase-submit-tx-timeout/implement.md | 4 +++- .trellis/tasks/09-27-purchase-submit-tx-timeout/prd.md | 8 ++++---- .../09-26-approve-success-state-unchanged/check.jsonl | 0 .../implement.jsonl | 0 .../09-26-approve-success-state-unchanged/implement.md | 0 .../09-26-approve-success-state-unchanged/prd.md | 0 .../research/diag-instrumentation.patch | 0 .../research/repro.sh | 0 .../09-26-approve-success-state-unchanged/task.json | 10 +++++----- 11 files changed, 21 insertions(+), 10 deletions(-) rename .trellis/tasks/{ => archive/2026-09}/09-26-approve-success-state-unchanged/check.jsonl (100%) rename .trellis/tasks/{ => archive/2026-09}/09-26-approve-success-state-unchanged/implement.jsonl (100%) rename .trellis/tasks/{ => archive/2026-09}/09-26-approve-success-state-unchanged/implement.md (100%) rename .trellis/tasks/{ => archive/2026-09}/09-26-approve-success-state-unchanged/prd.md (100%) rename .trellis/tasks/{ => archive/2026-09}/09-26-approve-success-state-unchanged/research/diag-instrumentation.patch (100%) rename .trellis/tasks/{ => archive/2026-09}/09-26-approve-success-state-unchanged/research/repro.sh (100%) rename .trellis/tasks/{ => archive/2026-09}/09-26-approve-success-state-unchanged/task.json (70%) diff --git a/.trellis/tasks/09-01-reimbursement-one-page-approval-workbench/implement.md b/.trellis/tasks/09-01-reimbursement-one-page-approval-workbench/implement.md index 52b4f84c..98080425 100644 --- a/.trellis/tasks/09-01-reimbursement-one-page-approval-workbench/implement.md +++ b/.trellis/tasks/09-01-reimbursement-one-page-approval-workbench/implement.md @@ -1,3 +1,10 @@ +## 2026-09-27 AC11 真人重提与财务复审(当前) + +- 用户 2026-09-27 口头确认:此前退回的报销单(0014/0016/0017/0018 批次)已由员工重新提交,并经财务审批通过;未反馈新的体验或数据问题。 +- 证据来源为用户确认;Claude 未读取生产数据(生产读取被权限分类器拦截),未逐项核对员工提示、正文一致性、明细合计、PC 历史位置与进度/历史理解。若需逐项核对,需另行授权只读查询或由财务补充反馈。 +- 附带核查:SW `app-api-runtime` 缓存的 `/api/workflow/tasks/:id` 对报销只含摘要(单号/状态/合计/日期/事由/申请人/提交人)与历史,不含明细、票据、附件或材料参数;完整明细走 `/api/reimbursements/:id`,不在 SW 规则内,符合 R8「离线只显示摘要/历史」。 +- 归档建议:父任务及 B-2a/B-2b/只读一致性子任务的实施均已上线,AC11 以用户确认计为完成;待用户确认是否据此收口归档。 + # Implementation Plan:报销审批一页式工作台 ## Delivery Map diff --git a/.trellis/tasks/09-18-local-concurrency-product-fixes/prd.md b/.trellis/tasks/09-18-local-concurrency-product-fixes/prd.md index bc73a337..696f7afe 100644 --- a/.trellis/tasks/09-18-local-concurrency-product-fixes/prd.md +++ b/.trellis/tasks/09-18-local-concurrency-product-fixes/prd.md @@ -12,6 +12,8 @@ - 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哈希移至事务开始前,保留权限/引用校验、账号/角色/审计原子性及原提交后同步;不改批量导入哈希位置。 diff --git a/.trellis/tasks/09-27-purchase-submit-tx-timeout/implement.md b/.trellis/tasks/09-27-purchase-submit-tx-timeout/implement.md index c6f8ff95..08bd7b27 100644 --- a/.trellis/tasks/09-27-purchase-submit-tx-timeout/implement.md +++ b/.trellis/tasks/09-27-purchase-submit-tx-timeout/implement.md @@ -4,4 +4,6 @@ - [x] 采购提交、报销新建、报销提交三处 `$transaction` 显式 `{ maxWait: 5000, timeout: 10000 }`;事务内容不变。 - [x] 回归断言:采购提交(去掉修复即失败)、报销提交。 - [x] 后端全量单测:4451 通过 / 1 原跳过。 -- [ ] 负载复现确认无采购提交 P2028;随下次发布候选走完整门禁。 +- [x] 负载复现 2 轮(采购 ×8 + permission-direct-access ×8):采购提交 0 次 500(修复前每轮 1–2 次)。另见 1 次 P2028 为 `auth.js:1054` 令牌刷新事务「Unable to start a transaction」(连接池取连接超 2s maxWait,非本修复范围,前端重试后用例通过);AP6 待办计数负载下偶发失败(既有)。 +- [x] 2026-09-27 用户决定采用放宽方案,09-18 PRD 已注明原约束被取代。 +- [ ] 随下次发布候选走完整门禁并部署(部署需另行授权)。 diff --git a/.trellis/tasks/09-27-purchase-submit-tx-timeout/prd.md b/.trellis/tasks/09-27-purchase-submit-tx-timeout/prd.md index b6cc0413..82b04b49 100644 --- a/.trellis/tasks/09-27-purchase-submit-tx-timeout/prd.md +++ b/.trellis/tasks/09-27-purchase-submit-tx-timeout/prd.md @@ -22,12 +22,12 @@ ## Acceptance Criteria -- [ ] 三处事务传入 `{ maxWait: 5000, timeout: 10000 }`,采购与报销提交各有回归断言(去掉修复即失败)。 -- [ ] 后端全量单测通过。 -- [ ] 负载复现不再出现采购提交 P2028。 +- [x] 三处事务传入 `{ maxWait: 5000, timeout: 10000 }`,采购与报销提交各有回归断言(去掉修复即失败)。 +- [x] 后端全量单测通过(4451 / 1 原跳过)。 +- [x] 负载复现不再出现采购提交 P2028(2 轮 0 次,修复前每轮 1–2 次)。 ## Test Plan - `server/tests/unit/routes/purchase.submit-budget-precheck.test.js`:新增断言提交事务选项;已验证去掉修复时该用例失败。 - `server/tests/unit/routes/reimbursements.expense-standards.test.js`:在既有成功提交用例中断言事务选项。 -- 后端全量 vitest;负载复现脚本(见 09-26-approve-success-state-unchanged/research/repro.sh)。 +- 后端全量 vitest;负载复现脚本(见 archive/2026-09/09-26-approve-success-state-unchanged/research/repro.sh)。 diff --git a/.trellis/tasks/09-26-approve-success-state-unchanged/check.jsonl b/.trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/check.jsonl similarity index 100% rename from .trellis/tasks/09-26-approve-success-state-unchanged/check.jsonl rename to .trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/check.jsonl diff --git a/.trellis/tasks/09-26-approve-success-state-unchanged/implement.jsonl b/.trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/implement.jsonl similarity index 100% rename from .trellis/tasks/09-26-approve-success-state-unchanged/implement.jsonl rename to .trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/implement.jsonl diff --git a/.trellis/tasks/09-26-approve-success-state-unchanged/implement.md b/.trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/implement.md similarity index 100% rename from .trellis/tasks/09-26-approve-success-state-unchanged/implement.md rename to .trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/implement.md diff --git a/.trellis/tasks/09-26-approve-success-state-unchanged/prd.md b/.trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/prd.md similarity index 100% rename from .trellis/tasks/09-26-approve-success-state-unchanged/prd.md rename to .trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/prd.md diff --git a/.trellis/tasks/09-26-approve-success-state-unchanged/research/diag-instrumentation.patch b/.trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/research/diag-instrumentation.patch similarity index 100% rename from .trellis/tasks/09-26-approve-success-state-unchanged/research/diag-instrumentation.patch rename to .trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/research/diag-instrumentation.patch diff --git a/.trellis/tasks/09-26-approve-success-state-unchanged/research/repro.sh b/.trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/research/repro.sh similarity index 100% rename from .trellis/tasks/09-26-approve-success-state-unchanged/research/repro.sh rename to .trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/research/repro.sh diff --git a/.trellis/tasks/09-26-approve-success-state-unchanged/task.json b/.trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/task.json similarity index 70% rename from .trellis/tasks/09-26-approve-success-state-unchanged/task.json rename to .trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/task.json index 671190a1..fe193db2 100644 --- a/.trellis/tasks/09-26-approve-success-state-unchanged/task.json +++ b/.trellis/tasks/archive/2026-09/09-26-approve-success-state-unchanged/task.json @@ -3,7 +3,7 @@ "name": "approve-success-state-unchanged", "title": "审批通过返回成功但任务状态未变的并发异常调查", "description": "verify-candidate 34675e1a/750a184b 在4 worker负载下采购主链路3轮挂2次:经理approve返回200,随后任务详情仍pending且历史无approve;单跑每次通过。需保留数据库负载复现查库,确认是否为新引入并影响全部审批。", - "status": "planning", + "status": "completed", "dev_type": null, "scope": "pwa-service-worker", "package": null, @@ -11,11 +11,11 @@ "creator": "shunli", "assignee": "shunli", "createdAt": "2026-09-26", - "completedAt": null, + "completedAt": "2026-09-27", "branch": null, "base_branch": "main", "worktree_path": null, - "commit": null, + "commit": "0931b1ea", "pr_url": null, "subtasks": [], "children": [], @@ -25,8 +25,8 @@ "server/tests/unit/utils/client-pwa-api-cache.test.js", "client/src/pwa.ts" ], - "notes": "", + "notes": "2026-09-27 完成:SW app-api-runtime 去掉 3s networkTimeoutSeconds(0931b1ea),负载复现修复前 3 轮命中 2 轮、修复后 0;verify-candidate 70af0c6b PASS 并已部署生产(buildSha 70af0c6b9aa3,线上 sw.js 已无超时)。用户授权 Claude 决定收口方式,据此归档。", "meta": { "implementationApproval": "APPROVED_BY_USER_20260926" } -} +} \ No newline at end of file