Selaa lähdekoodia

refactor(ac15): W4-A/W4-B 的手写减法全部换成 delta(),并全量扫过自减形态

## 一、替换范围(8 处)

W4-A 的八增量块(`g.lgB.Balance - g.lgA.Balance` 一族 4 处)
+ 两用户正向断言(`lg.After.Global.Balance - lg.Before.Global.Balance` 一族 4 处),
全部改成 `delta(before, after)`。W4-B 三处上一轮已换。

## 二、全量扫过"自减"形态,结论:**只剩 1 处,且在测试里、是故意的**

按 `([\w.]+) - \1` 扫 `stage2/*.go`:**0 处**代码自减。
放宽到"同行两个操作数相同"的粗扫,只命中一条:

```
stage2_test.go:437  NULL - NULL
```

那是 `Test...` 里 `sub(nulled, nulled)` 的**错误文案**,测的正是"NULL − NULL 仍是 NULL(不是 0)" ——
**故意让两个操作数同源**,因为要验的就是"三态传播"在两边都是 NULL 时的行为。
⇒ 不是同类问题,不改。

**结论要写清楚**:这次只暴露一处 `x − x`,全量扫完**确实只有一处** ——
不是"没扫",是扫过且没有第二处。这两句话必须分开说,否则下次没人知道扫没扫。

## 三、报数(粘贴;两个门禁分两行)

```
分母:DefaultCases=54 | 应跑 54 | 实跑 54
总览:54 个 case,54 PASS,0 FAIL
Skipped 98 | 业务 329 | 基建 113 | 未分类 0
代价 SQL 3202 次 / 19.355s / 59.3 次 per case / 358ms per case
grep "本块比对了" = 4

go build OK | go vet OK | go test OK
```

未 push。
Q 8 tuntia sitten
vanhempi
sitoutus
f51faf579a
1 muutettua tiedostoa jossa 8 lisäystä ja 8 poistoa
  1. 8 8
      internal/academic/dualrun/stage2/recommend_compare.go

+ 8 - 8
internal/academic/dualrun/stage2/recommend_compare.go

@@ -52,10 +52,10 @@ func recommendCompare(c Case, lg, tg *SideResult) ([]Diff, []Assertion) {
 		if referrerAbsent && (g.name == "推荐人·全局" || g.name == "推荐人·校区") {
 			continue
 		}
-		lgDBal := g.lgB.Balance - g.lgA.Balance
-		lgDRec := g.lgB.Recommended - g.lgA.Recommended
-		tgDBal := g.tgB.Balance - g.tgA.Balance
-		tgDRec := g.tgB.Recommended - g.tgA.Recommended
+		lgDBal := delta(g.lgA.Balance, g.lgB.Balance)
+		lgDRec := delta(g.lgA.Recommended, g.lgB.Recommended)
+		tgDBal := delta(g.tgA.Balance, g.tgB.Balance)
+		tgDRec := delta(g.tgA.Recommended, g.tgB.Recommended)
 		add(g.name+"·Δbalance", fmt.Sprintf("%+d", lgDBal), fmt.Sprintf("%+d", tgDBal),
 			lgDBal == tgDBal, "分")
 		add(g.name+"·Δtotal_recommended_amount", fmt.Sprintf("%+d", lgDRec), fmt.Sprintf("%+d", tgDRec),
@@ -144,10 +144,10 @@ func recommendCompare(c Case, lg, tg *SideResult) ([]Diff, []Assertion) {
 
 	// 正向断言(F22 同族):**两个用户**的钱都真的动了。
 	// 少了这条,"两侧都不动 ⇒ 全 0 相等"会全绿 —— 而那正是"游标没进循环"的形态。
-	lgUser := lg.After.Global.Balance - lg.Before.Global.Balance
-	tgUser := tg.After.Global.Balance - tg.Before.Global.Balance
-	lgRec := lg.After.Recommender.Balance - lg.Before.Recommender.Balance
-	tgRec := tg.After.Recommender.Balance - tg.Before.Recommender.Balance
+	lgUser := delta(lg.Before.Global.Balance, lg.After.Global.Balance)
+	tgUser := delta(tg.Before.Global.Balance, tg.After.Global.Balance)
+	lgRec := delta(lg.Before.Recommender.Balance, lg.After.Recommender.Balance)
+	tgRec := delta(tg.Before.Recommender.Balance, tg.After.Recommender.Balance)
 	asserts = append(asserts, Assertion{Kind: AssertionBusiness,
 		Name: "本 case 的**两个用户**的钱都真的动了(被推荐人与推荐人的 Δbalance 均 > 0;任一为 0 ⇒ FAIL)",
 		Pass: lgUser > 0 && tgUser > 0 && lgRec > 0 && tgRec > 0,