与上游流程对照补两处。①精度研究单加 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
8.3 KiB
研究单 · 出题闸门按证据精度分档(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. 问题:现在的闸门是固定的,不看证据精度
引擎造"能区分候选"的题,靠的是两个候选分钟在同一段时间里的大运边界落在不同月份。但有一道固定闸:
# 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.mdPart 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 modemean),不得与上游 true-node 数字直接比。 - 结论只允许三种:有收益(命中率上升或宽度下降,真值覆盖率不降,且 ±7 天偏移下不挤出)→ 立实现单并给推荐档位;无收益 → 关闭;不确定 → 说明缺什么。
- 不得改
scripts/rectification/event_probes.py的线上默认值。
4. 硬红线
- Python 改动跑
.venv/bin/python scripts/run_quality_gate.py --profile quick(已知既有缺口:test_shadbala_endpoint_returns_ranked_planet_strength,时区依赖缺失,基线同样红,不计入)。 - 真值覆盖率优先于区间宽度:任何把真实分钟挤出交付区间的档位一律不推荐,哪怕命中率更高。
- 不得放宽置信度或确认门控;不得让性格题参与淘汰(既有红线)。
- 不得使用真实用户资料。
- 结论必须落到数字。
5. 与 BUG-689 的联动
本单若有收益,TASK-rectification-open-collect-invite-20260914.md 的邀请文案要同步:优先请用户说"记得确切是哪一天"的事(登记结婚那天、入职第一天、手术那天、孩子出生那天、拿到录取通知那天),并说明"记得到天的事比记得到月的事有用得多"。该文案改动已写进 BUG-689 单的 D1,不必等本单结论——但"有用得多"这句的强度要按本单结果调整,不得在没有数据前承诺能定到分钟。
6. 开工前置命令
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 编号。