Files
Jyotisha/docs/tasks/TASK-rectification-precision-adaptive-boundary-research-20260914.md
T
Jesse_ChenandClaude Fable 5 b56147e524 docs(tasks): varga sensitivity weighting, and birth-time provenance labels
与上游流程对照补两处。①精度研究单加 M1b:上游有一张分盘分钟敏感度表
(D60=2 / D30=4 / D24=5 / D9=13.3 / D1=120 分钟换一次上升),而本仓 11 张分盘
等权再除以 22(且没有 D60)——20 分钟窗里 D30 和 D2 同分量,分辨率最高的盘被
稀释。测 V1 反比配权 / V2 按窗宽选盘 / V3 加 D60,并报过拟合风险。
②新任务书 BUG-690:录入已收 birth_time_source 三类,但校正链只用过一次,
推算值与医院记录等同对待、输出直称「你的出生时间」。接进投影并按来源分档措辞;
医院记录与校正结果冲突时怎么说挂给产品。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 14:44:15 +00:00

134 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 研究单 · 出题闸门按证据精度分档(2026-09-14)
- 基线:`origin/staging` @ `558d43c8`(代码 `963c147c`staging 已部署)。
- 分支:`codex/rectification-precision-gate-research-20260914`worktree `.worktrees/rectification-precision-gate-research-20260914`
- 性质:**离线测量,不改线上行为。** 有收益且风险可控才另立实现单。
- 前序:`docs/research/rectification_minute_resolution_closure_2026_09_14.md`(两轮定论:加权重、改聚类都不行,唯一有效的是用户补带年月经历)、`docs/research/probe_supply_after_six_2026_09_13.md`R3/R4 已实现,收益有限)。
## 1. 问题:现在的闸门是固定的,不看证据精度
引擎造"能区分候选"的题,靠的是两个候选分钟在同一段时间里的**大运边界落在不同月份**。但有一道固定闸:
```python
# scripts/rectification/event_probes.py:543 _boundary_windows
if one.year == two.year and abs((one - two).days) < threshold: # MIN_BOUNDARY_DAYS = 45,刷新阶段 30
continue
```
配合这个换算(月亮每分钟约 0.0092°,Vimshottari 1° ≈ 122 天):
> **出生时间每差 1 分钟,所有 Vimshottari 边界整体平移约 1.1 天。**
| 候选相隔 | 边界相差 | 45 天闸 | 30 天闸(刷新) |
| --- | ---: | --- | --- |
| 40 分钟 | ≈ 45 天 | 可出题 | 可出题 |
| 27 分钟 | ≈ 30 天 | 不可 | 勉强 |
| **20 分钟(真机常见窗口)** | **≈ 22 天** | **不可** | **不可** |
| 2 分钟 | ≈ 2 天 | 不可 | 不可 |
**这解释了"六题之后引擎就出不来题"**:剩余候选已经挤在 20 分钟内,它们的大运边界全部落在三周之内,被闸门整批丢掉。闸门本身是对的——月精度的记忆分不开相差 20 天的两条边界,问了也是白问。
**缺口在于:`event_probes.py` 从不读证据的日期精度**(全文没有 `date_precision` / `precision` 字样,`min_days` 只有两个固定取值)。所以哪怕用户给的是「2020 年 4 月 13 日入职」这种**日精度**事件,闸门仍按 45 天卡。可日精度事件本来可以分辨相差 5 天的边界——对应约 **5 分钟**的出生时间分辨率,正好是目前卡住的那一档。
## 2. 要量的东西
样本:`references/real_case_calibration/minute_rectification_holdout_v4.json`(20 例公开 AA)。实测精度分布:**日精度 59 件、年精度 84 件**,平均每例约 3 件日精度事件——够做这次测量。
### M0 · 精度处理三组(必做,用来隔离"精度本身"的收益)
真机会话以**月精度**为主,而 v4 只有年/日两档。所以同一批案例跑三组:
| 组 | 处理 |
| --- | --- |
| A | 原样(日 59 / 年 84 |
| B | 全部日精度降级成月精度 |
| C | 全部降级成年精度 |
三组都按当前生产闸门跑一遍,得到基线;这样后面的收益能归因到"精度"而不是"样本差异"。
### M1 · 闸门分档
`_boundary_windows``threshold` 从固定值改成**按参与该题的证据精度取值**,测这几档:
| 档 | 年精度证据 | 月精度证据 | 日精度证据 |
| --- | ---: | ---: | ---: |
| G0(现状) | 45 | 45 | 45 |
| G1 | 45 | 30 | 10 |
| G2 | 45 | 30 | 7 |
| G3 | 45 | 21 | 5 |
| G4 | 60 | 30 | 3 |
指标沿用既有五项 + 两项新的:真实分钟命中率、**真值落在交付区间的比例(不得下降)**、区间宽度中位、并列率、每轮熵降;新增 **出题数**(每例新增几道)与 **每道题的区分力**(真值簇能否落到 yes/no 一侧且另一侧还有候选)。
### M1b · 分盘按分钟敏感度配权(上游对照新增)
上游 `jyotish-app/rectification-engine.js` 开头有一张**分盘分钟敏感度表**(每张盘多少分钟换一次上升):
| 分盘 | D1 | D9 | D10 | D12 | D4 | D24 | D30 | D60 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 换一次需要(分钟) | 120 | 13.3 | 12 | 10 | 7.5 | 5 | 4 | **2** |
本仓没有等价物:`scripts/active_rectification_event_engine.py:454` 计分用 D2/D3/D4/D5/D7/D9/D10/D11/D12/D24/D30 共 11 张(**没有 D60**),而 `:231``points += weight / (2 * len(varga_charts))`——**全部等权再除以 22**。于是在 20 分钟窗口里,每 4 分钟换一次的 D30 和一小时才换一次的 D2 拿到相同分量:**分辨率最高的盘被分辨率最低的盘稀释**。上一轮 R1 只整体调过除数,从未按每张盘的敏感度配权,这是没测过的角度。
测这三档(与 M1 的闸门档位正交,先各自单测再组合):
| 编号 | 改法 |
| --- | --- |
| V1 | 权重与敏感度成反比:`weight × (window_minutes / varga_minutes)` 上限截断,`varga_minutes` 取上表 |
| V2 | 只给"在当前窗口内至少变化一次"的分盘计分,其余不计(等价于按窗宽动态选盘) |
| V3 | V2 基础上加入 **D60**(每 2 分钟换一次),仅在窗口 ≤10 分钟时启用 |
额外要报的两项:
- **过拟合风险**:上游决策树明确写 D30/D60「最后谨慎使用」。对 V3 必须报告真值覆盖率与 ±7 天记错偏移下的表现;覆盖率下降或挤出真值一律不推荐。
- **每张盘的实际贡献**:统计各分盘在 20 例上触发计分的次数与对头名变化的贡献,用来判断 11 张盘里有没有纯噪声项。
### M2 · 答错容忍度(必做,这是本单最大的风险)
日精度门槛越低,越依赖用户记准日子。模拟用户记错:把日精度事件的日期**随机偏移 ±3 / ±7 / ±14 天**,各跑一遍,统计:
- **真值被淘汰出交付区间的例数**(这是最严重的错误,`AGENTS.md` Part B B4);
- 头名命中率的下降幅度。
**判定规则:任何一档若在 ±7 天偏移下出现真值被挤出,该档不得推荐上线。**
### M3 · 体验代价
统计每档下"问满六题之后还能再出几道题",以及这些题的平均区分力。若某档新增 8 道题但平均只收窄 1–2 分钟,要在结论里标明"问答成本高于收益"。
## 3. 交付
- `scripts/research/precision_gate_sweep.py`(新,离线,不接生产)+ `docs/research/precision_gate_2026_09_14.md` / `.json`。M1b 的结果同文件单列一节。
- 口径声明与前两轮一致(ayanamsa `raman`、node mode `mean`),不得与上游 true-node 数字直接比。
- 结论只允许三种:**有收益**(命中率上升或宽度下降,真值覆盖率不降,且 ±7 天偏移下不挤出)→ 立实现单并给推荐档位;**无收益** → 关闭;**不确定** → 说明缺什么。
- 不得改 `scripts/rectification/event_probes.py` 的线上默认值。
## 4. 硬红线
1. Python 改动跑 `.venv/bin/python scripts/run_quality_gate.py --profile quick`(已知既有缺口:`test_shadbala_endpoint_returns_ranked_planet_strength`,时区依赖缺失,基线同样红,不计入)。
2. **真值覆盖率优先于区间宽度**:任何把真实分钟挤出交付区间的档位一律不推荐,哪怕命中率更高。
3. 不得放宽置信度或确认门控;不得让性格题参与淘汰(既有红线)。
4. 不得使用真实用户资料。
5. 结论必须落到数字。
## 5. 与 BUG-689 的联动
本单若有收益,`TASK-rectification-open-collect-invite-20260914.md` 的邀请文案要同步:**优先请用户说"记得确切是哪一天"的事**(登记结婚那天、入职第一天、手术那天、孩子出生那天、拿到录取通知那天),并说明"记得到天的事比记得到月的事有用得多"。该文案改动已写进 BUG-689 单的 D1,不必等本单结论——但"有用得多"这句的强度要按本单结果调整,**不得在没有数据前承诺能定到分钟**。
## 6. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/rectification-precision-gate-research-20260914 \
.worktrees/rectification-precision-gate-research-20260914 origin/staging
cd .worktrees/rectification-precision-gate-research-20260914
ln -s /workspace/Jyotisha/.venv .venv
python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
```
开工前读:`docs/research/rectification_minute_resolution_closure_2026_09_14.md``docs/research/probe_supply_after_six_2026_09_13.md``scripts/rectification/event_probes.py``_boundary_windows``_union_boundary_dates`
## 7. BUG 编号
- 研究单,**不新增 BUG 编号**。