
API Changelog Bot和Claude Opus 5
9ee36c0b94
changelog-filename-gate / validate (push) Failing after 2s
docs(changelog): #7980 AC-4 发票签发组三写口补同一把锁,新增可重试冲突码 100503(会触达小程序 C 端)
order-v3 的 InvoiceAdminService.issueInvoice / reuploadInvoice 与 InvoiceMpService.reissueInvoice
三处 @Lock4j 写了逐字相同的 keys 却都没写 name;lock4j 的 Redis 键在 name 缺省时退化成
「类全限定名+方法名」,于是三处各持一把锁。后果是 reupload ∥ reissue 会留下一单两张有效票。
本次三处补同一个 name = "order-invoice:issue"。PR #8043 → 09b8f2323 已合 dev-v3。
接口路径、方法、请求/响应字段、既有错误码全部零增删。唯一契约变化是新增一个可能返回的错误码 100503
(RESOURCE_LOCKED「资源被占用,请稍后重试」),且它以 HTTP 200 + body code 返回——
前端只看 HTTP 状态码会把它当成功。
该码会触达小程序 C 端:reissue 经 hl-mp-service 两个入口透传
(MpV3InvoiceController:54 直接透传;MpInvoiceController:108 经 getCheckedData(),
Result:143-148 用上游 code 原样重抛)。用户点「申请重开发票」时若财务端正在同一张票上操作,
等最多 3 秒后收到该提示;反向同理。此前这几条互不阻塞。
测试服证据(backend_status 因此才从 pending 转 deployed;此前门禁 E_BACKEND_PENDING 正确拦下过一次,
没有为换绿灯改状态,而是去把部署真的做了):运行版本 5d14bc524,
merge-base --is-ancestor 09b8f2323 5d14bc524 → YES。
⚠️ 如实记:部署前 COMMIT 已是 5d14bc524(另一会话此前推上去的),本次重跑不等于「使它从不生效变生效」。
🔴 证据强度按实际收窄,没有拔高:redis-cli MONITOR 抓到键
lock4j:order-invoice:issue#order-invoice:issue:<invoiceId>、无方法名混入,
但 MONITOR 只跑了三个写口里的一个(issueInvoice);另两处由代码同源 + 反射守卫用例
InvoiceIssueLockNameGuardTest(断言三处 name 非空且相等)覆盖,未在测试服上单独抓包。
正文里 §2/§3 原本写「同第 1 节,链路一致」会被读成「也实测过」,已改成明确写「未单独抓包」。
100503 未复现:并发两个 issueInvoice,一个 code=200、另一个 code=581502(INVOICE_CANNOT_ISSUE
业务状态守卫),不是锁超时码。原因是临界区极短(与 fleet 那轮 34 并发未触发同因)。
第二个请求被业务守卫拦下说明没产生并发脏写,但这是旁证不是互斥证据。
两面都写:路径源码级真实存在(已读码确认 + IT 里实测过等 3024ms),但测试服未能触发,
不代表更长事务/生产数据量下不会触发。
取证干净:三张票全是测试夹具(客户名「核团甲/乙/丙」,apply_reason 为 #7932 造数),
改前均 REQUESTED/NULL/NULL,已按改前快照逐列 UPDATE 还原并复读一致,
Redis --scan lock4j:*order-invoice* 复扫为空。过程中发生过一次 code=401(token 被别的会话顶掉),
该次调用前无任何读数,已重登并把那段整个重做。
顺带修掉一个会挂门禁的文件名 bug:原名后缀写的是「小程序管理后台」,而 changelogs-v2/ 根目录
要求端类型字面量必须是「管理后台」,改名前文件名校验确实报 E_CLIENT。
Refs #7980
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:47:14 +08:00
..
2026-09-06 10:43:20 +08:00
2026-09-06 10:43:20 +08:00
2026-09-20 17:35:19 +08:00
2026-09-01 16:13:30 +08:00
2026-09-06 10:43:20 +08:00
2026-09-06 10:43:20 +08:00
2026-09-06 10:43:20 +08:00
2026-09-06 10:43:20 +08:00
2026-09-06 10:43:20 +08:00
2026-09-06 10:43:20 +08:00
2026-09-06 10:43:20 +08:00
2026-09-04 09:51:13 +08:00
2026-09-04 20:04:16 +08:00
2026-09-04 20:04:16 +08:00
2026-09-04 17:02:19 +08:00
2026-09-04 14:25:48 +08:00
2026-09-06 10:43:20 +08:00
2026-09-04 20:04:16 +08:00
2026-09-04 22:22:18 +08:00
2026-09-04 20:04:16 +08:00
2026-09-04 15:37:23 +08:00
2026-09-04 20:04:16 +08:00
2026-09-04 20:43:38 +08:00
2026-09-04 23:34:24 +08:00
2026-09-05 11:20:24 +08:00
2026-09-05 11:35:01 +08:00
2026-09-06 10:43:20 +08:00
2026-09-06 16:41:24 +08:00
2026-09-07 21:29:21 +08:00
2026-09-06 10:43:20 +08:00
2026-09-08 16:29:47 +08:00
2026-09-06 10:25:32 +08:00
2026-09-06 16:33:44 +08:00
2026-09-06 16:33:44 +08:00
2026-09-06 12:59:28 +08:00
2026-09-08 13:30:19 +08:00
2026-09-08 15:56:23 +08:00
2026-09-06 16:33:44 +08:00
2026-09-10 10:38:39 +08:00
2026-09-10 10:38:39 +08:00
2026-09-06 16:40:20 +08:00
2026-09-07 09:51:52 +08:00
2026-09-08 08:02:04 +08:00
2026-09-08 08:02:04 +08:00
2026-09-08 13:30:19 +08:00
2026-09-10 09:27:08 +08:00
2026-09-08 14:06:12 +08:00
2026-09-06 16:33:44 +08:00
2026-09-06 19:24:54 +08:00
2026-09-07 16:54:29 +08:00
2026-09-07 15:56:09 +08:00
2026-09-08 13:18:09 +08:00
2026-09-08 14:48:31 +08:00
2026-09-08 10:33:14 +08:00
2026-09-08 08:02:04 +08:00
2026-09-08 12:49:35 +08:00
2026-09-07 19:02:13 +08:00
2026-09-08 10:23:44 +08:00
2026-09-08 12:16:13 +08:00
2026-09-10 10:38:39 +08:00
2026-09-10 15:42:42 +08:00
2026-09-07 16:37:29 +08:00
2026-09-07 17:35:20 +08:00
2026-09-07 12:04:48 +08:00
2026-09-08 08:02:04 +08:00
2026-09-07 15:17:44 +08:00
2026-09-08 11:14:06 +08:00
2026-09-07 17:35:20 +08:00
2026-09-07 20:23:24 +08:00
2026-09-08 08:02:04 +08:00
2026-09-08 14:06:12 +08:00
2026-09-08 12:49:35 +08:00
2026-09-08 16:56:42 +08:00
2026-09-08 17:36:53 +08:00
2026-09-08 18:58:20 +08:00
2026-09-08 18:17:57 +08:00
2026-09-08 22:30:49 +08:00
2026-09-08 17:29:52 +08:00
2026-09-09 17:54:39 +08:00
2026-09-09 17:54:39 +08:00
2026-09-09 17:54:39 +08:00
2026-09-09 17:54:39 +08:00
2026-09-09 17:54:39 +08:00
2026-09-09 17:54:39 +08:00
2026-09-09 17:02:38 +08:00
2026-09-09 17:54:39 +08:00
2026-09-09 17:54:39 +08:00
2026-09-09 13:55:49 +08:00
2026-09-09 09:55:57 +08:00
2026-09-09 18:03:10 +08:00
2026-09-10 09:24:14 +08:00
2026-09-09 23:27:33 +08:00
2026-09-10 15:47:31 +08:00
2026-09-11 10:39:30 +08:00
2026-09-10 10:05:26 +08:00
2026-09-11 11:17:31 +08:00
2026-09-11 10:01:17 +08:00
2026-09-10 15:09:21 +08:00
2026-09-10 22:35:45 +08:00
2026-09-10 12:06:07 +08:00
2026-09-10 15:09:21 +08:00
2026-09-10 15:32:32 +08:00
2026-09-10 18:01:41 +08:00
2026-09-10 18:21:26 +08:00
2026-09-11 11:47:00 +08:00
2026-09-13 10:54:55 +08:00
2026-09-11 19:20:10 +08:00
2026-09-11 19:20:10 +08:00
2026-09-11 14:46:14 +08:00
2026-09-11 18:14:35 +08:00
2026-09-13 09:51:52 +08:00
2026-09-13 09:51:52 +08:00
2026-09-13 09:51:52 +08:00
2026-09-13 09:51:52 +08:00
2026-09-13 09:51:52 +08:00
2026-09-12 07:46:16 +08:00
2026-09-13 10:08:51 +08:00
2026-09-13 09:51:52 +08:00
2026-09-13 09:51:52 +08:00
2026-09-13 10:20:40 +08:00
2026-09-13 09:51:52 +08:00
2026-09-13 09:14:00 +08:00
2026-09-13 10:50:18 +08:00
2026-09-14 11:11:19 +08:00
2026-09-13 14:39:53 +08:00
2026-09-14 10:22:59 +08:00
2026-09-13 14:47:04 +08:00
2026-09-13 15:10:28 +08:00
2026-09-13 16:32:00 +08:00
2026-09-13 10:31:02 +08:00
2026-09-14 10:14:41 +08:00
2026-09-13 11:00:37 +08:00
2026-09-13 13:11:26 +08:00
2026-09-13 15:01:58 +08:00
2026-09-13 15:01:58 +08:00
2026-09-14 16:02:16 +08:00
2026-09-13 17:51:23 +08:00
2026-09-13 16:25:38 +08:00
2026-09-14 09:32:30 +08:00
2026-09-14 09:32:30 +08:00
2026-09-14 10:25:25 +08:00
2026-09-14 11:16:00 +08:00
2026-09-14 15:54:21 +08:00
2026-09-15 09:09:43 +08:00
2026-09-14 17:22:41 +08:00
2026-09-14 10:31:50 +08:00
2026-09-14 07:54:30 +08:00
2026-09-14 13:01:21 +08:00
2026-09-14 22:37:38 +08:00
2026-09-14 22:30:35 +08:00
2026-09-14 16:21:13 +08:00
2026-09-15 00:04:58 +08:00
2026-09-15 16:29:10 +08:00
2026-09-15 16:29:10 +08:00
2026-09-15 16:29:10 +08:00
2026-09-15 16:29:10 +08:00
2026-09-15 17:06:32 +08:00
2026-09-16 09:24:48 +08:00
2026-09-16 03:33:40 +08:00
2026-09-16 03:33:40 +08:00
2026-09-16 03:33:40 +08:00
2026-09-15 16:29:10 +08:00
2026-09-15 12:21:04 +08:00
2026-09-15 09:41:47 +08:00
2026-09-15 09:54:43 +08:00
2026-09-15 09:25:15 +08:00
2026-09-15 21:20:59 +08:00
2026-09-15 18:00:16 +08:00
2026-09-15 18:00:16 +08:00
2026-09-15 12:05:16 +08:00
2026-09-15 15:55:20 +08:00
2026-09-15 14:26:33 +08:00
2026-09-16 09:07:44 +08:00
2026-09-16 09:31:17 +08:00
2026-09-16 15:19:13 +08:00
2026-09-16 20:27:40 +08:00
2026-09-16 09:33:11 +08:00
2026-09-16 10:02:36 +08:00
2026-09-17 09:17:58 +08:00
2026-09-16 14:47:30 +08:00
2026-09-16 14:47:30 +08:00
2026-09-16 09:07:44 +08:00
2026-09-16 15:19:13 +08:00
2026-09-17 10:02:58 +08:00
2026-09-16 16:38:33 +08:00
2026-09-16 17:32:08 +08:00
2026-09-16 17:32:08 +08:00
2026-09-16 23:36:33 +08:00
2026-09-17 10:28:11 +08:00
2026-09-16 16:30:54 +08:00
2026-09-16 16:30:54 +08:00
2026-09-17 18:28:13 +08:00
2026-09-17 18:59:49 +08:00
2026-09-19 04:39:22 +08:00
2026-09-18 08:06:47 +08:00
2026-09-17 15:03:13 +08:00
2026-09-17 10:30:52 +08:00
2026-09-17 23:52:43 +08:00
2026-09-17 10:28:11 +08:00
2026-09-17 11:19:18 +08:00
2026-09-17 10:50:57 +08:00
2026-09-17 11:32:37 +08:00
2026-09-17 19:51:40 +08:00
2026-09-17 15:03:13 +08:00
2026-09-17 19:20:15 +08:00
2026-09-17 22:04:10 +08:00
2026-09-17 17:19:11 +08:00
2026-09-17 16:57:15 +08:00
2026-09-19 03:34:37 +08:00
2026-09-18 11:37:47 +08:00
2026-09-20 16:00:55 +08:00
2026-09-18 14:35:27 +08:00
2026-09-18 11:50:41 +08:00
2026-09-18 12:23:13 +08:00
2026-09-18 14:57:27 +08:00
2026-09-18 14:57:27 +08:00
2026-09-20 15:20:24 +08:00
2026-09-20 15:20:24 +08:00
2026-09-18 16:13:51 +08:00
2026-09-18 16:10:53 +08:00
2026-09-18 17:22:48 +08:00
2026-09-20 13:27:20 +08:00
2026-09-18 16:10:53 +08:00
2026-09-18 16:10:53 +08:00
2026-09-20 12:05:46 +08:00
2026-09-19 14:35:25 +08:00
2026-09-20 13:27:20 +08:00
2026-09-20 11:04:32 +08:00
2026-09-20 13:43:08 +08:00
2026-09-20 17:41:05 +08:00
2026-09-20 15:35:01 +08:00
2026-09-20 13:27:20 +08:00
2026-09-20 17:39:04 +08:00
2026-09-20 17:39:04 +08:00
2026-09-20 13:27:20 +08:00
2026-09-20 16:09:06 +08:00
2026-09-20 17:43:23 +08:00
2026-09-20 16:39:25 +08:00
2026-09-20 17:47:14 +08:00
2026-09-20 16:09:06 +08:00
2026-09-20 16:09:06 +08:00
2026-09-20 13:27:20 +08:00
2026-09-20 15:20:24 +08:00
2026-09-20 15:06:57 +08:00
2026-09-20 17:39:04 +08:00
2026-09-20 17:39:04 +08:00