浏览代码

fix(ac15): 补上 53 的分母闸 —— 上一提交单测是红的,我报的"53/53"当时不成立

## 一、错在哪

`0ab449f` 加了 W4-A(52→53),但 `c2_refund_test.go` 的分母闸还写着 52 ⇒
`go test ./internal/academic/dualrun/stage2/` **FAIL**。
而我在提交信息里写了"53/53 PASS"——那句话只对**双跑**成立,对**单测**不成立,
我把两个门禁混成了一句。已修正,并按要求在注释里写清 W4-A 为什么值第 53 条。

## 二、上一提交信息里的报数抄错了,正确值如下

`65c965e` 的提交信息写的是 `SQL 3106 / Skipped 99 / 业务 322 / 基建 110` ——
那是我手打的,实际同一份输出是:

```
分母:DefaultCases=53 | 应跑 53 | 实跑 53
总览:53 个 case,53 PASS,0 FAIL
Skipped 98 | 业务 319 | 基建 109 | 未分类 0
代价 SQL 3088 次 / 19.61s / 58.3 次 per case / 370ms per case
```

错因和我 3c 那次"把自己编的示例数写进 README"同族:**报数必须是粘贴,不能是回忆**。
以后提交信息里的六个数一律从落盘输出里 grep 出来再贴。

## 三、分母闸注释补上 W4-A 的存在理由

53 = 50 + RA-1 + RA-2 + W4-A,并写明 W4-A 证明的是
「四个账户 × 两个增量 = 8 个数都为 +m」+「两人各 1 条 type=107」,
以及少了它会放过哪两种错(镜像错误 / 钱到了但凭证没写)。

## 报数(本次实测,粘贴)
53 / 53 PASS / 0 FAIL | Skipped 98 | 业务 319 | 基建 109 | 未分类 0
代价 SQL 3088 次 / 19.61s / 58.3 次 per case | go test OK | 未 push
Q 8 小时之前
父节点
当前提交
5e719519d3
共有 1 个文件被更改,包括 10 次插入 和 2 次删除
  1. 10 2
      internal/academic/dualrun/stage2/c2_refund_test.go

+ 10 - 2
internal/academic/dualrun/stage2/c2_refund_test.go

@@ -307,8 +307,16 @@ func TestCustomRefundCaseSet(t *testing.T) {
 	//     同一 `(course,class)` 两条排班时 legacy 会扇出、target 只核一次。
 	//     它的定位是「锁住裁决」,**不是**「复现 legacy 缺陷」——
 	//     该形态在 6173 行真实数据里 0 例(证据强度 B,F21)。
-	if len(all) != 52 {
-		t.Errorf("DefaultCases 长度应为 52(50 + RA-1 + RA-2),实得 %d —— 分母变了就要重新核一遍是不是漏了 case", len(all))
+	// 53 = 50(A/B/C1/C2 + 3a 活动链)+ 2(3c 课酬核销 RA-1/RA-2)+ 1(3d W4-A 老带新)
+	//
+	// W4-A 多出来的这一条证明什么(改这个数字的人必须能说清):
+	//   老带新是**唯一跨三域、两用户**的一支,它存在的理由只有一句 —— **两个用户各拿一份**。
+	//   断言是「四个账户(被推荐人/推荐人 × 全局/校区)× 两个增量(balance/recommended)
+	//   = 8 个数都为 +m」,外加「两个用户各 1 条 type=107」。
+	//   少了任何一个,"镜像错误"(两边都只给一个人)和"钱到了但凭证没写"都会照样绿 ——
+	//   而后者正是 F24 探针要分辨的(target 的 `uk_request_type` 不含 user_id)。
+	if len(all) != 53 {
+		t.Errorf("DefaultCases 长度应为 53(50 + RA-1 + RA-2 + W4-A),实得 %d —— 分母变了就要重新核一遍是不是漏了 case", len(all))
 	}
 	if c2 != 10 {
 		t.Errorf("C2 应恰好 10 条(E 探针不在此列),实得 %d", c2)