test(rectification): prove memoization in-process; tolerate golden float drift (BUG-733)
Independent Staging Quality Gate / validate (push) Canceled after 5m0s
Independent Staging Quality Gate / publish (push) Canceled after 0s

Replace whole-structure golden == with same-process cached vs None fallback equality, plus discrete-strict / measured-tolerance golden comparison. Do not rebuild the golden JSON.
This commit is contained in:
jesse-ux
2026-09-16 07:56:56 +08:00
parent 51a65d927f
commit 2b7b45657b
3 changed files with 243 additions and 2 deletions
+16
View File
@@ -11396,3 +11396,19 @@
- 相关记录:BUG-464
- 复发自:无
- 修复版本:待发布
## BUG-733 | 校正记忆化 golden 对全精度浮点做整体 `==`,跨机门禁靠运气绿
- 状态:resolved
- 首次发现:2026-09-15
- 最近更新:2026-09-16
- 影响面:`tests/test_rectification_engine_memoization.py``tests/golden/rectification_engine_memoization_v1.json`(文件未改)
- 用户现象:用户看不见。门禁 glob `tests/test_rectification_*.py``CORE_PYTEST_TARGETS` 里,换一台机器或基础镜像会因 `score` / `margin_percent` 尾数差 1.0e-41.1e-3 而红,CI 绿只是碰巧和生成 golden 的那台舍入一致。
- 触发条件:`test_score_candidates_matches_baseline_golden` 把 live payload 与 golden 做整体 `==`
- 根因:golden 存了全精度浮点并整体相等。这是 BUG-712 的同一形状。BUG-712 的防复发只落在 `ephemeris_events` 那一处(量化到 6 位再比),没有仓库级守卫,BUG-721 新写的 rectification golden 重蹈覆辙。
- 修复:只改测试,不动 `scripts/`。主证据改成同进程差分:同一批 static contextsA 带四层缓存、B 把 `ashtakavarga_result` / `shadbala_result` / `vimshottari_timeline` / `narayana_periods``None``compute_event_candidate_rows` 输出严格相等。golden 改成分档比较:离散字段严格相等;浮点用实测最大漂移 1.1e-3 推出的容差(绝对 2e-3 与相对 5e-4 取更宽者)。禁止调用 `write_golden()` 更新那份 JSON。
- 验证:同进程 A/B 逐字相等,且 B 的 `calc_shadbala` 次数显著高于 A(本机 6 vs 0)。反向:把某一层缓存换成全零 shadbala 对象后不再相等。golden 分档比较通过;把 golden 浮点改 1e-2 必须红;把离散字段 `time` 改掉必须红。`pytest tests/test_rectification_engine_memoization.py``pytest tests/test_rectification_*.py` 0 failed。golden JSON `git diff` 无改动。
- 防复发:任何 golden 比较都不得对浮点做整体 `==`;浮点必须量化或带容差,容差数值要有实测依据并写在注释里;能在同进程内做差分证明的命题,不得用跨机 golden 代替。
- 相关记录:BUG-712、BUG-721
- 复发自:BUG-712
- 修复版本:待发布