Files
Jyotisha/docs/tasks/TASK-rectification-scoring-research-20260929.md
T

100 lines
9.5 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.
# TASK · 生时校正打分方法研究:似然比权重 / 缺席证据 / 精度追问(研究单,2026-09-29)
## 基线
- `origin/staging` @ `b9133154`(写作时 head;开工时以最新 `origin/staging` 为准)。
- 分支 `codex/rectification-scoring-research-20260929`,工作树 `.worktrees/rectification-scoring-research-20260929`。
- **串行关系**:脚手架(研究计分器、特征抽取、留一法框架)可以先在 v4 上开发调试;**R-A / R-B / R-C 的任何"有收益 / 无收益"判定必须在 `TASK-rectification-holdout-expansion-20260929.md` 交付的 v5(≥60 例)上做**。v5 未交付时只能写 `pending_v5`,不得在 v4 上下结论。
- 本单是**离线研究**:不改任何生产代码,不动 `sealed_holdout_rerun.py::PRODUCTION_FILES` 的 10 个冻结文件。研究计分器按 09-26 做法独立实现,并与线上 `score_candidates` 在 v4 上**逐分对账**后才算可信。
## 先读
- `docs/research/rectification_minute_resolution_closure_2026_09_14.md`(定论页,含 §7 勘误)
- `docs/research/rectification_offline_research_2026_09_26.md`
- `docs/research/rectification_typed_event_scoring_2026_09_29.md`
- `docs/research/pre_work_error_ledger.md` ERR-110 / ERR-111
## 事故实证
产品 2026-09-29 staging 真机:31 分钟窗,开场 12 件带年份经历,答约 10 张卡,范围整窗不动(止血单 BUG-1084~1087 已处理流程层)。离线事实:
| 事实 | 数字 | 出处 |
| --- | --- | --- |
| 引擎原始分头名簇命中(v4,±10/±30/±60) | 0.35 / 0.15 / 0.10;随机水平约 0.09 / 0.03 / 0.02 | 定论页 §1.4 |
| 按真值方向答六张卡后 | 0.80 / 0.55 / 0.35 | 同上 |
| 六题后交付宽度中位 | 15 / 33 / 56 分钟 | 定论页 §1.1 |
| 打字经历按选择题规则计分(R1,09-29) | 57 件日精度经历只有 4 / 9 / 14 件能把候选分到两边 | BUG-1089 |
| 出生时间每差 1 分钟,大运边界平移 | 中位 3.8 天(1.3–5.9) | 09-26 R3a |
## 根因(打分层)
`scripts/active_rectification_event_engine.py::_score_event`(`:192`)对每件事、每个候选分钟按 11 条规则**加分**(大运主星落领域宫 +2.0、分运 +1.5、次分运 +0.75、分盘命中 `+weight/(2·len(varga_charts))`、Narayana +2.0/+1.0、Arudha +0.35、功能吉凶 ±0.2/0.1、受控过运、Ashtakavarga 辅助),再乘精度权重。三个结构性问题:
1. **只奖不罚**。候选"能解释"事件加分;候选"预测了没发生的事"不扣分。选择题能动分,正因为它允许答"没有"(`core/build-state.ts::applyProbeOutcome`,±2)。口述时间线里的空白(例如事业线 2019-10 到 2025-02 之间没有变动)目前不是证据。
2. **权重是人拍的,没有校准**。一条规则若对真分钟和错分钟同样常常命中,它只是噪声,但照样 +2。R1–R5 / V1 / V2 / V1n 都是"再拍一个权重看结果",不是让数据定权重。
3. **高分辨率信号没进计分**。KP 宫头子主每分钟在算(`scripts/rectification/kp_cusp_observation.py`),被 `OBSERVATION_ONLY_LAYERS`(`:71`)挡住;Pranapada 已算(`:449`)未计分;D60 未入 11 张计分分盘。09-14 KP@默认权重更差,是"权重没校准"的另一个症状,不能证明信号无用。
## 决策记录(产品 2026-09-29)
- **批准**三项离线研究:**R-A 似然比校准权重**、**R-B 缺席证据**、**R-C 精度追问可行性**。有收益才立实现单;实现单必须按 ERR-110 重冻结 sealed holdout / reported offset 记录。
- **保留**:2026-09-14"KP 宫头子主参与评分"的方向有效——KP 作为 R-A 的一个特征进入,权重由数据定,不再手工试。
- **保留**:BUG-560 维持 `blocked`,直到某个方案在 v5 上过门。
- **保留**:09-26"定向追问最多 2 条问完出卡"。R-C 若进入实现,精度追问算在这 2 条额度内,不另加轮次。
- **不做**:不改 `MIN_SEPARATION_LEAD`、淘汰次数、采用 / 确认门、45 天闸门、领域门槛;不改冻结文件;不接上游 `PL9_BAV_CELL_OVERRIDES`。
- **预期口径**(写进文档,不得夸大):月精度经历最多分开相差 ≥8 分钟的候选;31 分钟窗做到极致约 8–10 分钟,不承诺 1–2 分钟。
## 硬红线
1. **真值在区间不降**(v5 三档半径 × truth / opposite 六格,每格都不低于基线)。头名命中不降。任何一格变差即该方案不过门,把数字写进 PROGRESS,不得调参数凑。
2. **留一法**:R-A 权重估计必须 leave-one-**case**-out(不是 leave-one-event-out);报告里必须同时给"全集拟合"与"留一法"两组数字,只有留一法数字可用于判定。
3. 稳健性三项必测:事件日期偏移 ±7 天 / ±1–3 月;答错 1–2 题(09-26 R1 口径);R-B 另加"用户漏说 1–2 件真实事件"。任何一项把真值挤出区间的比例 > 基线,方案不过门。
4. 研究计分器与线上 `score_candidates` 在 v4 上逐分对账(09-26 做法),差异 0 才能开始实验。
5. `PYTHONHASHSEED=0`(ERR-111);所有 JSON 结果两次复跑逐字节一致。
6. 生产代码零改动;`run_quality_gate.py --profile quick` 与开工基线逐条一致;新增研究测试全绿。
7. 隐私:只用 v4 / v5 公开名人数据;文档不写真机会话的事件内容。
8. 负结果必须完整写出;不得只报有利档位。
## 任务分解
- **R-0 脚手架(可在 v4 上做)**
- `scripts/research/scoring_research_lib.py`:特征抽取——对每个 (case, candidate, event) 输出各规则是否命中(现有 11 条规则拆成独立特征;再加 KP 宫头子主是否与真值簇同、Pranapada 宫位是否为领域宫、D60 上升星座是否含领域主、Narayana 层;特征名与 `rule_ids` 对齐),以及候选是否属真值簇(步长 2 分钟,簇口径同 `cluster_width_probe.py`)。
- 研究计分器复算线上分数并逐分对账。
- 验收:`tests/test_scoring_research.py` 覆盖对账 0 差、特征表形状、留一法拆分不泄漏案例。
- **R-A 似然比校准权重(BUG-1091)**
- 每个特征 f 估 `LR_f = P(f 命中 | 真值簇) / P(f 命中 | 非真值簇)`(加拉普拉斯平滑,平滑量写明),候选分 = Σ log LR_f × 精度权重;淘汰与区间沿用线上 `unionStillValidRange` 口径。
- 变体:A1 只用现有 11 特征;A2 加 KP / Pranapada / D60 / Narayana;A3 在 A2 上加只奖不罚 → 允许负 log LR(命中反而降分)。
- 指标:头名命中、真值在区间、宽度中位、并列率、每轮熵降;六题回放前后各一组;留一法与全集各一组;稳健性三项。
- 判定沿用 `precision_gate_lib.gate_verdict`(头名不降**且**宽度下降,覆盖不降)。另报"校准曲线":预测概率分桶 vs 真值命中率。
- 验收:结果 JSON `docs/research/scoring_research_lr_2026_09_29.json`;每个特征的 LR 与置信区间列表;哪些特征 LR≈1(即噪声)单独列出。
- **R-B 缺席证据(BUG-1091)**
- 定义"覆盖时段":每个领域内,该例第一件与最后一件带年月事件之间的年份;覆盖时段内没有该领域事件的年份 = 缺席年。
- 对每个候选,用 `event_probes.py` 的激活判定(`_has_domain_activation` / `_boundary_windows` 逻辑,研究侧复制不改原文件)算它在缺席年是否预测该领域强激活;预测了就扣分,幅度三档 0.5 / 1.0 / 2.0(卡片答"没有"是 2)。
- 必测"用户漏说":随机删掉每例 1–2 件真实事件后重跑,看真值被挤出区间的比例。
- 验收:三档幅度 × 三档半径的表;漏说稳健性表;判定。
- **R-C 精度追问可行性(产品层,不改计分)**
- 对每例每件年精度事件,算"若精确到月,是否恰好落在候选之间的大运边界(±4 个月内)";统计每例可追问事件数。
- 模拟:把 v5 日精度事件降为年精度作为"口述",再按真月"追问"一件,与六题基线比头名 / 宽度。
- 验收:每例可追问数分布;追问 1 件 / 2 件的增益表;判定是否值得进产品(额度按决策记录,算在定向追问 2 条内)。
- **R-D 文档**
- `docs/research/rectification_scoring_research_2026_09_29.md`:三项结论表(一句话 + 是否立实现单)、全部复跑命令;`docs/research/ACTIVE_FRONTS.md` 索引;定论页追加 §9;若某项过门,写实现单草案要点(含 ERR-110 重冻结步骤)。
## 让步顺序
R-0 > R-A > R-C > R-B > R-D 之外的图表。R-0 与 R-A 缺一不可合入;R-B / R-C 未做要在 PROGRESS 写 `not_started`,不得写成"无收益"。
## 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/rectification-scoring-research-20260929 .worktrees/rectification-scoring-research-20260929 origin/staging
cd .worktrees/rectification-scoring-research-20260929
export PYTHONHASHSEED=0
.venv/bin/python -m pytest tests/test_minute_resolution_research.py tests/test_cluster_width_research.py tests/test_rectification_validation_integrity_gate.py -q # 基线
.venv/bin/python scripts/research/minute_resolution_sweep.py --help
.venv/bin/python scripts/research/cluster_width_probe.py --help
```
## BUG 编号
开工时核对 `docs/BUG_HISTORY.md` 最大号(写作时 `BUG-1089`;`BUG-1090` 由扩集单预留)。本单:**BUG-1091**(打分只奖不罚、权重未校准、高分辨率信号未计分)。由执行方以 `investigating` 登记;研究结束按结果改 `resolved`(有实现单)或 `closed_by_design`(无收益,附数字)。关联 BUG-560、BUG-1048、BUG-1089、BUG-1090。