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

68 lines
8.0 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.
# PROGRESS · 生时校正打分方法研究:似然比权重 / 缺席证据 / 精度追问(2026-09-29 脚手架,2026-09-30 v5 判定)
- 任务书:`docs/tasks/TASK-rectification-scoring-research-20260929.md`
- 执行:Claude(直接执行模式,fork 子代理),分支 `codex/rectification-scoring-research-20260929`。脚手架阶段基线 `origin/staging` @ `6e393780`,已合入 staging(`84aaeadf`);判定阶段 `git rebase origin/staging` 到 `0120765f`(v5 已合入,分支无额外提交后再开新提交)。**未推送。**
- 研究报告:`docs/research/rectification_scoring_research_2026_09_29.md` + `scoring_research_{lr,absence,precision_followup}_2026_09_29.json`(v4)与 `…_v5_2026_09_29.json`(v5,判定用)。
## 阶段一(2026-09-29)· 脚手架与 v4 流水线
- 环境:本机没有 `.venv`,全部用系统 `python3` 3.13.5(swisseph 9.1.1)。快速门的前端步需要 Node 22:`frontend/node_modules` 软链到主检出(未入库),`npm` 用 `/exec-daemon/node` + `/exec-daemon/lib/node_modules/npm` 的 shim。`PYTHONHASHSEED=0`(ERR-111)。
- 交付:`scripts/research/scoring_research_lib.py`(特征记录 provider、逐分对账、似然比估计 α = 1、案例级 bootstrap、加权 provider、leave-one-case-out、缩放答案、Platt 温度、缺席年 / 精度升降辅助)、`scripts/research/scoring_research.py`(R-A / R-B / R-C 流水线)、`tests/test_scoring_research.py`(10 条,含 v4 公开案例 ±10 对账 0 差)。
- 对账:20 例 × 3 档 = 60 个 case-radius 分数差 0、规则 id 差 0。两次复跑 JSON 逐字节一致。所有判定字段 `pending_v5`。
- 生产代码、`sealed_holdout_rerun.py::PRODUCTION_FILES` 的 10 个冻结文件、任何常数零改动。
- 已由 Claude 验收合入 staging(README 状态板记录)。
## 阶段二(2026-09-30)· v5 判定
### 脚本改动(本次提交,`scripts/research/scoring_research.py`)
1. `main` 改为**一次只驻留一个半径**:77 例 × 3 档的静态 context 同时驻留会 OOM(两次被系统 kill,anon-rss 3.2 GB),按半径加载 → 跑 R-A / R-B / R-C → 释放。JSON 结构不变。
2. `fit_prior` 的训练折计分改用线性代理 `CaseData.proxy_rows`(特征权重 × 精度权重,不含事件类型系数 / 大运边界邻近项),把每折 O(n) 次矩阵构建降为字典求和;留出例的分数仍走线上矩阵。
3. `--probes-per-variant`:留一法方案用自己的矩阵重新出六题再回放(缺口 3)。
4. `hard_line_1` 字段:每格真值在区间例数与头名 vs 基线;R-C 增加同一子集的 `subset_C0` / `subset_B0` 与 `gate_verdict_vs_subset_C0`(子集方案对全集 C0 比是不公平的,改为同子集比)。
5. `per_case` 行(R-A 各方案与基线、R-C 各臂)写进 JSON,供验收逐例核对。
6. `verdict` 字段:v4 仍 `pending_v5`;v5 文件 header 写 `see_report`,方案级 `gate_verdict` / `hard_line_1.pass` 是机器判定,正式判定见研究报告 §1。
### 对账与复跑
- v5 对账:**77 例 × 3 档 = 231 个 case-radius 差异 0**(`reconciliation.unreconciled = 0`,三份 JSON 均记录)。
- 复跑:`PYTHONHASHSEED=0 … --dataset-label v5 --probes-per-variant` 连跑两次(2918 s / 2818 s),三份 JSON `cmp` **逐字节一致**(`lr` 407,129 B、`absence` 53,227 B、`precision_followup` 48,521 B);R-C 加同子集基线后单独再跑两次(`--parts rc`),同样逐字节一致;`_v5_rerun` 副本比对后删除,不入库。
- 基线自检:本脚本的 v5 基线(六题后 `raw`)头名 0.675 / 0.494 / 0.325、真值在区间 76 / 76 / 75、宽度 15 / 35 / 63,与扩集单发布的 v5 成绩单逐格一致。
### 判定(`raw` 主判口径,理由见报告 §2.1;truth = opposite,D1 之后六题后不再注入)
| 项 | 六格硬红线 1(真值在区间例数 / 头名 vs 基线 76 / 0.675、76 / 0.494、75 / 0.325) | `gate_verdict` | 判定 |
| --- | --- | --- | --- |
| R-A A1 | 76 / 0.571、77 / 0.455、72 / 0.247 | no_benefit ×3 | **不过**(头名三档降;±60 丢 3 例) |
| R-A A2 | 75 / 0.545、76 / 0.416、72 / 0.247 | no_benefit ×3 | **不过** |
| R-A A3 | 77 / 0.597、77 / 0.468、75 / 0.221 | no_benefit ×3 | **不过**(覆盖不降但头名三档降) |
| R-B @0.5 分 | 77 / 0.662、75 / 0.442、75 / 0.221 | no_benefit ×3 | **不过**(头名降、宽度不降) |
| R-B @1.0 分 | 73 / 0.649、71 / 0.429、70 / 0.195 | no_benefit ×3 | **不过** |
| R-B @2.0 分(卡片强度) | 55 / 0.481、33 / 0.169、19 / 0.091 | no_benefit ×3 | **不过**(真值大量挤出) |
| R-C(与同子集 C0 比) | C1_prior:20/20 头名 0.70 vs 0.75、34/34 0.47 vs 0.47(宽度 36 vs 37)、44/44 0.36 vs 0.42;C1_probe:0.60 vs 0.75、0.41 vs 0.47、0.38 vs 0.42;C2_prior:0.70 vs 0.80、0.42 vs 0.50、0.48 vs 0.52 | 只有 ±30 C1_prior 一格 benefit,其余 no_benefit | **不过**(无一致收益,不立实现单) |
`percent` 口径六格同样全部不过(R-A A1 76 / 77 / 77、A2 71 / 76 / 77、A3 66 / 75 / 76,头名全低于基线 0.79 / 0.81 / 0.77;R-B @2.0 分 54 / 33 / 20)。
- 稳健性(R-A 留一法 `raw`,真值在区间):±7 天 0.94–1.00、±1–3 月 0.94–1.00、答错 1 题 0.90–1.00、答错 2 题 0.82–0.98;没有一项补回头名损失。
- 缺口 3:按方案矩阵重出六题的回放与共用题目**逐格相同**(出题器按代表候选与静态 context 判定分边,不读矩阵分数;每例题数 4.9 / 7.1 / 7.3)。对判定方向无影响,关闭。
- 后验标定(缺口 2):主判 `raw`(scale 只从训练折估,进 `unionStillValidRange`,与三轮既有研究同口径);`percent` 口径的 Platt 温度在 v5 上拟合到 4–32,校准曲线在 ±30 / ±60 几乎全落在 [0,0.1) 桶且预测≈实际——过自信消失的代价是后验≈均匀,即先验不携带信息。两口径判定方向一致。
- 特征:42 个里 36 / 38 / 39 个 bootstrap 5–95% 区间跨 0;剩余 |log LR| ≤ 0.15(D60 命中 −0.15、Shadbala 支持 −0.06 / 压力 +0.05、KP 星主 +0.06–0.09、KP 上升 AD 子主 −0.11);**v4 与 v5 都不跨 0 且同号的特征:0 个**。
### 文档
- 研究报告改写为 v5 判定版(§1 结论表、§2.1 标定口径、§2.2 / §3.1 六格表、§2.4 特征表、§4 R-C、§6 v4 数字保留)。
- `docs/BUG_HISTORY.md` BUG-1091 → `closed_by_design`(附数字);定论页 §9 追加 v5 结论;`docs/research/ACTIVE_FRONTS.md` 索引已指向报告;`docs/tasks/README.md` 状态行更新。
## 快速门
- 阶段一:基线(`6e393780`)与改后各一次:Python 1001 passed / 1 skipped 两次相同;前端 4357 / pass 4302 / fail 24 / cancelled 0(基线 4301 / 25,改后失败清单是基线的子集,24 条全是 Docker / PostgreSQL / 部署环境套件)。
- 阶段二(`0120765f` 之上,改动只在 `scripts/research/scoring_research.py` 与文档):`python3 scripts/run_quality_gate.py --profile quick`(PATH 带 Node 22 shim)——Python **1001 passed / 1 skipped**(与阶段一两次相同;定向 `tests/test_scoring_research.py` 10 passed);前端 **4391 / pass 4336 / fail 24 / cancelled 0**(staging 在 `6e393780`→`0120765f` 间新增 34 条测试,全部通过),24 条失败清单与阶段一逐条相同(Docker / PostgreSQL / 部署环境套件),门禁整体 exit 1 由此导致;**无新增失败**。
## 缺口与说明
- R-A / R-B 判定为负,**不立实现单**;BUG-560 维持 blocked。
- R-C 与同子集基线比无一致收益,不立实现单;产品若仍想做"只追问一件落在候选分歧点的经历",是交互层面的决定(额度按 09-26「定向追问 2 条」),本研究给不出精度理由。
- 六道题由线上矩阵出一次、各方案共用;已验证按方案矩阵重出题结果相同。
- 大运边界邻近项按线上原样附加、未重加权(R-A 判负后无需再测)。
- 本机无 `.venv`,用系统 python3;`frontend/node_modules` 为软链,未入库。