diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 2e3f58d9..65d0e151 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -20447,3 +20447,19 @@ - 关联:BUG-1494。 - 复发自:无。 - 修复版本:分支 `codex/upstream-sync9b-20261028`。 + + +## BUG-1497 | D60 换格能不能帮生时校正,从没在已知出生时间的人身上测过 + +- 状态:investigating +- 首次发现 / 最近更新:2026-10-28 / 2026-10-28(issue #149,来源 #142 竞品宣传) +- 影响面:生时校正的技法路由与对外文案。`skills/jyotish-birth-time-rectification/references/technique-routing.md` 现在写「D60 只作参考,不驱动结论」。 +- 现象:竞品宣传「证据够密时 D60 与纳迪分盘反向校准,收束时刻可以到秒」。纳迪那一半已在 BUG-1240 证伪(N3 ±10 窗口找回记录分钟 5/77,生产 25/77;N4 只换岁差 73/73 换段);D60 这一半从未在 v5 77 例已知出生时间上检验。 +- 触发条件:用 D60 换格给候选分段打分,或对外宣称「到秒」。 +- 根因:未验证的技法被当成能力宣传;我方没有 D60 换格的评分实现,也没有对照实验。 +- 修复:(进行中)先做 G1 三引擎对账,再按 G2–G5 双向对比;结论出来前生产代码、技法路由、对外文案都不动。 +- 验证:待研究单 `docs/tasks/TASK-rectification-d60-two-way-20261028.md` 的 G1–G5 全部有结论后回填;不过门就写 `closed_by_design` 并附对外口径。 +- 防复发:研究单写死「先登记再跑、真值不可见、必须有安慰剂、负结果照写」。 +- 关联:BUG-1240、BUG-560、BUG-1090、BUG-1091。 +- 复发自:无。 +- 修复版本:分支 `codex/rectification-d60-two-way-20261028`(研究单,未合入)。 diff --git a/docs/tasks/PROGRESS-rectification-d60-two-way-20261028.md b/docs/tasks/PROGRESS-rectification-d60-two-way-20261028.md new file mode 100644 index 00000000..cc7887ff --- /dev/null +++ b/docs/tasks/PROGRESS-rectification-d60-two-way-20261028.md @@ -0,0 +1,41 @@ +# PROGRESS · D60 换格双向对比(2026-10-28,issue #149) + +- 分支:`codex/rectification-d60-two-way-20261028`,基于 `origin/staging` `88a03808`(写作时 `7721aa9a`,开工时以实际 head 为准) +- 执行:本地 Grok(Windows);验收:Claude +- BUG:BUG-1497 已登记为 `investigating` +- 生产代码、冻结文件、技法路由、对外文案:**零改动** + +## 开工前置(已完成) + +| 检查 | 命令 | 结果 | +| --- | --- | --- | +| 开工预检 | `scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45` | 退出码 1。`focused_tests` 里 `tests/test_preflight_fragment_scan.py::test_preflight_fragment_scan_reports_authority_layers_and_risk_buckets` 失败:断言 `.workbuddy/skills/jyotish-vedic-astrology` 镜像路径存在。Python 运行时、碎片扫描、外部引擎适配器、远端可见性四项通过;不把预检写成通过 | +| 基线四个测试文件 | `tests/test_nadi_seconds_research.py`、`test_holdout_v5_schema.py`、`test_varga_resolution_research.py`、`test_repo_privacy_markers.py` | 98 passed | +| 星历 | `python -c "import swisseph; print(swisseph.version)"` | 2.10.03 | +| PyJHora | 导入 `jhora`,`jhora.horoscope.chart.charts` 有 `shashtyamsa_chart` | 可用 | +| jyotishganit | `import jyotishganit` | **未安装**,G1 里记为 `blocked` | +| v5 数据集 | `references/real_case_calibration/minute_rectification_holdout_v5.json` | 77 例,存在 | + +环境:`PYTHONHASHSEED=0`、`PYTHONUTF8=1`(Windows 控制台编码)。 + +## 卡点:B 组的 D60 打分规则需要先定死 + +任务书 §两个组 只写了「窗口内上升的 D60 格每换一次,候选分成两段;用户给出日精度事件时,按预先登记的 D60 规则给两段打分,淘汰规则与 A 组的换升判据同一套」。 + +读了 A 组的实现(`scripts/research/probe_supply_after_six.py`):六题来自**日期级**边界(Vimshottari / Narayana / 上升换座),答案是拿事件日期与边界日期比先后(`union_boundary_dates`、`generate_refresh_probes`、`apply_answer`)。D60 换格是**分钟级**的,一天里会换很多次;把日期级答案直接套到分钟级边界上,同一天内几乎没有区分度,会一边倒淘汰。 + +两个可落地方案(已贴到 #149 请 Claude 定;我推荐 2): + +1. **D60 当后置分段**:先跑完 A 组六题,再把幸存候选按 D60 换格切段,用日精度事件的领域—宫位映射给每段打分,只留最高分段(同分不淘汰,其余不动)。改动大,且把 nadi 研究的方法族混进来,报告里要单独解释。 +2. **D60 换格题只认同日事件**:把窗口内每次 D60 换格当一条「事件 E 在换格之前还是之后」的题;只有事件日期与换格日期同一天时才作答,没有同日事件就跳过、不淘汰。与 A 组共用 `apply_answer`,只换边界来源。改动小、口径干净、可复现;代价是可用题数取决于同日事件,报告里要给出每题实际用了几条。 + +规则定了之后才写 `docs/research/d60_two_way_preregistration_2026_10_28.json` 并单独 commit,然后才第一次在 v5 上跑(红线 1)。 + +## 还没做 + +G1–G5、模型端到端对比、MEVG、报告:全部 `not_started`。没有产生任何结果数字,也没有据此改任何规则。 + +## 环境缺口 + +- `jyotishganit` 未安装;G1 的外部引擎只剩 PyJHora(门要求「与至少一个外部引擎一致 ≥95%」,仍可判)。 +- 预检的 `focused_tests` 有一条与本单无关的失败(上面已列)。