Compare commits

...
Author SHA1 Message Date
jesse-ux 98be2649ac research(d60): G1 stops on a production mapping mismatch (BUG-1497, BUG-1498, issue #149)
The D60 ascendant of the production classical_local mapping agrees with
PyJHora on 33 of 77 recorded times (42.9%). All 44 mismatches are 1-based
even signs and differ by exactly one sign; the repository's own vedastro
mode agrees with PyJHora on 77 of 77.

So G1 fails the 95% gate, but the cause is the production mapping rule in
scripts/varga.py, not a missing D60 signal. BUG-1498 records the
inconsistency as investigating. G2-G5 did not run and no scoring rule was
registered.

jyotishganit is not installed here and VedAstro was not called, so the
reconciliation is single-engine and says so.
2026-10-28 20:02:43 +08:00
jesse-ux 3bbf58e984 docs(d60): register BUG-1497 and record the two-way pre-work (issue #149)
Environment checks are done: swisseph 2.10.03, PyJHora importable with a
shashtyamsa chart, the v5 holdout present, and the four baseline test
files green (98 passed). jyotishganit is not installed, so G1 ends up with
PyJHora as the only external engine.

The B-group scoring rule cannot be implemented as written: the six-question
replay answers date-level boundary questions, while a D60 change happens
every couple of minutes inside one day. Two workable options are recorded
in PROGRESS and posted to the issue; nothing is scored before the rule is
preregistered.
2026-10-28 19:00:54 +08:00
3 changed files with 925 additions and 0 deletions
+33
View File
@@ -20447,3 +20447,36 @@
- 关联: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 已跑:生产 D60 上升与 PyJHora 只一致 33/77(42.9%),本仓 `mode='vedastro'` 的 D60 与 PyJHora 77/77。
失败原因是本仓生产 D60 映射本身(见 BUG-1498),不是「D60 没有信号」;G2–G5 暂缓,先把映射口径定下来再重跑 G1。结论出来前生产代码、技法路由、对外文案都不动。
- 验证:待研究单 `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`(研究单,未合入)。
## BUG-1498 | 生产 D60 映射把 1-based 偶数星座整体后移一个星座
- 状态:investigating
- 首次发现 / 最近更新:2026-10-28 / 2026-10-28(issue #149,G1 三引擎对账)
- 影响面:`scripts/varga.py::varga_map` 的 D60 分支(生产默认 `classical_local` 模式)。技法路由目前写「D60 只作参考」,不进校正打分。
- 现象:v5 的 77 例已知出生时间里,生产 D60 上升星座与 PyJHora(traditional Parasara,from sign)只一致 33 例;其余 44 例全部差 +1 个星座,且 44 例全是 1-based 偶数星座(金牛、巨蟹、处女、天蝎、摩羯、双鱼)。本仓 `mode='vedastro'` 的 D60 映射与 PyJHora 77/77 一致。
- 触发条件:读取生产 D60(`calc_varga(lon, 60)` 默认模式)。
- 根因:`varga_map` 的 D60 分支是 `(si+pi)%12 if o else (si+1+pi)%12`(`o` 为 1-based 奇数星座),对 1-based 偶数星座加 1;同文件 vedastro 映射是 `(si+pi)%12`。两套内部映射不一致,外部引擎与 vedastro 那套一致。哪一套符合来源尚未裁决,不预设 classical 就是错。
- 修复:未修。研究单红线要求生产代码零改动;要先按经典来源(BPHS / Raman)确认偶数星座是否真的从下一星座起算,再决定改映射还是改文档。
- 验证:`docs/research/d60_two_way_results_2026_10_28.json`(77 例逐条:上升经度、两套本仓 D60、PyJHora D60、是否一致)。
- 防复发:给 D60 补一条映射测试,锁定与外部引擎一致的规则;classical 与 vedastro 两种模式要么一致,要么在注释里写明来源差异。
- 关联:BUG-1497。
- 复发自:无。
- 修复版本:未修。
@@ -0,0 +1,833 @@
{
"task": "docs/tasks/TASK-rectification-d60-two-way-20261028.md",
"issue": 149,
"bug": "BUG-1497",
"gate": "G1 three-engine D60 reconciliation",
"generated_at_utc": "2026-10-28T12:02:20.260551+00:00",
"dataset": {
"path": "references/real_case_calibration/minute_rectification_holdout_v5.json",
"sha256": "ab365a3e3f4953d4b538f2c0889dc98ab89444a28340c3a7b29e2a864cdd687a",
"cases": 77
},
"profile": {
"ayanamsa": "raman",
"node_mode": "mean",
"house_system": "production compute_chart_data",
"pyjhora_ayanamsa_mode": "Raman",
"pyjhora_chart_method": 1
},
"engines": {
"own_classical_local": "varga.calc_varga(lon, 60) (production default)",
"own_vedastro_mode": "varga.calc_varga(lon, 60, mode='vedastro') (VEDASTRO_RAW_VERIFIED_DIVISIONS includes 60)",
"pyjhora": "jhora.horoscope.chart.charts.divisional_chart(jd, place, divisional_chart_factor=60), Lagna entry",
"jyotishganit": "blocked: not installed in this environment",
"vedastro": "blocked: no live call made in this run"
},
"result": {
"cases": 77,
"classical_matches": 33,
"classical_rate": 0.4286,
"vedastro_matches": 77,
"vedastro_rate": 1.0,
"mismatch_delta_histogram": {
"0": 33,
"1": 44,
"2": 0,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0,
"10": 0,
"11": 0
},
"mismatches_by_asc_sign_parity": {
"odd_1based": {
"cases": 33,
"matches": 33
},
"even_1based": {
"cases": 44,
"matches": 0
}
},
"gate_passed": false,
"gate_threshold": ">=95% agreement with at least one external engine",
"stop_rule": "G1 failing stops G2-G5 per the brief"
},
"finding": "The production classical D60 mapping shifts every 1-based even sign by one sign relative to PyJHora; the repository's own vedastro-mode D60 mapping agrees with PyJHora on all 77 cases. No scoring gate was run.",
"instances": [
{
"case_id": "albert_brooks_1947_aa_v4_holdout",
"asc_sign_idx": 2,
"ascendant_longitude": 71.1909,
"d60_classical": 0,
"d60_vedastro_mode": 0,
"d60_pyjhora_method1": 0,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "andrew_windsor_1960_aa_v4_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 109.6959,
"d60_classical": 7,
"d60_vedastro_mode": 6,
"d60_pyjhora_method1": 6,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "angelina_jolie_1975_aa_v4_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 96.8001,
"d60_classical": 5,
"d60_vedastro_mode": 4,
"d60_pyjhora_method1": 4,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "barack_obama_1961_aa_v4_holdout",
"asc_sign_idx": 9,
"ascendant_longitude": 296.1798,
"d60_classical": 2,
"d60_vedastro_mode": 1,
"d60_pyjhora_method1": 1,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "bernd_eichinger_1949_aa_v4_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 107.0009,
"d60_classical": 2,
"d60_vedastro_mode": 1,
"d60_pyjhora_method1": 1,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "chad_everett_1937_aa_v4_holdout",
"asc_sign_idx": 8,
"ascendant_longitude": 269.6959,
"d60_classical": 7,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "elizabeth_montgomery_1933_aa_v4_holdout",
"asc_sign_idx": 5,
"ascendant_longitude": 162.7012,
"d60_classical": 7,
"d60_vedastro_mode": 6,
"d60_pyjhora_method1": 6,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "elizabeth_taylor_1932_aa_v4_holdout",
"asc_sign_idx": 7,
"ascendant_longitude": 231.7983,
"d60_classical": 3,
"d60_vedastro_mode": 2,
"d60_pyjhora_method1": 2,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "iwao_takamoto_1925_aa_v4_holdout",
"asc_sign_idx": 7,
"ascendant_longitude": 216.2833,
"d60_classical": 8,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "john_robbins_1947_aa_v4_holdout",
"asc_sign_idx": 4,
"ascendant_longitude": 149.6725,
"d60_classical": 3,
"d60_vedastro_mode": 3,
"d60_pyjhora_method1": 3,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "joseph_kennedy_iii_1980_aa_v4_holdout",
"asc_sign_idx": 1,
"ascendant_longitude": 59.9029,
"d60_classical": 1,
"d60_vedastro_mode": 0,
"d60_pyjhora_method1": 0,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "kurt_cobain_1967_aa_v4_holdout",
"asc_sign_idx": 5,
"ascendant_longitude": 151.3987,
"d60_classical": 8,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "pablo_picasso_1881_aa_v4_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 104.8722,
"d60_classical": 9,
"d60_vedastro_mode": 8,
"d60_pyjhora_method1": 8,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "paul_ryan_1970_aa_v4_holdout",
"asc_sign_idx": 7,
"ascendant_longitude": 218.6428,
"d60_classical": 1,
"d60_vedastro_mode": 0,
"d60_pyjhora_method1": 0,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "salma_hayek_1966_aa_v4_holdout",
"asc_sign_idx": 4,
"ascendant_longitude": 145.4799,
"d60_classical": 6,
"d60_vedastro_mode": 6,
"d60_pyjhora_method1": 6,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "sean_lennon_1975_aa_v4_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 113.2594,
"d60_classical": 2,
"d60_vedastro_mode": 1,
"d60_pyjhora_method1": 1,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "sigmund_freud_1856_aa_v4_holdout",
"asc_sign_idx": 6,
"ascendant_longitude": 199.7737,
"d60_classical": 9,
"d60_vedastro_mode": 9,
"d60_pyjhora_method1": 9,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "steve_reich_1936_aa_v4_holdout",
"asc_sign_idx": 0,
"ascendant_longitude": 9.9031,
"d60_classical": 7,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "tiger_woods_1975_aa_v4_holdout",
"asc_sign_idx": 5,
"ascendant_longitude": 152.3435,
"d60_classical": 10,
"d60_vedastro_mode": 9,
"d60_pyjhora_method1": 9,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "tom_kennedy_1927_aa_v4_holdout",
"asc_sign_idx": 4,
"ascendant_longitude": 135.3649,
"d60_classical": 10,
"d60_vedastro_mode": 10,
"d60_pyjhora_method1": 10,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "adriana_lima_1981_aa_v5_holdout",
"asc_sign_idx": 7,
"ascendant_longitude": 234.5927,
"d60_classical": 9,
"d60_vedastro_mode": 8,
"d60_pyjhora_method1": 8,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "agatha_christie_1890_aa_v5_holdout",
"asc_sign_idx": 8,
"ascendant_longitude": 242.6992,
"d60_classical": 1,
"d60_vedastro_mode": 1,
"d60_pyjhora_method1": 1,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "albert_einstein_1879_aa_v5_holdout",
"asc_sign_idx": 2,
"ascendant_longitude": 80.9181,
"d60_classical": 7,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "alberto_fujimori_1938_aa_v5_holdout",
"asc_sign_idx": 1,
"ascendant_longitude": 30.0607,
"d60_classical": 2,
"d60_vedastro_mode": 1,
"d60_pyjhora_method1": 1,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "arthur_conan_doyle_1859_aa_v5_holdout",
"asc_sign_idx": 1,
"ascendant_longitude": 59.3382,
"d60_classical": 0,
"d60_vedastro_mode": 11,
"d60_pyjhora_method1": 11,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "audrey_hepburn_1929_aa_v5_holdout",
"asc_sign_idx": 10,
"ascendant_longitude": 307.1967,
"d60_classical": 0,
"d60_vedastro_mode": 0,
"d60_pyjhora_method1": 0,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "ayrton_senna_1960_aa_v5_holdout",
"asc_sign_idx": 9,
"ascendant_longitude": 289.3969,
"d60_classical": 0,
"d60_vedastro_mode": 11,
"d60_pyjhora_method1": 11,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "barbra_streisand_1942_aa_v5_holdout",
"asc_sign_idx": 11,
"ascendant_longitude": 346.7636,
"d60_classical": 9,
"d60_vedastro_mode": 8,
"d60_pyjhora_method1": 8,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "beyonce_1981_aa_v5_holdout",
"asc_sign_idx": 0,
"ascendant_longitude": 6.8595,
"d60_classical": 1,
"d60_vedastro_mode": 1,
"d60_pyjhora_method1": 1,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "bob_dylan_1941_aa_v5_holdout",
"asc_sign_idx": 7,
"ascendant_longitude": 238.7367,
"d60_classical": 5,
"d60_vedastro_mode": 4,
"d60_pyjhora_method1": 4,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "brigitte_bardot_1934_aa_v5_holdout",
"asc_sign_idx": 7,
"ascendant_longitude": 233.8797,
"d60_classical": 7,
"d60_vedastro_mode": 6,
"d60_pyjhora_method1": 6,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "bruce_lee_1940_aa_v5_holdout",
"asc_sign_idx": 7,
"ascendant_longitude": 224.6155,
"d60_classical": 1,
"d60_vedastro_mode": 0,
"d60_pyjhora_method1": 0,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "catherine_deneuve_1943_aa_v5_holdout",
"asc_sign_idx": 8,
"ascendant_longitude": 259.5116,
"d60_classical": 11,
"d60_vedastro_mode": 11,
"d60_pyjhora_method1": 11,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "charles_de_gaulle_1890_aa_v5_holdout",
"asc_sign_idx": 6,
"ascendant_longitude": 181.278,
"d60_classical": 8,
"d60_vedastro_mode": 8,
"d60_pyjhora_method1": 8,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "cher_1946_aa_v5_holdout",
"asc_sign_idx": 2,
"ascendant_longitude": 76.9514,
"d60_classical": 11,
"d60_vedastro_mode": 11,
"d60_pyjhora_method1": 11,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "clint_eastwood_1930_aa_v5_holdout",
"asc_sign_idx": 6,
"ascendant_longitude": 207.1468,
"d60_classical": 0,
"d60_vedastro_mode": 0,
"d60_pyjhora_method1": 0,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "daniel_barenboim_1942_aa_v5_holdout",
"asc_sign_idx": 9,
"ascendant_longitude": 292.2015,
"d60_classical": 6,
"d60_vedastro_mode": 5,
"d60_pyjhora_method1": 5,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "diane_cilento_1932_aa_v5_holdout",
"asc_sign_idx": 9,
"ascendant_longitude": 290.6112,
"d60_classical": 3,
"d60_vedastro_mode": 2,
"d60_pyjhora_method1": 2,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "dingdong_dantes_1980_aa_v5_holdout",
"asc_sign_idx": 6,
"ascendant_longitude": 181.5986,
"d60_classical": 9,
"d60_vedastro_mode": 9,
"d60_pyjhora_method1": 9,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "donald_trump_1946_aa_v5_holdout",
"asc_sign_idx": 4,
"ascendant_longitude": 128.3089,
"d60_classical": 8,
"d60_vedastro_mode": 8,
"d60_pyjhora_method1": 8,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "edith_piaf_1915_aa_v5_holdout",
"asc_sign_idx": 7,
"ascendant_longitude": 212.402,
"d60_classical": 0,
"d60_vedastro_mode": 11,
"d60_pyjhora_method1": 11,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "elvis_presley_1935_aa_v5_holdout",
"asc_sign_idx": 7,
"ascendant_longitude": 230.8658,
"d60_classical": 1,
"d60_vedastro_mode": 0,
"d60_pyjhora_method1": 0,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "francois_hollande_1954_aa_v5_holdout",
"asc_sign_idx": 1,
"ascendant_longitude": 46.0748,
"d60_classical": 10,
"d60_vedastro_mode": 9,
"d60_pyjhora_method1": 9,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "frida_kahlo_1907_aa_v5_holdout",
"asc_sign_idx": 4,
"ascendant_longitude": 122.4798,
"d60_classical": 8,
"d60_vedastro_mode": 8,
"d60_pyjhora_method1": 8,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "george_w_bush_1946_aa_v5_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 105.4441,
"d60_classical": 10,
"d60_vedastro_mode": 9,
"d60_pyjhora_method1": 9,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "gisele_bundchen_1980_aa_v5_holdout",
"asc_sign_idx": 8,
"ascendant_longitude": 263.6478,
"d60_classical": 7,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "gustavo_kuerten_1976_aa_v5_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 92.6966,
"d60_classical": 9,
"d60_vedastro_mode": 8,
"d60_pyjhora_method1": 8,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "imelda_marcos_1929_aa_v5_holdout",
"asc_sign_idx": 2,
"ascendant_longitude": 77.1545,
"d60_classical": 0,
"d60_vedastro_mode": 0,
"d60_pyjhora_method1": 0,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "janis_joplin_1943_aa_v5_holdout",
"asc_sign_idx": 10,
"ascendant_longitude": 303.9231,
"d60_classical": 5,
"d60_vedastro_mode": 5,
"d60_pyjhora_method1": 5,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "jennifer_aniston_1969_aa_v5_holdout",
"asc_sign_idx": 6,
"ascendant_longitude": 182.6838,
"d60_classical": 11,
"d60_vedastro_mode": 11,
"d60_pyjhora_method1": 11,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "jimi_hendrix_1942_aa_v5_holdout",
"asc_sign_idx": 8,
"ascendant_longitude": 243.0694,
"d60_classical": 2,
"d60_vedastro_mode": 2,
"d60_pyjhora_method1": 2,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "johnny_depp_1963_aa_v5_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 110.5385,
"d60_classical": 9,
"d60_vedastro_mode": 8,
"d60_pyjhora_method1": 8,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "judy_garland_1922_aa_v5_holdout",
"asc_sign_idx": 2,
"ascendant_longitude": 79.5603,
"d60_classical": 5,
"d60_vedastro_mode": 5,
"d60_pyjhora_method1": 5,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "juscelino_kubitschek_1902_aa_v5_holdout",
"asc_sign_idx": 9,
"ascendant_longitude": 274.8708,
"d60_classical": 7,
"d60_vedastro_mode": 6,
"d60_pyjhora_method1": 6,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "kamala_harris_1964_aa_v5_holdout",
"asc_sign_idx": 2,
"ascendant_longitude": 62.5086,
"d60_classical": 7,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "leonardo_dicaprio_1974_aa_v5_holdout",
"asc_sign_idx": 5,
"ascendant_longitude": 161.0553,
"d60_classical": 4,
"d60_vedastro_mode": 3,
"d60_pyjhora_method1": 3,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "lionel_messi_1987_aa_v5_holdout",
"asc_sign_idx": 9,
"ascendant_longitude": 282.7709,
"d60_classical": 11,
"d60_vedastro_mode": 10,
"d60_pyjhora_method1": 10,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "lou_diamond_phillips_1962_aa_v5_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 116.2537,
"d60_classical": 8,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "manuel_puig_1932_aa_v5_holdout",
"asc_sign_idx": 6,
"ascendant_longitude": 186.6657,
"d60_classical": 7,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "marilyn_monroe_1926_aa_v5_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 111.6899,
"d60_classical": 11,
"d60_vedastro_mode": 10,
"d60_pyjhora_method1": 10,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "meryl_streep_1949_aa_v5_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 101.0442,
"d60_classical": 2,
"d60_vedastro_mode": 1,
"d60_pyjhora_method1": 1,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "miley_cyrus_1992_aa_v5_holdout",
"asc_sign_idx": 1,
"ascendant_longitude": 36.3265,
"d60_classical": 2,
"d60_vedastro_mode": 1,
"d60_pyjhora_method1": 1,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "muhammad_ali_1942_aa_v5_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 117.9238,
"d60_classical": 11,
"d60_vedastro_mode": 10,
"d60_pyjhora_method1": 10,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "nicolas_sarkozy_1955_aa_v5_holdout",
"asc_sign_idx": 5,
"ascendant_longitude": 154.3377,
"d60_classical": 2,
"d60_vedastro_mode": 1,
"d60_pyjhora_method1": 1,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "pele_1940_aa_v5_holdout",
"asc_sign_idx": 4,
"ascendant_longitude": 137.9234,
"d60_classical": 3,
"d60_vedastro_mode": 3,
"d60_pyjhora_method1": 3,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "piolo_pascual_1977_aa_v5_holdout",
"asc_sign_idx": 4,
"ascendant_longitude": 132.9944,
"d60_classical": 5,
"d60_vedastro_mode": 5,
"d60_pyjhora_method1": 5,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "prince_1958_aa_v5_holdout",
"asc_sign_idx": 6,
"ascendant_longitude": 204.8647,
"d60_classical": 7,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "rafael_nadal_1986_aa_v5_holdout",
"asc_sign_idx": 6,
"ascendant_longitude": 197.6444,
"d60_classical": 5,
"d60_vedastro_mode": 5,
"d60_pyjhora_method1": 5,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "rudy_fernandez_1952_aa_v5_holdout",
"asc_sign_idx": 5,
"ascendant_longitude": 178.9455,
"d60_classical": 3,
"d60_vedastro_mode": 2,
"d60_pyjhora_method1": 2,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "salvador_dali_1904_aa_v5_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 91.157,
"d60_classical": 6,
"d60_vedastro_mode": 5,
"d60_pyjhora_method1": 5,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "serena_williams_1981_aa_v5_holdout",
"asc_sign_idx": 0,
"ascendant_longitude": 11.0106,
"d60_classical": 10,
"d60_vedastro_mode": 10,
"d60_pyjhora_method1": 10,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "silvio_santos_1930_aa_v5_holdout",
"asc_sign_idx": 5,
"ascendant_longitude": 152.8918,
"d60_classical": 11,
"d60_vedastro_mode": 10,
"d60_pyjhora_method1": 10,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "sophia_loren_1934_aa_v5_holdout",
"asc_sign_idx": 8,
"ascendant_longitude": 253.9547,
"d60_classical": 11,
"d60_vedastro_mode": 11,
"d60_pyjhora_method1": 11,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "venus_williams_1980_aa_v5_holdout",
"asc_sign_idx": 5,
"ascendant_longitude": 171.3938,
"d60_classical": 0,
"d60_vedastro_mode": 11,
"d60_pyjhora_method1": 11,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "vincent_van_gogh_1853_aa_v5_holdout",
"asc_sign_idx": 3,
"ascendant_longitude": 90.7335,
"d60_classical": 5,
"d60_vedastro_mode": 4,
"d60_pyjhora_method1": 4,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
},
{
"case_id": "whitney_houston_1963_aa_v5_holdout",
"asc_sign_idx": 10,
"ascendant_longitude": 316.5233,
"d60_classical": 7,
"d60_vedastro_mode": 7,
"d60_pyjhora_method1": 7,
"classical_matches_pyjhora": true,
"vedastro_matches_pyjhora": true
},
{
"case_id": "zinedine_zidane_1972_aa_v5_holdout",
"asc_sign_idx": 1,
"ascendant_longitude": 36.9097,
"d60_classical": 3,
"d60_vedastro_mode": 2,
"d60_pyjhora_method1": 2,
"classical_matches_pyjhora": false,
"vedastro_matches_pyjhora": true
}
]
}
@@ -0,0 +1,59 @@
# 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 三引擎 D60 对账(已跑,门不过)
结果 JSON:`docs/research/d60_two_way_results_2026_10_28.json`(77 例逐条:上升经度、本仓两套 D60、PyJHora D60、是否一致)。
| 引擎 | 与生产 D60 一致的例数 | 比例 |
| --- | ---: | ---: |
| 本仓生产 `classical_local`(默认) | 33 / 77 | 42.9% |
| 本仓 `mode='vedastro'` | 77 / 77 | 100% |
| PyJHora(traditional Parasara, from sign) | 作为对账基准 | — |
| jyotishganit | `blocked`:本机未安装 | — |
| VedAstro | `blocked`:本次没有联网调用 | — |
- 差的 44 例全部是 **1-based 偶数星座**(金牛、巨蟹、处女、天蝎、摩羯、双鱼),差值恒为 +1 个星座;一致的 33 例全部是 1-based 奇数星座。
- 根因在 `scripts/varga.py::varga_map` 的 D60 分支(`(si+pi)%12 if o else (si+1+pi)%12`),同文件的 vedastro 映射是 `(si+pi)%12`,与 PyJHora 一致。**这是生产映射的口径问题,不是「D60 没有信号」**,已登记 BUG-1498(investigating)。
- 门要求「与至少一个外部引擎一致 ≥ 95%」,实际 42.9%(生产口径)→ **G1 判不过**,按任务书 G2–G5 全部停。没有跑任何计分,也没有据此改规则。
## 还没做
G2–G5、模型端到端对比、MEVG、报告:全部 `not_started`(G1 不过,按门停止)。
下一步要产品/规划定:D60 映射是修 `varga.py`(改生产、要重新冻结)还是改文档承认这是另一种口径。定了之后重跑 G1;G1 过了才写 G2–G5 的先登记 JSON。
## 环境缺口
- `jyotishganit` 未安装;G1 的外部引擎只剩 PyJHora(门要求「与至少一个外部引擎一致 ≥95%」,仍可判)。
- 预检的 `focused_tests` 有一条与本单无关的失败(上面已列)。