docs(research): holdout v5 build notes, v4 subset reproduction, progress and BUG-1090

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
Jesse_Chen
2026-09-29 19:52:43 +08:00
co-authored by Claude Fable 5.1
parent 54e63fe46e
commit e380026641
4 changed files with 386 additions and 0 deletions
+14
View File
@@ -14818,3 +14818,17 @@
- 相关记录:BUG-1076、`TASK-chart-types-and-report-buttons-20260928.md` T3;本任务书明确有限修订旧约定。
- 复发自:无;产品术语能力范围的收口,不是 D1 冒充分盘复发。
- 修复版本:`codex/chart-surface-polish-20260929` 工作区,未提交、未推送。
## BUG-1090 | 生时校正评价集只有 20 例,所有打分判定都在噪声线上
- 状态:resolved(2026-09-29,v5 已建:77 例公开 AA,基线成绩单与 schema 测试齐;待 Claude 验收)
- 首次发现 / 最近更新:2026-09-29 / 2026-09-29
- 影响面:`references/real_case_calibration/minute_rectification_holdout_v4.json`(20 例)及所有以它判定"过门 / 不过门"的打分研究(`minute_resolution_2026_09_14`、`cluster_width_2026_09_14`、`precision_gate_2026_09_14`、`rectification_offline_research_2026_09_26`、`rectification_typed_event_scoring_2026_09_29`)。
- 用户现象:无直接用户可见变化;后果是 KP 计分(0.35→0.20)、精度分档闸门(0.80→0.75)、V1n 配权等被判 `no_benefit` 时只差 1–3 例,结论不可靠。
- 触发条件:20 例上 1 例 = 5 个百分点。
- 根因:v4 继承 v3 的 20 例名单,只补了事件数与领域数,没有扩例数;没有一份 ≥60 例、事件与出处经核对、口径与本仓一致的公开评价集。
- 修复:新建 v5(`minute_rectification_holdout_v5.json`):v4 的 20 例原样继承 + 57 例新增 Rodden-AA 公开名人,每例 ≥7 件带逐字引文的事件、≥4 领域;出生资料做时区(zoneinfo)与地名(Nominatim ≤60 km)双核对,不通过的拒收;构建脚本 `scripts/research/holdout_v5_build.py` 两次构建逐字节一致;基线脚本 `scripts/research/holdout_v5_baseline.py`。v4 不动。
- 验证:`tests/test_holdout_v5_schema.py` 9 项通过;v5 中 v4 子集在三个回放脚本上的基线数字与 09-14 / 09-26 / 09-29 已发布数字逐格一致(`docs/research/holdout_v5_build_2026_09_29.md` §3);v5 全集三档基线见同文 §4。
- 防复发:`docs/research/rectification_minute_resolution_closure_2026_09_14.md` §8 与 `ACTIVE_FRONTS.md` 写明此后判定以 v5 为准;`TASK-rectification-scoring-research-20260929.md` 的判定必须在 v5 上做。分层配额 UTC+8 只到 5/6,缺口与原因写在构建说明 §1,不得静默。
- 相关记录:BUG-560、BUG-1089、BUG-1091(研究单预留)
- 复发自:无
- 修复版本:`codex/rectification-holdout-expansion-20260929`,未合入
@@ -0,0 +1,244 @@
{
"dataset": "references/real_case_calibration/minute_rectification_holdout_v4.json",
"case_filter": null,
"radii": [
10,
30,
60
],
"variant": "baseline (production scoring, no research variants)",
"ayanamsa": "raman",
"node_mode": "mean",
"sweep": {
"baseline": {
"10": {
"n": 20,
"top1": 0.35,
"coverage": 1.0,
"width_median": 21.0,
"tie": 0.05,
"entropy0": 2.5594,
"entropy6": 2.1408,
"squeezed": 0,
"too_narrow": 0,
"replay_top1": 0.8
},
"30": {
"n": 20,
"top1": 0.15,
"coverage": 1.0,
"width_median": 61.0,
"tie": 0.05,
"entropy0": 4.0379,
"entropy6": 2.5762,
"squeezed": 0,
"too_narrow": 0,
"replay_top1": 0.55
},
"60": {
"n": 20,
"top1": 0.1,
"coverage": 1.0,
"width_median": 121.0,
"tie": 0.0,
"entropy0": 4.9923,
"entropy6": 2.6775,
"squeezed": 0,
"too_narrow": 0,
"replay_top1": 0.35
}
},
"case_count": 20,
"errors": []
},
"cluster_width": {
"replay": {
"10": {
"n": 20,
"top1": 0.8,
"coverage": 1.0,
"width_median": 15.0,
"tie": 0.0,
"entropy0": 2.5595,
"entropy6": 2.0346,
"squeezed": 0,
"independent": 1.0,
"public_median": 6.0,
"merge_median": 0.0,
"raw_median": 6.0,
"elim_median": 2.0,
"union_alive_median": 15.0,
"engine_union_median": 21.0
},
"30": {
"n": 20,
"top1": 0.55,
"coverage": 1.0,
"width_median": 33.0,
"tie": 0.0,
"entropy0": 4.0386,
"entropy6": 3.1646,
"squeezed": 0,
"independent": 1.0,
"public_median": 16.0,
"merge_median": 0.0,
"raw_median": 16.0,
"elim_median": 7.0,
"union_alive_median": 36.0,
"engine_union_median": 61.0
},
"60": {
"n": 20,
"top1": 0.4,
"coverage": 1.0,
"width_median": 56.0,
"tie": 0.0,
"entropy0": 4.9942,
"entropy6": 3.9537,
"squeezed": 0,
"independent": 1.0,
"public_median": 31.0,
"merge_median": 0.0,
"raw_median": 31.0,
"elim_median": 17.0,
"union_alive_median": 104.0,
"engine_union_median": 121.0
}
},
"case_count": 20,
"errors": []
},
"futile_collect": {
"summaries": [
{
"radius": 10,
"direction": "truth",
"n": 20,
"baseline": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 14.0,
"mean_injected": 1.8
},
"d1": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 15.0,
"mean_injected": 0.0
},
"width_worse_cases": 1,
"truth_lost_cases": 0,
"gate_pass": false,
"errors": 0
},
{
"radius": 10,
"direction": "opposite",
"n": 20,
"baseline": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 15.0,
"mean_injected": 1.8
},
"d1": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 15.0,
"mean_injected": 0.0
},
"width_worse_cases": 0,
"truth_lost_cases": 0,
"gate_pass": true,
"errors": 0
},
{
"radius": 30,
"direction": "truth",
"n": 20,
"baseline": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 34.0,
"mean_injected": 1.8
},
"d1": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 33.0,
"mean_injected": 0.0
},
"width_worse_cases": 1,
"truth_lost_cases": 0,
"gate_pass": true,
"errors": 0
},
{
"radius": 30,
"direction": "opposite",
"n": 20,
"baseline": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 34.0,
"mean_injected": 1.8
},
"d1": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 33.0,
"mean_injected": 0.0
},
"width_worse_cases": 1,
"truth_lost_cases": 0,
"gate_pass": true,
"errors": 0
},
{
"radius": 60,
"direction": "truth",
"n": 20,
"baseline": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 53.0,
"mean_injected": 1.8
},
"d1": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 56.0,
"mean_injected": 0.0
},
"width_worse_cases": 5,
"truth_lost_cases": 0,
"gate_pass": false,
"errors": 0
},
{
"radius": 60,
"direction": "opposite",
"n": 20,
"baseline": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 53.0,
"mean_injected": 1.8
},
"d1": {
"truth_in_range": 20,
"truth_in_range_rate": 1.0,
"median_width": 56.0,
"mean_injected": 0.0
},
"width_worse_cases": 5,
"truth_lost_cases": 0,
"gate_pass": false,
"errors": 0
}
],
"errors": [],
"case_count": 20
},
"elapsed_s": 303.5
}
@@ -0,0 +1,70 @@
# Holdout v5 构建说明与基线成绩单(2026-09-29)
- 任务书:`docs/tasks/TASK-rectification-holdout-expansion-20260929.md`(BUG-1090)
- 协议:`holdout_v5_protocol_2026_09_29.md`
- 口径:ayanamsa `raman`、node mode `mean`、候选步长 2 分钟、半径 ±10 / ±30 / ±60
- 产物:`references/real_case_calibration/minute_rectification_holdout_v5.json`(构建脚本 `scripts/research/holdout_v5_build.py`,两次构建逐字节一致)
- 基线脚本:`scripts/research/holdout_v5_baseline.py`(只跑生产计分 `baseline` 变体,把三个既有回放脚本指到指定数据集与独立输出路径,不改写 09-14 / 09-26 的文档)
## 1. 例数与分层
| 项 | v4 | v5 |
| --- | ---: | ---: |
| 例数 | 20 | **77**(v4 的 20 例原样继承 + 57 例新增) |
| 事件总数 | 143 | 964 |
| 事件精度 day / month / year | 59 / 0 / 84 | 244 / 143 / 577 |
| 每例事件(新增例) | — | 8–20 |
| 每例领域(新增例) | — | ≥4 |
分层(任务书硬红线 4,括号内为配额):
| 维度 | v5 | 达标 |
| --- | --- | --- |
| 出生年代(≥3 段) | 1850s–1990s 共 14 段;1930s 12、1940s 16、1960s 10、1980s 9 | 是 |
| 纬度带(三档都有) | \|φ\|<25° 14、25–45° 44、>45° 19 | 是 |
| 南半球(≥8) | 12(巴西 7、阿根廷 3、秘鲁 1、澳大利亚 1) | 是 |
| 出生时间 22:00–02:00(≥6) | 9 | 是 |
| UTC+8(≥6) | **5**(菲律宾 5) | **否,差 1** |
UTC+8 缺口说明:Astro-Seek 镜像上菲律宾 126 例、中国 205 例、香港 125 例、台湾 106 例、新加坡 33 例、马来西亚 61 例、印尼 60 例全部扫过,Rodden AA 且有出生时间的只有菲律宾 12 例、台湾 1 例(Rod Chang,英文 Wikipedia 无可用传记)、上海 1 例(1927 年,记录用 LMT 8.1h,不是 UTC+8)。菲律宾 12 例里 Corazon Aquino 被地名核对拒收(记录地名 Paniqui、镜像坐标是马尼拉,相距 129 km),Aga Muhlach / Eugene Domingo / Rudy Fernandez 之外的几位传记事件不足 4 个领域,最终入选 5 例。要补到 6 例需要 astro.com 原站可访问后再扫一遍菲律宾 / 马来西亚 / 澳大利亚珀斯出生的记录。
国家分布:美国 38、巴西 7、法国 7、菲律宾 5、阿根廷 3、西班牙 3、英国 4、德国 2、墨西哥 2、其余各 1(奥匈、比利时、意大利、荷兰、秘鲁、澳大利亚)。
## 2. 出生资料核对结果
- 评级:57 例新增全部 AA(镜像页转载的 Astro-Databank 评级字母;astro.com 原站 2026-09-29 拦截自动访问,见协议 §4.1 的环境缺口)。
- 时区:`zoneinfo_match` 51、`lmt_from_birthplace_longitude` 3(1853 Zundert、1859 Edinburgh、1879 Ulm)、`standard_time_kept_dst_disagreement` 3(1922 Grand Rapids、1941 Duluth、1963 Owensboro)。
- 拒收(不改数字凑合):Jorge Luis Borges 1899(记录 −3.9h,zoneinfo −4.28h)、Salvador Allende 1908 与 Claudio Arrau 1903(记录 −4.78 / −4.80h,zoneinfo −4.71h,智利 1910 年前 LMT 与记录不一致)、Corazon Aquino(地名核对)、Juan Perón(Wikipedia 生日 10 月 8 日与记录 10 月 7 日不一致)、Pope Francis(只凑到 3 个领域)。
- 每条事件带来源页逐字引文,构建脚本核对引文存在于 Wikipedia 纯文本后才写入。
## 3. 硬红线 5:v4 子集成绩单逐格复现
用 `holdout_v5_baseline.py --dataset v4` 复跑线上算法(只跑 `baseline` 变体):
| 脚本 | 指标 | ±10 | ±30 | ±60 | 与已发布数字 |
| --- | --- | --- | --- | --- | --- |
| `minute_resolution_sweep` | 头名命中 / 覆盖 / 宽度中位 / 并列 / 熵0 / 熵6 / 六题回放头名 | 0.35 / 1.00 / 21 / 0.05 / 2.5594 / 2.1408 / 0.80 | 0.15 / 1.00 / 61 / 0.05 / 4.0379 / 2.5762 / 0.55 | 0.10 / 1.00 / 121 / 0.00 / 4.9923 / 2.6775 / 0.35 | `minute_resolution_2026_09_14.json` 逐格一致 |
| `cluster_width_probe`(含淘汰六题回放) | 头名 / 覆盖 / 宽度中位 / 独立率 | 0.80 / 1.00 / 15 / 1.00 | 0.55 / 1.00 / 33 / 1.00 | 0.40 / 1.00 / 56 / 1.00 | `cluster_width_2026_09_14.json` 的 `by_radius.*.baseline.replay` 12 个字段逐格一致 |
| `futile_collect_stop_replay` | truth / opposite 六格:真值在区间、宽度中位 | 20/20,14→15;20/20,15→15 | 20/20,34→33;20/20,34→33 | 20/20,53→56;20/20,53→56 | `futile_collect_stop_replay_2026_09_29.json` 六格逐格一致 |
结果 JSON:`docs/research/holdout_v5_baseline_v4_all_2026_09_29.json`。
## 4. v5 全集基线成绩单
<!-- V5_BASELINE_TABLE -->
## 5. 与 v4 的差异
- v4 的 20 例出生资料与事件原样继承(schema 测试 `test_v4_cases_are_inherited_verbatim` 锁定),只加了 `inherited_from_v4` 与 `strata` 两个字段。
- 新增例多了 `checks`(时区规则、地名距离)与事件级 `source.quote`。
- 事件不含 2026 年(回放脚本固定在 2026-09-14 评估,计分合同拒绝晚于"今天"的事件)。
## 6. 复跑命令
```bash
export PYTHONHASHSEED=0
.venv/bin/python scripts/research/holdout_v5_build.py --check
.venv/bin/python -m pytest tests/test_holdout_v5_schema.py -q
.venv/bin/python scripts/research/holdout_v5_baseline.py --dataset v4 --out-dir /tmp/holdout-v4-check # 硬红线 5
.venv/bin/python scripts/research/holdout_v5_baseline.py --dataset v5 # 写 docs/research/holdout_v5_baseline_v5_all_2026_09_29.json
```
@@ -0,0 +1,58 @@
# PROGRESS · 生时校正开放评价集扩到 ≥60 例(v5,2026-09-29)
任务书:`TASK-rectification-holdout-expansion-20260929.md`。分支 `codex/rectification-holdout-expansion-20260929`,基线 `origin/staging` @ `5febb111`(开工时 head;`78b9c5b6` 之后的提交与本单无关,未 rebase)。BUG:**BUG-1090**(开工核对最大号 1089)。
## 结果一句话
v5 已建:**77 例**(v4 20 例原样继承 + 57 例新增公开 Rodden-AA),964 件事件;v4 子集在三个回放脚本上的基线数字与已发布数字**逐格一致**;分层配额除 **UTC+8 5/6** 外全部达标;生产代码零改动。
## T1 选例协议与名单
- 协议:`docs/research/holdout_v5_protocol_2026_09_29.md`(入选标准、排除规则、分层配额、核对流程、2026 年事件上限)。
- 名单:`references/real_case_calibration/holdout_v5_roster.json`(57 例,每例 Astro-Databank URL、AA 评级、采集人、镜像页 URL、时区与地名核对结果)。
- **环境缺口**:astro.com 在 2026-09-29 对自动访问返回"One moment..."拦截页,Wayback 快照间歇 000;评级与出生资料从 Astro-Seek famous-people 页读取(逐字转载 Astro-Databank 评级、采集人、日期、时间、地点、坐标、UTC 修正)。记录里同时写原页 URL 与镜像 URL。验收时若 astro.com 可访问,请抽样回到原页复核。
- 分层统计:
| 维度(配额) | v5 | 达标 |
| --- | --- | --- |
| 出生年代 ≥3 段 | 14 段(1850s–1990s) | 是 |
| 纬度带三档 | <25° 14 / 25–45° 44 / >45° 19 | 是 |
| 南半球 ≥8 | 12 | 是 |
| 22:00–02:00 ≥6 | 9 | 是 |
| UTC+8 ≥6 | **5** | **否**(原因与已扫范围见构建说明 §1) |
## T2 事件抽取与核对
- 事件从英文 Wikipedia 纯文本(API `extracts`)逐句筛候选、人工选择并标注领域 / 日期 / 精度;每条保存 `source.quote`(逐字引文),构建脚本核对引文存在后才写入;找不到引文的行被拒收而非静默丢弃。
- 新增 57 例:每例 8–20 件,领域 ≥4;精度 day 185 / month 143 / year 493。领域键取自 `DOMAIN_CONFIG`。
- 拒收记录(不改数字凑合):Borges、Allende、Arrau(时区不一致)、Corazon Aquino(地名距记录坐标 129 km)、Juan Perón(生日两源不一致)、Pope Francis(只 3 个领域)、Rod Chang / Aga Muhlach / Eugene Domingo(传记不足 4 领域)。
- 删掉 2026 年事件 2 条(Messi、Zidane):回放脚本固定 2026-09-14 评估,计分合同拒绝晚于"今天"的事件;协议 §1.6 与构建脚本 `EVENT_CUTOFF` 已固化。
- schema 测试:`tests/test_holdout_v5_schema.py` 9 项通过(门槛、口径、v4 原样、出生记录字段、核对字段、引文、领域 / 日期 / 精度、分层汇总、roster / events 与数据集一致、构建确定性)。
## T3 构建脚本
- `scripts/research/holdout_v5_build.py`:从 v4 + roster + events 生成 v5;`--check` 只校验。两次构建 md5 一致(`3f8f…`→ 最终版由 `test_build_is_deterministic` 锁定)。
- v4 的 20 例在 v5 中出生资料与事件逐字段一致(测试 `test_v4_cases_are_inherited_verbatim`)。
## T4 基线成绩单
- `scripts/research/holdout_v5_baseline.py`:把 `minute_resolution_sweep` / `cluster_width_probe` / `futile_collect_stop_replay`(经 `guided_collect_holdout_replay.load_cases`)的模块常量指到指定数据集与独立输出文件,只跑 `baseline` 变体;不改这三个脚本。
- **硬红线 5**:`--dataset v4` 复跑,三个脚本共 7+12+6 组数字与 `minute_resolution_2026_09_14.json`、`cluster_width_2026_09_14.json`、`futile_collect_stop_replay_2026_09_29.json` 逐格一致(表在 `holdout_v5_build_2026_09_29.md` §3;JSON `holdout_v5_baseline_v4_all_2026_09_29.json`)。
- v5 全集:`holdout_v5_baseline_v5_all_2026_09_29.json`,数字见构建说明 §4。
<!-- V5_PROGRESS_TABLE -->
## T5 文档
- `docs/research/holdout_v5_build_2026_09_29.md`、`docs/research/ACTIVE_FRONTS.md`(索引)、定论页 §8、`docs/tasks/README.md` 状态板、`docs/BUG_HISTORY.md` BUG-1090。
## 门禁与测试
- 生产代码零改动(`git diff origin/staging --stat` 只有 `docs/`、`references/real_case_calibration/`、`scripts/research/holdout_v5_*.py`、`tests/test_holdout_v5_schema.py`)。
- `tests/test_repo_privacy_markers.py` 全绿;`test_minute_resolution_research.py`、`test_cluster_width_research.py` 全绿(09-14 的 JSON 未改写)。
- 快速门:见文末「快速门」节。
## 遗留
- UTC+8 差 1 例;astro.com 原站抽样复核;Rod Chang(台湾 AA)若能找到可靠传记可补。
- 拒收的 3 例时区不一致(阿根廷 / 智利 1899–1908)值得在 astro.com 可访问后核对原记录的时区注释。