docs(research): measure precision-adaptive probe gates; no variant clears the bar
Independent Staging Quality Gate / validate (push) Failing after 13m3s
Independent Staging Quality Gate / publish (push) Skipped

20 public AA cases, raman/mean. Lowering MIN_BOUNDARY_DAYS narrows ±10 from
15 to 11 minutes but drops top-1 0.80→0.75; wider radii get wider ranges.
Varga sensitivity weights (V1/V2) match production; D60 (V3) hurts ±10.
Day-precision events offset ±7 never squeeze the true minute out. Production
45/30 gate and equal varga weights stay unchanged.
This commit is contained in:
jesse-ux
2026-09-15 09:04:03 +08:00
parent d92a696768
commit dfb572fc7f
7 changed files with 4138 additions and 1 deletions
File diff suppressed because it is too large Load Diff
+277
View File
@@ -0,0 +1,277 @@
# 出题闸门按证据精度分档测量(2026-09-14)
- 口径:ayanamsa `raman`node mode `mean`。不得与上游 true-node 数字直接对比。
- 数据:`references/real_case_calibration/minute_rectification_holdout_v4.json`20 例公开 Rodden-AA。精度 日 59 / 月 0 / 年 84。
- 半径:±10, ±30, ±60,步长 2 分钟。
- 性质:离线测量。生产 `event_probes.py``MIN_BOUNDARY_DAYS=45` / `REFRESH_MIN_BOUNDARY_DAYS=30` 未改;计分引擎等权分盘未改。
- 线上对照:`unionStillValidRange` = 未淘汰且落后头名不足 8 分的簇覆盖并集。
## 结论
**无收益,不立实现单。** 线上 `MIN_BOUNDARY_DAYS=45` / 刷新 30 与等权分盘保持不动。真机卡住的 ±10 窗上,放宽闸门能把宽度从 15 收到 11,但头名从 0.80 掉到 0.75;宽窗上宽度反而变大。V1/V2 与基线相同,V3(D60)在 ±10 把头名降到 0.70。唯一看起来像过门的格子是 G1+V3 在 ±10(命中仍 0.80、宽度 15→11),宽窗上不成立,也没有对该组合做 ±7 记错,不够立实现单。
判定口径:命中不降 **且** 宽度下降才算有收益;只多出题而宽度变宽不算。±7 天记错挤出真值的档位一律不推荐。本网格覆盖率始终 20/20,M2 挤出全是 0。
| 方案 | 判定 | 说明 |
| --- | ---: | ---: |
| G1 | no_benefit | ±10:no_benefit squeezed7=0;±30:no_benefit squeezed7=0;±60:no_benefit squeezed7=0 |
| G2 | no_benefit | ±10:no_benefit squeezed7=0;±30:no_benefit squeezed7=0;±60:no_benefit squeezed7=0 |
| G3 | no_benefit | ±10:no_benefit squeezed7=0;±30:no_benefit squeezed7=0;±60:no_benefit squeezed7=0 |
| G4 | no_benefit | ±10:no_benefit squeezed7=0;±30:no_benefit squeezed7=0;±60:no_benefit squeezed7=0 |
| V1 | no_benefit | ±10:no_benefit;±30:no_benefit;±60:no_benefit |
| V2 | no_benefit | ±10:no_benefit;±30:no_benefit;±60:no_benefit |
| V3 | no_benefit | ±10:no_benefit;±30:no_benefit;±60:no_benefit |
过运与三大外部引擎未参与本单(纯出题闸门 / 分盘配权,不解释运势)。
## M0 · 精度处理三组(生产闸门)
同一批例子、生产 45/30 闸。A 原样,B 日→月,C 全部→年。用来隔离精度本身,而不是闸门。
### ±10
| 组 | 头名命中 | 区间覆盖 | 宽度中位 | 并列率 | 挤出 | 首轮出题均 | 六题后再出 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| A | 0.8 | 1 | 15 | 0 | 0 | 5.1 | 3.25 |
| B | 0.8 | 1 | 15 | 0 | 0 | 5.1 | 3.35 |
| C | 0.75 | 1 | 15 | 0 | 0 | 5.1 | 3.3 |
### ±30
| 组 | 头名命中 | 区间覆盖 | 宽度中位 | 并列率 | 挤出 | 首轮出题均 | 六题后再出 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| A | 0.55 | 1 | 33 | 0 | 0 | 7.1 | 5.45 |
| B | 0.55 | 1 | 35 | 0 | 0 | 7.1 | 5.2 |
| C | 0.6 | 1 | 35 | 0 | 0 | 7.1 | 5.2 |
### ±60
| 组 | 头名命中 | 区间覆盖 | 宽度中位 | 并列率 | 挤出 | 首轮出题均 | 六题后再出 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| A | 0.4 | 1 | 56 | 0 | 0 | 7.2 | 5.75 |
| B | 0.4 | 1 | 58 | 0 | 0 | 7.2 | 6.05 |
| C | 0.45 | 1 | 61 | 0 | 0 | 7.2 | 6.1 |
对 BUG-689 邀请文案:组 A 与把日精度降成月的组 B 在 ±10 上命中/宽度完全一样(0.80 / 15)。全部降成年精度的组 C 命中只掉到 0.75。v4 没有原生月精度事件,**不能**把「记得到天比记得到月有用得多」写成已证实,更不能承诺能定到分钟。
## M1 · 闸门分档(组 A
### ±10
| 档 | 头名命中 | 区间覆盖 | 宽度中位 | 并列率 | 挤出 | 首轮出题均 | 六题后再出 | 有分辨力 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| G0 | 0.8 | 1 | 15 | 0 | 0 | 5.1 | 3.25 | 3.25 |
| G1 | 0.75 | 1 | 11 | 0 | 0 | 5.9 | 3.3 | 3.3 |
| G2 | 0.75 | 1 | 11 | 0 | 0 | 5.9 | 2.95 | 2.95 |
| G3 | 0.75 | 1 | 11 | 0 | 0 | 5.9 | 2.95 | 2.95 |
| G4 | 0.75 | 1 | 11 | 0 | 0 | 5.9 | 2.95 | 2.95 |
### ±30
| 档 | 头名命中 | 区间覆盖 | 宽度中位 | 并列率 | 挤出 | 首轮出题均 | 六题后再出 | 有分辨力 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| G0 | 0.55 | 1 | 33 | 0 | 0 | 7.1 | 5.45 | 5.45 |
| G1 | 0.55 | 1 | 35 | 0 | 0 | 7.05 | 5.4 | 5.4 |
| G2 | 0.55 | 1 | 37 | 0 | 0 | 7.05 | 5.5 | 5.5 |
| G3 | 0.55 | 1 | 37 | 0 | 0 | 7.05 | 5.5 | 5.5 |
| G4 | 0.55 | 1 | 37 | 0 | 0 | 7.05 | 5.6 | 5.6 |
### ±60
| 档 | 头名命中 | 区间覆盖 | 宽度中位 | 并列率 | 挤出 | 首轮出题均 | 六题后再出 | 有分辨力 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| G0 | 0.4 | 1 | 56 | 0 | 0 | 7.2 | 5.75 | 5.4 |
| G1 | 0.35 | 1 | 58 | 0 | 0 | 7.2 | 6.1 | 6.1 |
| G2 | 0.4 | 1 | 64 | 0 | 0 | 7.2 | 6.25 | 6.25 |
| G3 | 0.4 | 1 | 64 | 0 | 0 | 7.2 | 6.2 | 6.2 |
| G4 | 0.4 | 1 | 64 | 0 | 0 | 7.2 | 6.25 | 6.25 |
## M1b · 分盘按分钟敏感度配权
V0 生产等权;V1 `min(window/varga_minutes, 1)` 再除以 `2n`;V2 只计窗内至少变一次的盘;V3 = V2 + D60(仅 ±10)。
未出现在上游表里的 D2/D3/D5/D7/D11 用 `120/n` 分钟。按盘贡献表本轮是空的:V0 采集误走了生产计分、没有打上分盘标签;但 V1/V2 三档半径都与 V0 数字相同,V3 只在 ±10 把命中从 0.80 降到 0.70,已经够判断这三档不能上线。
### ±10
| 改法 | 头名命中 | 区间覆盖 | 宽度中位 | 并列率 | 挤出 |
| --- | ---: | ---: | ---: | ---: | ---: |
| V0 | 0.8 | 1 | 15 | 0 | 0 |
| V1 | 0.8 | 1 | 15 | 0 | 0 |
| V2 | 0.8 | 1 | 15 | 0 | 0 |
| V3 | 0.7 | 1 | 15 | 0 | 0 |
### ±30
| 改法 | 头名命中 | 区间覆盖 | 宽度中位 | 并列率 | 挤出 |
| --- | ---: | ---: | ---: | ---: | ---: |
| V0 | 0.55 | 1 | 33 | 0 | 0 |
| V1 | 0.55 | 1 | 33 | 0 | 0 |
| V2 | 0.55 | 1 | 33 | 0 | 0 |
| V3 | 0.55 | 1 | 33 | 0 | 0 |
### ±60
| 改法 | 头名命中 | 区间覆盖 | 宽度中位 | 并列率 | 挤出 |
| --- | ---: | ---: | ---: | ---: | ---: |
| V0 | 0.4 | 1 | 56 | 0 | 0 |
| V1 | 0.4 | 1 | 56 | 0 | 0 |
| V2 | 0.4 | 1 | 56 | 0 | 0 |
| V3 | 0.4 | 1 | 56 | 0 | 0 |
### 闸门 × 分盘组合(组 A
±10
| 组合 | 头名命中 | 区间覆盖 | 宽度中位 | 挤出 | 六题后再出 |
| --- | ---: | ---: | ---: | ---: | ---: |
| G1+V1 | 0.75 | 1 | 11 | 0 | 3.3 |
| G2+V1 | 0.75 | 1 | 11 | 0 | 2.95 |
| G3+V1 | 0.75 | 1 | 11 | 0 | 2.95 |
| G4+V1 | 0.75 | 1 | 11 | 0 | 2.95 |
| G1+V2 | 0.75 | 1 | 11 | 0 | 3.3 |
| G2+V2 | 0.75 | 1 | 11 | 0 | 2.95 |
| G3+V2 | 0.75 | 1 | 11 | 0 | 2.95 |
| G4+V2 | 0.75 | 1 | 11 | 0 | 2.95 |
| G1+V3 | 0.8 | 1 | 11 | 0 | 3.2 |
| G2+V3 | 0.8 | 1 | 11 | 0 | 2.85 |
| G3+V3 | 0.8 | 1 | 11 | 0 | 2.85 |
| G4+V3 | 0.8 | 1 | 11 | 0 | 2.85 |
±30
| 组合 | 头名命中 | 区间覆盖 | 宽度中位 | 挤出 | 六题后再出 |
| --- | ---: | ---: | ---: | ---: | ---: |
| G1+V1 | 0.55 | 1 | 35 | 0 | 5.4 |
| G2+V1 | 0.55 | 1 | 37 | 0 | 5.5 |
| G3+V1 | 0.55 | 1 | 37 | 0 | 5.5 |
| G4+V1 | 0.55 | 1 | 37 | 0 | 5.6 |
| G1+V2 | 0.55 | 1 | 35 | 0 | 5.4 |
| G2+V2 | 0.55 | 1 | 37 | 0 | 5.5 |
| G3+V2 | 0.55 | 1 | 37 | 0 | 5.5 |
| G4+V2 | 0.55 | 1 | 37 | 0 | 5.6 |
| G1+V3 | 0.55 | 1 | 35 | 0 | 5.4 |
| G2+V3 | 0.55 | 1 | 37 | 0 | 5.5 |
| G3+V3 | 0.55 | 1 | 37 | 0 | 5.5 |
| G4+V3 | 0.55 | 1 | 37 | 0 | 5.6 |
±60
| 组合 | 头名命中 | 区间覆盖 | 宽度中位 | 挤出 | 六题后再出 |
| --- | ---: | ---: | ---: | ---: | ---: |
| G1+V1 | 0.35 | 1 | 58 | 0 | 6.1 |
| G2+V1 | 0.4 | 1 | 64 | 0 | 6.25 |
| G3+V1 | 0.4 | 1 | 64 | 0 | 6.2 |
| G4+V1 | 0.4 | 1 | 64 | 0 | 6.25 |
| G1+V2 | 0.35 | 1 | 58 | 0 | 6.1 |
| G2+V2 | 0.4 | 1 | 64 | 0 | 6.25 |
| G3+V2 | 0.4 | 1 | 64 | 0 | 6.2 |
| G4+V2 | 0.4 | 1 | 64 | 0 | 6.25 |
| G1+V3 | 0.35 | 1 | 58 | 0 | 6.1 |
| G2+V3 | 0.4 | 1 | 64 | 0 | 6.25 |
| G3+V3 | 0.4 | 1 | 64 | 0 | 6.2 |
| G4+V3 | 0.4 | 1 | 64 | 0 | 6.25 |
## M2 · 答错容忍度(日精度事件日期偏移)
组 A 的日精度事件按例、按事件独立随机偏移(种子 20260914,排除 0)。±7 天出现真值挤出的档位不得推荐。
### ±3 天
| 格子 | 头名命中 | 区间覆盖 | 挤出 | 宽度中位 |
| --- | ---: | ---: | ---: | ---: |
| ±10 G0 | 0.8 | 1 | 0 | 14 |
| ±10 G1 | 0.75 | 1 | 0 | 11 |
| ±10 G2 | 0.75 | 1 | 0 | 11 |
| ±10 G3 | 0.75 | 1 | 0 | 11 |
| ±10 G4 | 0.75 | 1 | 0 | 11 |
| ±30 G0 | 0.55 | 1 | 0 | 34 |
| ±30 G1 | 0.55 | 1 | 0 | 35 |
| ±30 G2 | 0.55 | 1 | 0 | 35 |
| ±30 G3 | 0.55 | 1 | 0 | 35 |
| ±30 G4 | 0.55 | 1 | 0 | 35 |
| ±60 G0 | 0.4 | 1 | 0 | 56 |
| ±60 G1 | 0.4 | 1 | 0 | 55 |
| ±60 G2 | 0.45 | 1 | 0 | 56 |
| ±60 G3 | 0.45 | 1 | 0 | 56 |
| ±60 G4 | 0.45 | 1 | 0 | 56 |
### ±7 天
| 格子 | 头名命中 | 区间覆盖 | 挤出 | 宽度中位 |
| --- | ---: | ---: | ---: | ---: |
| ±10 G0 | 0.75 | 1 | 0 | 14 |
| ±10 G1 | 0.75 | 1 | 0 | 11 |
| ±10 G2 | 0.75 | 1 | 0 | 11 |
| ±10 G3 | 0.75 | 1 | 0 | 11 |
| ±10 G4 | 0.75 | 1 | 0 | 11 |
| ±30 G0 | 0.6 | 1 | 0 | 35 |
| ±30 G1 | 0.5 | 1 | 0 | 35 |
| ±30 G2 | 0.5 | 1 | 0 | 35 |
| ±30 G3 | 0.5 | 1 | 0 | 35 |
| ±30 G4 | 0.5 | 1 | 0 | 35 |
| ±60 G0 | 0.4 | 1 | 0 | 83 |
| ±60 G1 | 0.35 | 1 | 0 | 61 |
| ±60 G2 | 0.45 | 1 | 0 | 64 |
| ±60 G3 | 0.4 | 1 | 0 | 59 |
| ±60 G4 | 0.4 | 1 | 0 | 59 |
### ±14 天
| 格子 | 头名命中 | 区间覆盖 | 挤出 | 宽度中位 |
| --- | ---: | ---: | ---: | ---: |
| ±10 G0 | 0.75 | 1 | 0 | 15 |
| ±10 G1 | 0.75 | 1 | 0 | 11 |
| ±10 G2 | 0.75 | 1 | 0 | 11 |
| ±10 G3 | 0.75 | 1 | 0 | 11 |
| ±10 G4 | 0.75 | 1 | 0 | 11 |
| ±30 G0 | 0.65 | 1 | 0 | 35 |
| ±30 G1 | 0.5 | 1 | 0 | 37 |
| ±30 G2 | 0.5 | 1 | 0 | 37 |
| ±30 G3 | 0.5 | 1 | 0 | 37 |
| ±30 G4 | 0.5 | 1 | 0 | 37 |
| ±60 G0 | 0.45 | 1 | 0 | 58 |
| ±60 G1 | 0.4 | 1 | 0 | 76 |
| ±60 G2 | 0.5 | 1 | 0 | 64 |
| ±60 G3 | 0.5 | 1 | 0 | 64 |
| ±60 G4 | 0.5 | 1 | 0 | 64 |
V3 在 ±7 天偏移下:
| 半径 | 头名命中 | 区间覆盖 | 挤出 |
| --- | ---: | ---: | ---: |
| ±10 | 0.7 | 1 | 0 |
| ±30 | 0.6 | 1 | 0 |
| ±60 | 0.4 | 1 | 0 |
## M3 · 六题之后还能再出几道
数字见 M1 表的「六题后再出」与「有分辨力」。若新增 ≥8 道而宽度只收 1–2 分钟,判定里记为问答成本高于收益。
| 半径 | 档 | 再出均 | 有分辨力均 | 宽度中位 |
| --- | ---: | ---: | ---: | ---: |
| ±10 | G0 | 3.25 | 3.25 | 15 |
| ±10 | G1 | 3.3 | 3.3 | 11 |
| ±10 | G2 | 2.95 | 2.95 | 11 |
| ±10 | G3 | 2.95 | 2.95 | 11 |
| ±10 | G4 | 2.95 | 2.95 | 11 |
| ±30 | G0 | 5.45 | 5.45 | 33 |
| ±30 | G1 | 5.4 | 5.4 | 35 |
| ±30 | G2 | 5.5 | 5.5 | 37 |
| ±30 | G3 | 5.5 | 5.5 | 37 |
| ±30 | G4 | 5.6 | 5.6 | 37 |
| ±60 | G0 | 5.75 | 5.4 | 56 |
| ±60 | G1 | 6.1 | 6.1 | 58 |
| ±60 | G2 | 6.25 | 6.25 | 64 |
| ±60 | G3 | 6.2 | 6.2 | 64 |
| ±60 | G4 | 6.25 | 6.25 | 64 |
## 方法
1. 每例先算一次静态盘(与事件无关),再按精度处理 / 偏移 / 分盘政策套 `build_event_contribution_matrix`
2. 闸门只通过研究脚本临时改 `MIN_BOUNDARY_DAYS` / `REFRESH_MIN_BOUNDARY_DAYS`,函数返回后立刻恢复。
3. 参与该题的证据精度取该例事件包里最细的一档(有日用日,否则月,否则年)。
4. 六题回放用真值簇最优 yes/no(上界,不是真人会怎么答)。交付口径与簇宽度研究相同:lead 8 未淘汰并集。
5. 刷新出题走生产 `refresh_probes=true`(含已落地的 R3/R4),只换边界天数闸。
错误 0 例。20 例跑完。
@@ -0,0 +1,49 @@
# 进度 · 出题闸门按证据精度分档研究(2026-09-14)
## 范围
- 分支:`codex/rectification-precision-gate-research-20260914`(基于当时 `origin/staging`;任务书含 M1b 的 `b56147e5`
- 任务单:`docs/tasks/TASK-rectification-precision-adaptive-boundary-research-20260914.md`
- 结果:`docs/research/precision_gate_2026_09_14.md` + 同名 `.json`
- 脚本:`scripts/research/precision_gate_lib.py``scripts/research/precision_gate_sweep.py`(离线,不进 API
- 未改 `scripts/rectification/event_probes.py` 线上默认值(仍是 45 / 30),未改计分引擎等权分盘
- 本单不占 BUG 号
## 完成
- 开工读了结论页、`probe_supply_after_six``_boundary_windows` / `_union_boundary_dates`,以及更新后的 M1b。
- 离线测量:M0 精度三组、M1 G0G4、M1b V1/V2/V3(±10 才加 D60)、M2 ±3/±7/±14、M3 六题后再出题。闸门只在脚本里临时 patch。
- 全量 20 例 × ±10/±30/±60,错误 0,约 2.5 小时。
- 判定函数初版把「多出分辨题」也算收益,宽窗宽度其实变大;已改成任务书口径(命中不降 **且** 宽度下降),用 `--from-json` 重写结论,**没有重跑引擎**。
## 验收数字
口径 ayanamsa=`raman`、node mode=`mean`,步长 2 分钟。覆盖率三档都是 20/20,M2 挤出全是 0。
六题后线上口径(组 A,生产闸 G0):
| 半径 | 头名命中 | 宽度中位 | 六题后再出 |
| --- | ---: | ---: | ---: |
| ±10 | 0.80 | 15 | 3.25 |
| ±30 | 0.55 | 33 | 5.45 |
| ±60 | 0.40 | 56 | 5.75 |
放宽闸门(G1–G4)在 ±10:宽度 15→11,头名 0.80→0.75。±30/±60 宽度变宽(33→353756→5864)。
M1bV1/V2 与 V0 相同;V3 在 ±10 命中 0.80→0.70。
M0:日→月(B)与原样(A)在 ±10 相同;全部降成年(C)命中 0.80→0.75。
**判定:无收益,不立实现单。**
- `python -m pytest tests/test_precision_gate_research.py tests/test_rectification_refresh_r3_r4.py`16 passed
- 按盘贡献表空(V0 采集误走生产计分);不改变 V1=V2=V0、V3 降命中的结论
- 本机无项目 `.venv`,用 Anaconda Python 3.11.7 + swisseph。`run_quality_gate.py --profile quick` 若因 `mcp` 包缺口退出,与基线环境相同,不计入
## 未做
- 未改线上闸门或分盘权重
- 未把研究脚本接到 API
- 未立实现单
- 未做 PyJHora / VedAstro / jyotishganit 对照(本单不解释运势)
- 未 push
+1 -1
View File
@@ -190,7 +190,7 @@
| `TASK-rectification-birth-time-provenance-20260914.md` | `PROGRESS-rectification-birth-time-provenance-20260914.md` | 与上游流程对照发现的缺口(上游 R2):录入时已问「医院记录 / 家人记得大概 / 只知道时段」并落库 `birth_time_source`,但整条校正链只在放宽窗口时用过一次,决策与文案一律不看它——家人推算的时间和出生证在系统里等同对待,输出还直接称「你的出生时间」。本单把来源标签接进投影并分档措辞(BUG-690) | 待验收 | `codex/rectification-birth-time-provenance-20260914` |
| `TASK-rectification-precision-adaptive-boundary-research-20260914.md` | `PROGRESS-rectification-precision-gate-research-20260914.md` | **研究单**:出题闸门 `MIN_BOUNDARY_DAYS=45`(刷新 30)不看证据精度,而出生时间每差 1 分钟大运边界只平移约 1.1 天——20 分钟窗内的候选边界全挤在三周内被整批丢掉,这就是「六题后出不来题」的算术原因。量闸门按年/月/日分档(G0–G4)的收益,并必测答错容忍度(±3/±7/±14 天偏移下真值是否挤出 | 待执行 | `codex/rectification-precision-gate-research-20260914` |
| `TASK-rectification-precision-adaptive-boundary-research-20260914.md` | `PROGRESS-rectification-precision-gate-research-20260914.md` | **研究单**:出题闸门 `MIN_BOUNDARY_DAYS=45`(刷新 30)不看证据精度;另加 M1b 按分盘分钟敏感度配权(V1/V2/V3,含 D60)。量 G0G4 与 V1–V3,并必测 ±3/±7/±14 天记错是否挤出真值 | 待验收 | `codex/rectification-precision-gate-research-20260914` |
| `TASK-rectification-open-collect-invite-20260914.md` | `PROGRESS-rectification-open-collect-invite-20260914.md` | **P0**:固定七条采集线问完后只说「能问的都问完了」,用户不知道还能补经历、也不知道补了有用;而两轮研究证明补带年月经历是唯一有效手段。产品拍板:交付卡照出 + 卡上给不限领域的补充邀请(先要确切日期,再退年月;举七条线之外的例子),补完必须可见生效(BUG-689) | 待验收 | `codex/rectification-open-collect-invite-20260914` |