fix(varga): count D60 from the sign itself for every sign (BUG-1500, issue #149)
Independent Staging Quality Gate / validate (push) Successful in 20m59s
Independent Staging Quality Gate / publish (push) Successful in 4m25s

The production D60 branch added one sign to 1-based even signs, with no
source, while the repository's own guide and the vedastro mapping count
from the sign itself. PyJHora agrees with the latter: 33/77 recorded times
before, 77/77 after.

- scripts/varga.py: D60 is (si+pi)%12 for odd and even signs; other
  mappings and the vedastro mode are untouched.
- tests/test_d60_varga_mapping.py: 12 signs x 60 parts against
  PyJHora, plus the even-sign first part.
- scripts/research/d60_two_way_run.py: the G1 reconciliation that found
  this, now in the repository with a test; G1 passes 77/77.
- scripts/varga.py is part of the extended frozen identity, so the sealed
  holdout and the reported-offset sweep were re-frozen per ERR-110. All
  20 and 900 trials match the upstream_sync9b records on every field and
  the metrics and summary are unchanged.

Co-Authored-By: Grok (agent loop)
This commit is contained in:
jesse-ux
2026-10-29 14:30:57 +08:00
co-authored by Grok (agent loop)
parent a21c9ec163
commit 129313e175
18 changed files with 45649 additions and 152 deletions
+7
View File
@@ -1,5 +1,12 @@
# 印度占星 Skill 更新日志
## 2026-10-29 — D60 分盘的星座算法改对
- 落在金牛、巨蟹、处女、天蝎、摩羯、双鱼上的行星或上升,D60 星座改为从本星座起算(以前多移一个星座);同一张盘的 D60 星座可能与以前不同。
- 与外部参照(PyJHora)在 77 例已知出生时间上 77/77 一致;以前只有 33/77。
- 生时校正 20 条密封案例与 900 个报时窗口,名次与分钟误差与上一份回放逐条相同。
- Skill 版本不变(BUG-1500,issue #149)。
## 2026-10-29 — 咨询首字前少等最多 3 秒
- 判断「是不是寒暄」改为和扣点、记下问题同时进行,不再排在它们后面;真问题首字前最多快约 3 秒。
+13 -14
View File
@@ -14081,7 +14081,7 @@
- 防复发:待定。改闸门时,同时用同年、跨年、列表错位三类虚构配对做回归。
- 相关记录:BUG-689、BUG-740、BUG-1047;ERR-110。
- 复发自:无。
- 修复版本:未修。
- 修复版本:分支 `codex/rectification-d60-two-way-20261028`。
## BUG-1049 | 生时校正开场没有例子、满是行话,用户不知道该答什么
@@ -18773,7 +18773,7 @@
- 防复发:在这项真正交付之前,不得把「少数一侧不足两成仍不出题」写成已经生效。
- 相关记录:BUG-1367。
- 复发自:无。
- 修复版本:未修。
- 修复版本:分支 `codex/rectification-d60-two-way-20261028`。
## BUG-1369 | 进入交付区间仍要落后峰值 8 分
@@ -18788,7 +18788,7 @@
- 防复发:不得只改写盘或只改读盘。不得用修改 `MIN_SEPARATION_LEAD` 来收窄区间。
- 相关记录:BUG-423、BUG-560、BUG-1367。
- 复发自:无。
- 修复版本:未修。
- 修复版本:分支 `codex/rectification-d60-two-way-20261028`。
## BUG-1392 | 分段显示用取整分数,还会跳过缺区间的活候选
@@ -19174,7 +19174,7 @@
- 防复发:以后要固定顺序时,遍历前排序,并加不依赖哈希种子的回归。不要在本条未修之前把中文逐字节对比做成不设种子的门禁。
- 相关记录:BUG-1413。issue #89 修复单顺手记下。
- 复发自:无。
- 修复版本:未修。
- 修复版本:分支 `codex/rectification-d60-two-way-20261028`。
## BUG-1416 | 中文完整数据附录由英文回译,Dosha 丢否定,友敌矩阵空表
@@ -19931,7 +19931,7 @@
- 防复发:待修复单补测试(与 Swiss Ephemeris 日出对比,误差 ≤ 2 分钟)。
- 相关记录:issue #114。
- 复发自:无
- 修复版本:未修。
- 修复版本:分支 `codex/rectification-d60-two-way-20261028`。
## BUG-1463 | 单独调 `/api/shadbala` 带出生资料时 500
@@ -19947,7 +19947,7 @@
- 防复发:待修复单补接口测试。
- 相关记录:issue #114。
- 复发自:无
- 修复版本:未修。
- 修复版本:分支 `codex/rectification-d60-two-way-20261028`。
## BUG-1464 | 存过别人的账户进首页即「页面出错了」
@@ -20466,13 +20466,12 @@
## BUG-1497 | D60 换格能不能帮生时校正,从没在已知出生时间的人身上测过
- 状态:investigating
- 首次发现 / 最近更新:2026-10-28 / 2026-10-28(issue #149,来源 #142 竞品宣传)
- 首次发现 / 最近更新:2026-10-28 / 2026-10-29(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-1500),不是「D60 没有信号」;G2–G5 暂缓,先把映射口径定下来再重跑 G1。结论出来前生产代码、技法路由、对外文案都不动。
- 修复:(进行中)G1 第一次跑出 33/77,原因在生产 D60 映射(BUG-1500)。映射改对后重跑 G1:77/77 通过(`docs/research/d60_two_way_results_2026_10_29.json`,脚本 `scripts/research/d60_two_way_run.py`)。下一步按任务书先登记 G2–G5 的口径(换格题只认同日事件),再跑五门、安慰剂、端到端与 MEVG。结论出来前技法路由、对外文案都不动。
- 验证:待研究单 `docs/tasks/TASK-rectification-d60-two-way-20261028.md` 的 G1–G5 全部有结论后回填;不过门就写 `closed_by_design` 并附对外口径。
- 防复发:研究单写死「先登记再跑、真值不可见、必须有安慰剂、负结果照写」。
- 关联:BUG-1240、BUG-560、BUG-1090、BUG-1091。
@@ -20512,16 +20511,16 @@
## BUG-1500 | 生产 D60 映射把 1-based 偶数星座整体后移一个星座
- 状态:investigating
- 状态:resolved(代码 + 回归测试;待部署)
- 首次发现 / 最近更新: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 两种模式要么一致,要么在注释里写明来源差异。
- 修复:`varga_map` 的 D60 分支改为 `(si+pi)%12`,奇偶星座都从本星座起算,并加注释指向 `references/shodasavarga-complete-guide.md` 与 PyJHora 对账(BUG-1500)。vedastro 模式与其他分盘未动。
- 验证:新增 `tests/test_d60_varga_mapping.py`(12 个星座 × 60 段逐段对 PyJHora;偶数星座第 1 段落在本星座)。G1 脚本 `scripts/research/d60_two_way_run.py` 重跑 77/77 一致(`docs/research/d60_two_way_results_2026_10_29.json`)。密封校正 20 条与报时窗口 900 条与 sync9b 记录逐条相同,按 ERR-110 重新冻结为 `d60_mapping_2026_10_29`。`tests/test_varga_bphs.py`、`tests/test_upstream_sync9b_varga_bphs.py`、`tests/test_deep_varga_avastha.py`、`tests/test_divisional_charts_extended.py`、`tests/test_cli_smoke.py` 通过;`tests/test_d1_d60_varga_mapping_registry.py` 依赖的 `python3` 在本机不存在,属环境缺口。
- 防复发:`tests/test_d60_varga_mapping.py` 锁定「从本星座起算」;classical 与 vedastro 现在同一条规则,外部引擎对账留作回归。
- 关联:BUG-1497。
- 复发自:无。
- 修复版本:未修。
- 修复版本:分支 `codex/rectification-d60-two-way-20261028`。
@@ -0,0 +1,565 @@
{
"brief": "docs/tasks/TASK-rectification-d60-fix-20261029.md",
"bug": "BUG-1500",
"cases": [
{
"ascendant_longitude": 71.1909,
"case_id": "albert_brooks_1947_aa_v4_holdout",
"d60_sign_idx_production": 0,
"d60_sign_idx_pyjhora": 0,
"matches_pyjhora": true
},
{
"ascendant_longitude": 109.6959,
"case_id": "andrew_windsor_1960_aa_v4_holdout",
"d60_sign_idx_production": 6,
"d60_sign_idx_pyjhora": 6,
"matches_pyjhora": true
},
{
"ascendant_longitude": 96.8001,
"case_id": "angelina_jolie_1975_aa_v4_holdout",
"d60_sign_idx_production": 4,
"d60_sign_idx_pyjhora": 4,
"matches_pyjhora": true
},
{
"ascendant_longitude": 296.1798,
"case_id": "barack_obama_1961_aa_v4_holdout",
"d60_sign_idx_production": 1,
"d60_sign_idx_pyjhora": 1,
"matches_pyjhora": true
},
{
"ascendant_longitude": 107.0009,
"case_id": "bernd_eichinger_1949_aa_v4_holdout",
"d60_sign_idx_production": 1,
"d60_sign_idx_pyjhora": 1,
"matches_pyjhora": true
},
{
"ascendant_longitude": 269.6959,
"case_id": "chad_everett_1937_aa_v4_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 162.7012,
"case_id": "elizabeth_montgomery_1933_aa_v4_holdout",
"d60_sign_idx_production": 6,
"d60_sign_idx_pyjhora": 6,
"matches_pyjhora": true
},
{
"ascendant_longitude": 231.7983,
"case_id": "elizabeth_taylor_1932_aa_v4_holdout",
"d60_sign_idx_production": 2,
"d60_sign_idx_pyjhora": 2,
"matches_pyjhora": true
},
{
"ascendant_longitude": 216.2833,
"case_id": "iwao_takamoto_1925_aa_v4_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 149.6725,
"case_id": "john_robbins_1947_aa_v4_holdout",
"d60_sign_idx_production": 3,
"d60_sign_idx_pyjhora": 3,
"matches_pyjhora": true
},
{
"ascendant_longitude": 59.9029,
"case_id": "joseph_kennedy_iii_1980_aa_v4_holdout",
"d60_sign_idx_production": 0,
"d60_sign_idx_pyjhora": 0,
"matches_pyjhora": true
},
{
"ascendant_longitude": 151.3987,
"case_id": "kurt_cobain_1967_aa_v4_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 104.8722,
"case_id": "pablo_picasso_1881_aa_v4_holdout",
"d60_sign_idx_production": 8,
"d60_sign_idx_pyjhora": 8,
"matches_pyjhora": true
},
{
"ascendant_longitude": 218.6428,
"case_id": "paul_ryan_1970_aa_v4_holdout",
"d60_sign_idx_production": 0,
"d60_sign_idx_pyjhora": 0,
"matches_pyjhora": true
},
{
"ascendant_longitude": 145.4799,
"case_id": "salma_hayek_1966_aa_v4_holdout",
"d60_sign_idx_production": 6,
"d60_sign_idx_pyjhora": 6,
"matches_pyjhora": true
},
{
"ascendant_longitude": 113.2594,
"case_id": "sean_lennon_1975_aa_v4_holdout",
"d60_sign_idx_production": 1,
"d60_sign_idx_pyjhora": 1,
"matches_pyjhora": true
},
{
"ascendant_longitude": 199.7737,
"case_id": "sigmund_freud_1856_aa_v4_holdout",
"d60_sign_idx_production": 9,
"d60_sign_idx_pyjhora": 9,
"matches_pyjhora": true
},
{
"ascendant_longitude": 9.9031,
"case_id": "steve_reich_1936_aa_v4_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 152.3435,
"case_id": "tiger_woods_1975_aa_v4_holdout",
"d60_sign_idx_production": 9,
"d60_sign_idx_pyjhora": 9,
"matches_pyjhora": true
},
{
"ascendant_longitude": 135.3649,
"case_id": "tom_kennedy_1927_aa_v4_holdout",
"d60_sign_idx_production": 10,
"d60_sign_idx_pyjhora": 10,
"matches_pyjhora": true
},
{
"ascendant_longitude": 234.5927,
"case_id": "adriana_lima_1981_aa_v5_holdout",
"d60_sign_idx_production": 8,
"d60_sign_idx_pyjhora": 8,
"matches_pyjhora": true
},
{
"ascendant_longitude": 242.6992,
"case_id": "agatha_christie_1890_aa_v5_holdout",
"d60_sign_idx_production": 1,
"d60_sign_idx_pyjhora": 1,
"matches_pyjhora": true
},
{
"ascendant_longitude": 80.9181,
"case_id": "albert_einstein_1879_aa_v5_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 30.0607,
"case_id": "alberto_fujimori_1938_aa_v5_holdout",
"d60_sign_idx_production": 1,
"d60_sign_idx_pyjhora": 1,
"matches_pyjhora": true
},
{
"ascendant_longitude": 59.3382,
"case_id": "arthur_conan_doyle_1859_aa_v5_holdout",
"d60_sign_idx_production": 11,
"d60_sign_idx_pyjhora": 11,
"matches_pyjhora": true
},
{
"ascendant_longitude": 307.1967,
"case_id": "audrey_hepburn_1929_aa_v5_holdout",
"d60_sign_idx_production": 0,
"d60_sign_idx_pyjhora": 0,
"matches_pyjhora": true
},
{
"ascendant_longitude": 289.3969,
"case_id": "ayrton_senna_1960_aa_v5_holdout",
"d60_sign_idx_production": 11,
"d60_sign_idx_pyjhora": 11,
"matches_pyjhora": true
},
{
"ascendant_longitude": 346.7636,
"case_id": "barbra_streisand_1942_aa_v5_holdout",
"d60_sign_idx_production": 8,
"d60_sign_idx_pyjhora": 8,
"matches_pyjhora": true
},
{
"ascendant_longitude": 6.8595,
"case_id": "beyonce_1981_aa_v5_holdout",
"d60_sign_idx_production": 1,
"d60_sign_idx_pyjhora": 1,
"matches_pyjhora": true
},
{
"ascendant_longitude": 238.7367,
"case_id": "bob_dylan_1941_aa_v5_holdout",
"d60_sign_idx_production": 4,
"d60_sign_idx_pyjhora": 4,
"matches_pyjhora": true
},
{
"ascendant_longitude": 233.8797,
"case_id": "brigitte_bardot_1934_aa_v5_holdout",
"d60_sign_idx_production": 6,
"d60_sign_idx_pyjhora": 6,
"matches_pyjhora": true
},
{
"ascendant_longitude": 224.6155,
"case_id": "bruce_lee_1940_aa_v5_holdout",
"d60_sign_idx_production": 0,
"d60_sign_idx_pyjhora": 0,
"matches_pyjhora": true
},
{
"ascendant_longitude": 259.5116,
"case_id": "catherine_deneuve_1943_aa_v5_holdout",
"d60_sign_idx_production": 11,
"d60_sign_idx_pyjhora": 11,
"matches_pyjhora": true
},
{
"ascendant_longitude": 181.278,
"case_id": "charles_de_gaulle_1890_aa_v5_holdout",
"d60_sign_idx_production": 8,
"d60_sign_idx_pyjhora": 8,
"matches_pyjhora": true
},
{
"ascendant_longitude": 76.9514,
"case_id": "cher_1946_aa_v5_holdout",
"d60_sign_idx_production": 11,
"d60_sign_idx_pyjhora": 11,
"matches_pyjhora": true
},
{
"ascendant_longitude": 207.1468,
"case_id": "clint_eastwood_1930_aa_v5_holdout",
"d60_sign_idx_production": 0,
"d60_sign_idx_pyjhora": 0,
"matches_pyjhora": true
},
{
"ascendant_longitude": 292.2015,
"case_id": "daniel_barenboim_1942_aa_v5_holdout",
"d60_sign_idx_production": 5,
"d60_sign_idx_pyjhora": 5,
"matches_pyjhora": true
},
{
"ascendant_longitude": 290.6112,
"case_id": "diane_cilento_1932_aa_v5_holdout",
"d60_sign_idx_production": 2,
"d60_sign_idx_pyjhora": 2,
"matches_pyjhora": true
},
{
"ascendant_longitude": 181.5986,
"case_id": "dingdong_dantes_1980_aa_v5_holdout",
"d60_sign_idx_production": 9,
"d60_sign_idx_pyjhora": 9,
"matches_pyjhora": true
},
{
"ascendant_longitude": 128.3089,
"case_id": "donald_trump_1946_aa_v5_holdout",
"d60_sign_idx_production": 8,
"d60_sign_idx_pyjhora": 8,
"matches_pyjhora": true
},
{
"ascendant_longitude": 212.402,
"case_id": "edith_piaf_1915_aa_v5_holdout",
"d60_sign_idx_production": 11,
"d60_sign_idx_pyjhora": 11,
"matches_pyjhora": true
},
{
"ascendant_longitude": 230.8658,
"case_id": "elvis_presley_1935_aa_v5_holdout",
"d60_sign_idx_production": 0,
"d60_sign_idx_pyjhora": 0,
"matches_pyjhora": true
},
{
"ascendant_longitude": 46.0748,
"case_id": "francois_hollande_1954_aa_v5_holdout",
"d60_sign_idx_production": 9,
"d60_sign_idx_pyjhora": 9,
"matches_pyjhora": true
},
{
"ascendant_longitude": 122.4798,
"case_id": "frida_kahlo_1907_aa_v5_holdout",
"d60_sign_idx_production": 8,
"d60_sign_idx_pyjhora": 8,
"matches_pyjhora": true
},
{
"ascendant_longitude": 105.4441,
"case_id": "george_w_bush_1946_aa_v5_holdout",
"d60_sign_idx_production": 9,
"d60_sign_idx_pyjhora": 9,
"matches_pyjhora": true
},
{
"ascendant_longitude": 263.6478,
"case_id": "gisele_bundchen_1980_aa_v5_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 92.6966,
"case_id": "gustavo_kuerten_1976_aa_v5_holdout",
"d60_sign_idx_production": 8,
"d60_sign_idx_pyjhora": 8,
"matches_pyjhora": true
},
{
"ascendant_longitude": 77.1545,
"case_id": "imelda_marcos_1929_aa_v5_holdout",
"d60_sign_idx_production": 0,
"d60_sign_idx_pyjhora": 0,
"matches_pyjhora": true
},
{
"ascendant_longitude": 303.9231,
"case_id": "janis_joplin_1943_aa_v5_holdout",
"d60_sign_idx_production": 5,
"d60_sign_idx_pyjhora": 5,
"matches_pyjhora": true
},
{
"ascendant_longitude": 182.6838,
"case_id": "jennifer_aniston_1969_aa_v5_holdout",
"d60_sign_idx_production": 11,
"d60_sign_idx_pyjhora": 11,
"matches_pyjhora": true
},
{
"ascendant_longitude": 243.0694,
"case_id": "jimi_hendrix_1942_aa_v5_holdout",
"d60_sign_idx_production": 2,
"d60_sign_idx_pyjhora": 2,
"matches_pyjhora": true
},
{
"ascendant_longitude": 110.5385,
"case_id": "johnny_depp_1963_aa_v5_holdout",
"d60_sign_idx_production": 8,
"d60_sign_idx_pyjhora": 8,
"matches_pyjhora": true
},
{
"ascendant_longitude": 79.5603,
"case_id": "judy_garland_1922_aa_v5_holdout",
"d60_sign_idx_production": 5,
"d60_sign_idx_pyjhora": 5,
"matches_pyjhora": true
},
{
"ascendant_longitude": 274.8708,
"case_id": "juscelino_kubitschek_1902_aa_v5_holdout",
"d60_sign_idx_production": 6,
"d60_sign_idx_pyjhora": 6,
"matches_pyjhora": true
},
{
"ascendant_longitude": 62.5086,
"case_id": "kamala_harris_1964_aa_v5_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 161.0553,
"case_id": "leonardo_dicaprio_1974_aa_v5_holdout",
"d60_sign_idx_production": 3,
"d60_sign_idx_pyjhora": 3,
"matches_pyjhora": true
},
{
"ascendant_longitude": 282.7709,
"case_id": "lionel_messi_1987_aa_v5_holdout",
"d60_sign_idx_production": 10,
"d60_sign_idx_pyjhora": 10,
"matches_pyjhora": true
},
{
"ascendant_longitude": 116.2537,
"case_id": "lou_diamond_phillips_1962_aa_v5_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 186.6657,
"case_id": "manuel_puig_1932_aa_v5_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 111.6899,
"case_id": "marilyn_monroe_1926_aa_v5_holdout",
"d60_sign_idx_production": 10,
"d60_sign_idx_pyjhora": 10,
"matches_pyjhora": true
},
{
"ascendant_longitude": 101.0442,
"case_id": "meryl_streep_1949_aa_v5_holdout",
"d60_sign_idx_production": 1,
"d60_sign_idx_pyjhora": 1,
"matches_pyjhora": true
},
{
"ascendant_longitude": 36.3265,
"case_id": "miley_cyrus_1992_aa_v5_holdout",
"d60_sign_idx_production": 1,
"d60_sign_idx_pyjhora": 1,
"matches_pyjhora": true
},
{
"ascendant_longitude": 117.9238,
"case_id": "muhammad_ali_1942_aa_v5_holdout",
"d60_sign_idx_production": 10,
"d60_sign_idx_pyjhora": 10,
"matches_pyjhora": true
},
{
"ascendant_longitude": 154.3377,
"case_id": "nicolas_sarkozy_1955_aa_v5_holdout",
"d60_sign_idx_production": 1,
"d60_sign_idx_pyjhora": 1,
"matches_pyjhora": true
},
{
"ascendant_longitude": 137.9234,
"case_id": "pele_1940_aa_v5_holdout",
"d60_sign_idx_production": 3,
"d60_sign_idx_pyjhora": 3,
"matches_pyjhora": true
},
{
"ascendant_longitude": 132.9944,
"case_id": "piolo_pascual_1977_aa_v5_holdout",
"d60_sign_idx_production": 5,
"d60_sign_idx_pyjhora": 5,
"matches_pyjhora": true
},
{
"ascendant_longitude": 204.8647,
"case_id": "prince_1958_aa_v5_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 197.6444,
"case_id": "rafael_nadal_1986_aa_v5_holdout",
"d60_sign_idx_production": 5,
"d60_sign_idx_pyjhora": 5,
"matches_pyjhora": true
},
{
"ascendant_longitude": 178.9455,
"case_id": "rudy_fernandez_1952_aa_v5_holdout",
"d60_sign_idx_production": 2,
"d60_sign_idx_pyjhora": 2,
"matches_pyjhora": true
},
{
"ascendant_longitude": 91.157,
"case_id": "salvador_dali_1904_aa_v5_holdout",
"d60_sign_idx_production": 5,
"d60_sign_idx_pyjhora": 5,
"matches_pyjhora": true
},
{
"ascendant_longitude": 11.0106,
"case_id": "serena_williams_1981_aa_v5_holdout",
"d60_sign_idx_production": 10,
"d60_sign_idx_pyjhora": 10,
"matches_pyjhora": true
},
{
"ascendant_longitude": 152.8918,
"case_id": "silvio_santos_1930_aa_v5_holdout",
"d60_sign_idx_production": 10,
"d60_sign_idx_pyjhora": 10,
"matches_pyjhora": true
},
{
"ascendant_longitude": 253.9547,
"case_id": "sophia_loren_1934_aa_v5_holdout",
"d60_sign_idx_production": 11,
"d60_sign_idx_pyjhora": 11,
"matches_pyjhora": true
},
{
"ascendant_longitude": 171.3938,
"case_id": "venus_williams_1980_aa_v5_holdout",
"d60_sign_idx_production": 11,
"d60_sign_idx_pyjhora": 11,
"matches_pyjhora": true
},
{
"ascendant_longitude": 90.7335,
"case_id": "vincent_van_gogh_1853_aa_v5_holdout",
"d60_sign_idx_production": 4,
"d60_sign_idx_pyjhora": 4,
"matches_pyjhora": true
},
{
"ascendant_longitude": 316.5233,
"case_id": "whitney_houston_1963_aa_v5_holdout",
"d60_sign_idx_production": 7,
"d60_sign_idx_pyjhora": 7,
"matches_pyjhora": true
},
{
"ascendant_longitude": 36.9097,
"case_id": "zinedine_zidane_1972_aa_v5_holdout",
"d60_sign_idx_production": 2,
"d60_sign_idx_pyjhora": 2,
"matches_pyjhora": true
}
],
"dataset": {
"cases": 77,
"path": "references/real_case_calibration/minute_rectification_holdout_v5.json",
"sha256": "ab365a3e3f4953d4b538f2c0889dc98ab89444a28340c3a7b29e2a864cdd687a"
},
"gate": {
"matches": 77,
"passed": true,
"rate": 1.0,
"threshold": 0.95
},
"issue": 149,
"profile": {
"ayanamsa": "raman",
"node_mode": "mean",
"pyjhora_ayanamsa_mode": "Raman",
"pyjhora_chart": "divisional_chart(divisional_chart_factor=60), traditional Parasara from sign"
},
"scope": "d60_gate_g1_engine_reconciliation",
"task": "docs/tasks/TASK-rectification-d60-two-way-20261028.md"
}
@@ -0,0 +1,118 @@
{
"record_version": "reported-offset-native-candidate-date-v3",
"frozen_at_utc": "2026-10-29T06:08:16.682046+00:00",
"ayanamsa": "raman",
"node_mode": "mean",
"radii_minutes": [
15,
30,
60
],
"offsets_minutes": [
-30,
-20,
-15,
-10,
-8,
-5,
-3,
0,
3,
5,
8,
10,
15,
20,
30
],
"minute_step": 1,
"dataset": "references/real_case_calibration/minute_rectification_holdout_v3.json",
"dataset_sha256": "45aa76ab79dfc6c6404b6252083e1aa5c7e2e2b7de811fc11042a8ad2da3f0ea",
"dataset_benchmark_id": "minute_rectification_fact_ranker_v4_holdout_v3",
"implementation_sha256": "4bb731f7b5043de0b967ccd7e852ae25a1ecdce96c2b7987c142d7878b6632b2",
"implementation_sha256_prefix": "4bb731f7b5043de0",
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
"production_scoring_files": [
"scripts/active_rectification_event_engine.py",
"scripts/active_rectification_events.py",
"scripts/ashtakavarga.py",
"scripts/dasha_analyzer.py",
"scripts/divisional_charts_extended.py",
"scripts/domain_calculation_service.py",
"scripts/functional_benefics.py",
"scripts/jaimini.py",
"scripts/minute_rectification_fact_ranker_v4.py",
"scripts/minute_rectification_feature_facts_v4.py",
"scripts/narayana_dasha.py",
"scripts/rectification/api_service.py",
"scripts/rectification/candidate_contrast.py",
"scripts/rectification/candidate_window.py",
"scripts/rectification/case_holdout.py",
"scripts/rectification/contracts.py",
"scripts/rectification/dasha_transition_proximity.py",
"scripts/rectification/decision_policy.py",
"scripts/rectification/event_probes.py",
"scripts/rectification/refinement_packet.py",
"scripts/rectification/scoring_service.py",
"scripts/shadbala.py",
"scripts/varga.py"
],
"production_scoring_sha256": "fcf10cb3a5742bb7e2d98d15d69638769cd830f470373ea93745a1cab3718c9b",
"research_files": [
"scripts/research/reported_offset_sweep.py",
"scripts/research/cluster_width_lib.py",
"scripts/research/probe_supply_after_six.py",
"scripts/research/sealed_holdout_rerun.py",
"scripts/minute_rectification_blind_eval.py",
"scripts/minute_rectification_fact_blind_eval_v4.py",
"scripts/minute_rectification_holdout_validator.py"
],
"research_implementation_sha256": "4eb2c03b09a179dd81f912d735823dd09ec8506da2538f40d3a8e04d3ebc6c67",
"file_sha256": {
"scripts/active_rectification_event_engine.py": "96c537d221a84680ddaaba74e3335162c44b5bbd9a60d10e69550a2095910d98",
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
"scripts/ashtakavarga.py": "c524da3f54b2ed9c080b78b33854854a0ca3d5d79b7e536bb1c3bc2be3e02852",
"scripts/dasha_analyzer.py": "3949b96813217fe624899856afec9f0b787c4cb0fea3a9a0d961990dbd11943a",
"scripts/divisional_charts_extended.py": "e9820e80f14fddc86ab5495d11455d16c2d3c9502a9a242fcf9efc41186e0d11",
"scripts/domain_calculation_service.py": "66923a2bc69daf65c965d2973c4b9234edbec5147909eaf3609b6b377ce3c7ca",
"scripts/functional_benefics.py": "cbaac3b8c09b97f8724b5300e9a402cbf77089af6c7db8788550d40fd35ac57b",
"scripts/jaimini.py": "6b88658da5404da9b136686d92a04be462d61a39da6e8de4255021e2ed2d1173",
"scripts/minute_rectification_blind_eval.py": "07aa30d8bad3278669495d5fea8be937aaf6367c8af980ff4f2fe9aa84ccc6ff",
"scripts/minute_rectification_fact_blind_eval_v4.py": "bdf460e3467208e8b87345c5beb2128f3e22de7eeffd68f72b281b3ad9affc92",
"scripts/minute_rectification_fact_ranker_v4.py": "f1a0d8d2482cd754d2e7f253a9606b0373519435a2bf58cfc3753e2b9ae0fb76",
"scripts/minute_rectification_feature_facts_v4.py": "3d899a2cdd4825b8e32062443d487edcd2173a4ea55a36eb9f3abe587c0faf0f",
"scripts/minute_rectification_holdout_validator.py": "b60b1c752e58672beaee8b36eb3b2348169726cda070ec969db0f13e7ed715af",
"scripts/narayana_dasha.py": "bc667c30c9562fb73fb0b7b4c22a5e377f9a531795141fc629b2cd3cf396773a",
"scripts/rectification/api_service.py": "089730097d3872a4f7b5d7dd5574bb7e9ab4d2e246d4a380800bc824d7979b95",
"scripts/rectification/candidate_contrast.py": "eee7da71c0574a08876404b78ca111153fa95fb83ace82b9fdca141d1992e273",
"scripts/rectification/candidate_window.py": "2fbc5058b12049b15fca375cdc125b8283e19f9f3e4bedcc291e344501891bef",
"scripts/rectification/case_holdout.py": "fe0e699b617d9e216acdfeff87af4221c1d6f4c101bf33e1dbf14e2bcd75a8b5",
"scripts/rectification/contracts.py": "c6dc6bd230e38f9f2126c224aae9ddbd6415304c15340f8c7cd3f06f6ef3160f",
"scripts/rectification/dasha_transition_proximity.py": "5ce4ed27b0f06c681abc34e5fd998fafb10c153a0070aa36c99ddfa869a2cbf2",
"scripts/rectification/decision_policy.py": "80e8de4680d19a052213bb821d2a9c94143a2962235aeb27f6ad81374d2e60d5",
"scripts/rectification/event_probes.py": "f5ca9d54501f67a1546fcf5b01da0c1277dec2e2c6df481884e8900d14909a7c",
"scripts/rectification/refinement_packet.py": "dbeea5aa780889785ce850f3881e8b7f67bb44594e9bc382c65b2e730884a2f4",
"scripts/rectification/scoring_service.py": "fa056fa30d9e6ffa4b75295fc49c793e35b26ebeca64ca843d26c8abef3050f2",
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
"scripts/research/reported_offset_sweep.py": "cabc96d1f8c7ed06ef34da4e02e052f598a5e62fd71a7ccbe7b0b099247c27d0",
"scripts/research/sealed_holdout_rerun.py": "69a7ddddfc4a88ec5c85f400c763f8cdbb3c58c00fe9e788a72f79daba1d3bc1",
"scripts/shadbala.py": "334dc9d8e4292f0c95d40fd4c29285aa89b9e49d4f187fb9498f4bb0ad93bdfc",
"scripts/varga.py": "1bca389e4f36d293a755de175163c3f39b42bab5831cb6f7828830899f9f177e"
},
"hash_scope": "explicit_identity_file_sets_not_a_transitive_dependency_lock",
"scorer": "native_event_contribution_matrix_not_shadow_fact_ranker",
"delivery": "initial_signature_clusters_peak_gap_lt_8_envelope_no_answers_no_elimination",
"rank": "score_desc_then_sha256(benchmark_id:case_id:candidate_time)",
"grid": "every_minute_inclusive_not_production_two_minute_sampling",
"cross_midnight": "date_aware_candidates_distance_and_native_single_matrix",
"evaluator_sha256": "cabc96d1f8c7ed06ef34da4e02e052f598a5e62fd71a7ccbe7b0b099247c27d0",
"replay_revision": "native_candidate_date_v3",
"supersedes": "candidate_date_grouped_v2_identity_and_path_not_assumed_numerically_wrong",
"is_blind_evaluation": false,
"truth_hidden_from_ranker": true,
"official_valid_independent_blind": false,
"official_blind_trial_count": 0,
"results_previously_seen": true,
"must_not_use_for_tuning": true
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,116 @@
{
"record_version": "exposed-v3-fixed-protocol-cross-midnight-rerun-v2",
"extended_identity": {
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
"production_scoring_files": [
"scripts/active_rectification_event_engine.py",
"scripts/active_rectification_events.py",
"scripts/ashtakavarga.py",
"scripts/dasha_analyzer.py",
"scripts/divisional_charts_extended.py",
"scripts/domain_calculation_service.py",
"scripts/functional_benefics.py",
"scripts/jaimini.py",
"scripts/minute_rectification_fact_ranker_v4.py",
"scripts/minute_rectification_feature_facts_v4.py",
"scripts/narayana_dasha.py",
"scripts/rectification/api_service.py",
"scripts/rectification/candidate_contrast.py",
"scripts/rectification/candidate_window.py",
"scripts/rectification/case_holdout.py",
"scripts/rectification/contracts.py",
"scripts/rectification/dasha_transition_proximity.py",
"scripts/rectification/decision_policy.py",
"scripts/rectification/event_probes.py",
"scripts/rectification/refinement_packet.py",
"scripts/rectification/scoring_service.py",
"scripts/shadbala.py",
"scripts/varga.py"
],
"production_scoring_sha256": "fcf10cb3a5742bb7e2d98d15d69638769cd830f470373ea93745a1cab3718c9b",
"research_files": [
"scripts/research/reported_offset_sweep.py",
"scripts/research/cluster_width_lib.py",
"scripts/research/probe_supply_after_six.py",
"scripts/research/sealed_holdout_rerun.py",
"scripts/minute_rectification_blind_eval.py",
"scripts/minute_rectification_fact_blind_eval_v4.py",
"scripts/minute_rectification_holdout_validator.py"
],
"research_implementation_sha256": "4eb2c03b09a179dd81f912d735823dd09ec8506da2538f40d3a8e04d3ebc6c67",
"file_sha256": {
"scripts/active_rectification_event_engine.py": "96c537d221a84680ddaaba74e3335162c44b5bbd9a60d10e69550a2095910d98",
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
"scripts/ashtakavarga.py": "c524da3f54b2ed9c080b78b33854854a0ca3d5d79b7e536bb1c3bc2be3e02852",
"scripts/dasha_analyzer.py": "3949b96813217fe624899856afec9f0b787c4cb0fea3a9a0d961990dbd11943a",
"scripts/divisional_charts_extended.py": "e9820e80f14fddc86ab5495d11455d16c2d3c9502a9a242fcf9efc41186e0d11",
"scripts/domain_calculation_service.py": "66923a2bc69daf65c965d2973c4b9234edbec5147909eaf3609b6b377ce3c7ca",
"scripts/functional_benefics.py": "cbaac3b8c09b97f8724b5300e9a402cbf77089af6c7db8788550d40fd35ac57b",
"scripts/jaimini.py": "6b88658da5404da9b136686d92a04be462d61a39da6e8de4255021e2ed2d1173",
"scripts/minute_rectification_blind_eval.py": "07aa30d8bad3278669495d5fea8be937aaf6367c8af980ff4f2fe9aa84ccc6ff",
"scripts/minute_rectification_fact_blind_eval_v4.py": "bdf460e3467208e8b87345c5beb2128f3e22de7eeffd68f72b281b3ad9affc92",
"scripts/minute_rectification_fact_ranker_v4.py": "f1a0d8d2482cd754d2e7f253a9606b0373519435a2bf58cfc3753e2b9ae0fb76",
"scripts/minute_rectification_feature_facts_v4.py": "3d899a2cdd4825b8e32062443d487edcd2173a4ea55a36eb9f3abe587c0faf0f",
"scripts/minute_rectification_holdout_validator.py": "b60b1c752e58672beaee8b36eb3b2348169726cda070ec969db0f13e7ed715af",
"scripts/narayana_dasha.py": "bc667c30c9562fb73fb0b7b4c22a5e377f9a531795141fc629b2cd3cf396773a",
"scripts/rectification/api_service.py": "089730097d3872a4f7b5d7dd5574bb7e9ab4d2e246d4a380800bc824d7979b95",
"scripts/rectification/candidate_contrast.py": "eee7da71c0574a08876404b78ca111153fa95fb83ace82b9fdca141d1992e273",
"scripts/rectification/candidate_window.py": "2fbc5058b12049b15fca375cdc125b8283e19f9f3e4bedcc291e344501891bef",
"scripts/rectification/case_holdout.py": "fe0e699b617d9e216acdfeff87af4221c1d6f4c101bf33e1dbf14e2bcd75a8b5",
"scripts/rectification/contracts.py": "c6dc6bd230e38f9f2126c224aae9ddbd6415304c15340f8c7cd3f06f6ef3160f",
"scripts/rectification/dasha_transition_proximity.py": "5ce4ed27b0f06c681abc34e5fd998fafb10c153a0070aa36c99ddfa869a2cbf2",
"scripts/rectification/decision_policy.py": "80e8de4680d19a052213bb821d2a9c94143a2962235aeb27f6ad81374d2e60d5",
"scripts/rectification/event_probes.py": "f5ca9d54501f67a1546fcf5b01da0c1277dec2e2c6df481884e8900d14909a7c",
"scripts/rectification/refinement_packet.py": "dbeea5aa780889785ce850f3881e8b7f67bb44594e9bc382c65b2e730884a2f4",
"scripts/rectification/scoring_service.py": "fa056fa30d9e6ffa4b75295fc49c793e35b26ebeca64ca843d26c8abef3050f2",
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
"scripts/research/reported_offset_sweep.py": "cabc96d1f8c7ed06ef34da4e02e052f598a5e62fd71a7ccbe7b0b099247c27d0",
"scripts/research/sealed_holdout_rerun.py": "69a7ddddfc4a88ec5c85f400c763f8cdbb3c58c00fe9e788a72f79daba1d3bc1",
"scripts/shadbala.py": "334dc9d8e4292f0c95d40fd4c29285aa89b9e49d4f187fb9498f4bb0ad93bdfc",
"scripts/varga.py": "1bca389e4f36d293a755de175163c3f39b42bab5831cb6f7828830899f9f177e"
},
"hash_scope": "explicit_identity_file_sets_not_a_transitive_dependency_lock"
},
"production_identity_scope": "context_only_shadow_scorer_does_not_call_transition_proximity",
"frozen_at_utc": "2026-10-29T06:07:58.433310+00:00",
"dataset_path": "references/real_case_calibration/minute_rectification_holdout_v3.json",
"dataset_sha256": "45aa76ab79dfc6c6404b6252083e1aa5c7e2e2b7de811fc11042a8ad2da3f0ea",
"algorithm_version": "birth-time-event-fact-ranker-v4-shadow",
"implementation_sha256": "4bb731f7b5043de0b967ccd7e852ae25a1ecdce96c2b7987c142d7878b6632b2",
"files": [
"scripts/active_rectification_event_engine.py",
"scripts/active_rectification_events.py",
"scripts/ashtakavarga.py",
"scripts/dasha_analyzer.py",
"scripts/divisional_charts_extended.py",
"scripts/domain_calculation_service.py",
"scripts/jaimini.py",
"scripts/minute_rectification_fact_ranker_v4.py",
"scripts/minute_rectification_feature_facts_v4.py",
"scripts/narayana_dasha.py",
"scripts/shadbala.py",
"scripts/varga.py"
],
"historical_frozen_sha256": "f41c298dd6cdcebe7a93e632f7191954be7987f6012ca2a34cecb6e447fbf196",
"evaluator_sha256": "69a7ddddfc4a88ec5c85f400c763f8cdbb3c58c00fe9e788a72f79daba1d3bc1",
"ayanamsa": "raman",
"node_mode": "mean",
"candidate_radius_minutes": [
10
],
"minute_step": 1,
"release_metrics": {
"top_1_rate_minimum": 0.6,
"top_3_rate_minimum": 0.85,
"mean_absolute_minute_error_maximum": 2.0,
"false_confirmation_rate_maximum": 0.05,
"correct_insufficient_evidence_rejection_rate_minimum": 0.9
},
"results_previously_seen": true,
"official_valid_independent_blind": false,
"must_not_use_for_tuning": true,
"tie_breaker": "sha256(benchmark_id:case_id:candidate_time); published minute is never passed to the ranker",
"metric_rank_definition": "competition_rank_1_plus_strictly_higher_scores_legacy_protocol",
"extra_metric_rank_definition": "score_desc_then_existing_opaque_sha256_total_order"
}
File diff suppressed because it is too large Load Diff
@@ -57,3 +57,22 @@ G2–G5、模型端到端对比、MEVG、报告:全部 `not_started`(G1 不
- `jyotishganit` 未安装;G1 的外部引擎只剩 PyJHora(门要求「与至少一个外部引擎一致 ≥95%」,仍可判)。
- 预检的 `focused_tests` 有一条与本单无关的失败(上面已列)。
## 第 1 次修正:D60 映射(2026-10-29)
按修复单 `docs/tasks/TASK-rectification-d60-fix-20261029.md` 与产品选择 1 执行。
| 步 | 做了什么 | 结果 |
| --- | --- | --- |
| T0 | 合并最新 `origin/staging`(`68670b281`) | 只有 `docs/BUG_HISTORY.md` 冲突;按编号合并,保留 staging 的 BUG-1496 / 1498 / 1499 与本分支的 BUG-1497 / 1500 |
| T1 | `scripts/varga.py` 的 D60 改为 `(si+pi)%12`(奇偶同规则),加来源注释 | 新增 `tests/test_d60_varga_mapping.py`:12 星座 × 60 段逐段对 PyJHora、偶数星座第 1 段在本星座,8 项全过 |
| T3 | 查锁 D60 旧值的测试 | `tests/test_varga_bphs.py`、`test_upstream_sync9b_varga_bphs.py`、`test_deep_varga_avastha.py`、`test_divisional_charts_extended.py`、`test_cli_smoke.py` 均通过,没有写死旧 D60 星座的断言可改 |
| T2 | 密封 20 + 报时 900 与 `upstream_sync9b_2026_10_28` 记录逐条比 | 20/20、900/900,8 字段与全字段不一致 0,`metrics` / `summary` 相同 → 按 ERR-110 重新冻结为 `d60_mapping_2026_10_29` |
| T4 | 提交 G1 脚本并重跑 | `scripts/research/d60_two_way_run.py` 77/77,门通过;结果 `docs/research/d60_two_way_results_2026_10_29.json`(无时间戳、排序输出,可逐字节复跑) |
| T6 | 记录 | BUG-1500 → resolved,BUG-1497 更新;CHANGELOG 一条;本文件 |
跑过的测试:`tests/test_cli_smoke.py` 35 passed;分盘相关 96 passed、1 failed(`tests/test_d1_d60_varga_mapping_registry.py` 调 `python3`,本机只有 `python`,环境缺口,与本次改动无关);`tests/test_d60_varga_mapping.py` 8 passed;`tests/test_d60_two_way_research.py` 1 passed。
本轮没有跑:Python 快速门(留给验收)、前端(未改产品代码,但合同指针挪了,`rectification-confirmation-gate.test.ts` 的路径按前几轮先例改了)。
下一步(T5):按任务书 §3.3 的口径先写先登记 JSON(G2–G5 规则、阈值、种子),commit 之后再在 v5 上跑计分。
+1 -1
View File
@@ -37,7 +37,7 @@
| 任务书 | 进度 | 主题 | 状态 | 落点 |
| --- | --- | --- | --- | --- |
| `TASK-rectification-d60-two-way-20261028.md` | `PROGRESS-rectification-d60-two-way-20261028.md`(执行方写) | **D60 换格要不要进生时校正:双向对比(issue #149)**:纳迪 / D150 已在 BUG-1240 证伪,本单只测 D60。A 组生产 V9、B 组加 D60 换格判据,同一批 v5 77 例看「有没有帮助」和「有没有伤害」;先登记再跑,G1 三引擎对账、G2 找回记录分钟、G3 不伤真值、G4 安慰剂、G5 换岁差噪声地板;另做 20 例模型参与的端到端对话对比(报告项)。离线研究、生产零改动。预留 BUG-1497 | 待领取 | 本地 Grok 执行 |
| `TASK-rectification-d60-two-way-20261028.md` | `PROGRESS-rectification-d60-two-way-20261028.md`(执行方写) | **D60 换格要不要进生时校正:双向对比(issue #149)**:纳迪 / D150 已在 BUG-1240 证伪,本单只测 D60。A 组生产 V9、B 组加 D60 换格判据,同一批 v5 77 例看「有没有帮助」和「有没有伤害」;先登记再跑,G1 三引擎对账、G2 找回记录分钟、G3 不伤真值、G4 安慰剂、G5 换岁差噪声地板;另做 20 例模型参与的端到端对话对比(报告项)。离线研究、生产零改动。预留 BUG-1497 | 进行中:G1 首次 33/77 → 修 D60 映射(BUG-1500)后 77/77 通过;G2–G5 等先登记后再跑 | 本地 Grok 执行 |
| `TASK-rectification-explicit-open-20261023.md` | `PROGRESS-rectification-explicit-open-20261023.md` | **明说要校正只回一句话(issue #103)**:找会话直接读一张对服务角色撤权的表、必然失败被吞(真正进行中的也续不上);`candidate_accepted` 被算作进行中挡住入口和提议卡;兜底只给一句话。产品选 C;只改入口口径、经 RPC 找会话、删兜底,不改共享状态集合、不动表。BUG-1423 | 已合入 staging | 分支 `codex/rectification-explicit-open-20261023` |
| `TASK-chart-table-span-20261023.md` | `PROGRESS-chart-table-span-20261023.md` | **星盘页本命 / 月亮行星表挤进左栏(issue #102)**:#87 给表包了 `ChartSymbolHelp` 后跨栏规则失配;根因修法是 `VedicLayout` 用固定整行容器承载表格,跨栏只认容器;加结构断言防复发。BUG-1422 | 已合入 staging | 分支 `codex/chart-table-span-20261023` |
| `TASK-ui-kit-migration-20261023.md` | `PROGRESS-ui-kit-0-base-20261023.md`;`PROGRESS-ui-kit-1-shell-20261023.md`;`PROGRESS-ui-kit-2-chat-20261023.md`;`PROGRESS-ui-kit-3-chart-20261023.md`;`PROGRESS-ui-kit-4-people-20261023.md`;`PROGRESS-ui-kit-5-pages-20261023.md`;`PROGRESS-ui-kit-6-rectification-20261023.md`;`PROGRESS-ui-kit-7-cleanup-20261023.md` | **界面统一换成组件库**:shadcn base-nova(补 `shadcn/tailwind.css`)· Lucide · Motion · react-resizable-panels · dnd-kit · Zustand;lint 拦手写控件(白名单只减不增);对话旁星盘面板;会话、档案拖动排序(动表);长相不变。产品 2026-10-23 拍板 D1~D8;8 个 issue(K0~K7)串行,取代全站动效 #98 #100 #101 | K0–K7 已在测试环境,待验收 | 原型 https://claude.ai/artifact/PGnWsjHhu38KJseEfEMNWG |
@@ -114,8 +114,11 @@ const diagnosticReport = JSON.parse(readFileSync(
// 原值(11):docs/research/sealed_holdout_rerun_upstream_sync8_2026_10_18.json
// 新值(11):docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.json
// 原因(11):sync9b(BUG-1494~1495)改了冻结身份里的 scripts/varga.py,输出不变,ERR-110 另存新记录。确认门行为与阈值不变。
// 原值(12):docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.json
// 新值(12):docs/research/sealed_holdout_rerun_d60_mapping_2026_10_29.json
// 原因(12):BUG-1500 修正生产 D60 映射(scripts/varga.py),输出不变,ERR-110 另存新记录。确认门行为与阈值不变。
const currentTreeRerun = JSON.parse(readFileSync(
new URL("../../docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.json", import.meta.url),
new URL("../../docs/research/sealed_holdout_rerun_d60_mapping_2026_10_29.json", import.meta.url),
"utf8",
)) as {
frozen_record: { implementation_sha256: string };
@@ -264,9 +267,10 @@ test("sealed holdout aggregates match the v3 report and still block confirmation
// 原值(8):…ephemeris_nutation_2026_10_08.json / 新值(8):…scoring_perf_2026_10_13.json / 原因(8):BUG-1323~1325 改了冻结身份文件,输出不变,ERR-110 另存新记录。
// 原值(9):…scoring_perf_2026_10_13.json / 新值(9):…upstream_sync8_2026_10_18.json / 原因(9):sync8 改了冻结身份文件,输出不变,ERR-110 另存新记录。
// 原值(10):…upstream_sync8_2026_10_18.json / 新值(10):…upstream_sync9b_2026_10_28.json / 原因(10):sync9b 改了冻结身份里的 varga.py,输出不变,ERR-110 另存新记录。
// 原值(11):…upstream_sync9b_2026_10_28.json / 新值(11):…d60_mapping_2026_10_29.json / 原因(11):BUG-1500 修正 D60 映射,输出不变,ERR-110 另存新记录。
assert.equal(
productHoldout.current_tree_scorer.source_report,
"docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.json",
"docs/research/sealed_holdout_rerun_d60_mapping_2026_10_29.json",
);
assert.equal(currentTreeRerun.official_valid_independent_blind, false);
assert.equal(productHoldout.current_tree_scorer.matches_metrics_scorer, false);
+130 -130
View File
@@ -9,7 +9,7 @@
"dataset_path": "references/real_case_calibration/minute_rectification_holdout_v3.json",
"report_path": "references/real_case_calibration/minute_rectification_holdout_v3_report.json",
"source_audit_status": "corrected_known_date_errors",
"evaluated_on": "2026-10-28",
"evaluated_on": "2026-10-29",
"evaluated_on_scope": "latest_fixed_protocol_rerun_not_historical_runtime_metrics",
"historical_source_audit_status": "invalidated_after_replay",
"report_status": "invalidated_after_source_audit",
@@ -24,7 +24,7 @@
"evaluated_on": "2026-07-21"
},
"current_tree_scorer": {
"implementation_sha256": "b44505aa0034e486fcfc29c8611a9559333a97c1005f92e6a5356bd855122205",
"implementation_sha256": "4bb731f7b5043de0b967ccd7e852ae25a1ecdce96c2b7987c142d7878b6632b2",
"extended_identity": {
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
"production_scoring_files": [
@@ -52,7 +52,7 @@
"scripts/shadbala.py",
"scripts/varga.py"
],
"production_scoring_sha256": "7a727418651321d1b9073588587050c4dc6292587748cf35734dd76cefb0effe",
"production_scoring_sha256": "fcf10cb3a5742bb7e2d98d15d69638769cd830f470373ea93745a1cab3718c9b",
"research_files": [
"scripts/research/reported_offset_sweep.py",
"scripts/research/cluster_width_lib.py",
@@ -62,7 +62,7 @@
"scripts/minute_rectification_fact_blind_eval_v4.py",
"scripts/minute_rectification_holdout_validator.py"
],
"research_implementation_sha256": "6fa0b0c335ac0cdc25ee887d432ae2f1f6487c665aed9665ad5cc0bc6ef0283b",
"research_implementation_sha256": "4eb2c03b09a179dd81f912d735823dd09ec8506da2538f40d3a8e04d3ebc6c67",
"file_sha256": {
"scripts/active_rectification_event_engine.py": "96c537d221a84680ddaaba74e3335162c44b5bbd9a60d10e69550a2095910d98",
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
@@ -90,17 +90,17 @@
"scripts/rectification/scoring_service.py": "fa056fa30d9e6ffa4b75295fc49c793e35b26ebeca64ca843d26c8abef3050f2",
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
"scripts/research/reported_offset_sweep.py": "8ecc381dfaa3c0e6bea058cfa44c606aabdb1086c137f16da82ee5a3bf5ccc91",
"scripts/research/sealed_holdout_rerun.py": "ebcdae760f2b76c81d5d0c8e2bf347cff4c81cca9074f27ae94b6734408ccd42",
"scripts/research/reported_offset_sweep.py": "cabc96d1f8c7ed06ef34da4e02e052f598a5e62fd71a7ccbe7b0b099247c27d0",
"scripts/research/sealed_holdout_rerun.py": "69a7ddddfc4a88ec5c85f400c763f8cdbb3c58c00fe9e788a72f79daba1d3bc1",
"scripts/shadbala.py": "334dc9d8e4292f0c95d40fd4c29285aa89b9e49d4f187fb9498f4bb0ad93bdfc",
"scripts/varga.py": "8ff96b9fc8346ca249abff6109434b6ed57fa150e1a9854d4f73bdf317568368"
"scripts/varga.py": "1bca389e4f36d293a755de175163c3f39b42bab5831cb6f7828830899f9f177e"
},
"hash_scope": "explicit_identity_file_sets_not_a_transitive_dependency_lock"
},
"matches_metrics_scorer": false,
"official_eval_implementation_hash_matches": false,
"official_eval_trial_count": 0,
"source_report": "docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.json",
"source_report": "docs/research/sealed_holdout_rerun_d60_mapping_2026_10_29.json",
"fixed_protocol_rerun_trial_count": 20,
"fixed_protocol_rerun_hash_matches": true,
"metrics": {
@@ -113,6 +113,106 @@
}
},
"current_tree_fixed_protocol_rerun": {
"evaluated_on": "2026-10-29",
"report_path": "docs/research/sealed_holdout_rerun_d60_mapping_2026_10_29.json",
"freeze_record_path": "docs/research/sealed_holdout_rerun_d60_mapping_2026_10_29.freeze.json",
"implementation_sha256": "4bb731f7b5043de0b967ccd7e852ae25a1ecdce96c2b7987c142d7878b6632b2",
"extended_identity": {
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
"production_scoring_files": [
"scripts/active_rectification_event_engine.py",
"scripts/active_rectification_events.py",
"scripts/ashtakavarga.py",
"scripts/dasha_analyzer.py",
"scripts/divisional_charts_extended.py",
"scripts/domain_calculation_service.py",
"scripts/functional_benefics.py",
"scripts/jaimini.py",
"scripts/minute_rectification_fact_ranker_v4.py",
"scripts/minute_rectification_feature_facts_v4.py",
"scripts/narayana_dasha.py",
"scripts/rectification/api_service.py",
"scripts/rectification/candidate_contrast.py",
"scripts/rectification/candidate_window.py",
"scripts/rectification/case_holdout.py",
"scripts/rectification/contracts.py",
"scripts/rectification/dasha_transition_proximity.py",
"scripts/rectification/decision_policy.py",
"scripts/rectification/event_probes.py",
"scripts/rectification/refinement_packet.py",
"scripts/rectification/scoring_service.py",
"scripts/shadbala.py",
"scripts/varga.py"
],
"production_scoring_sha256": "fcf10cb3a5742bb7e2d98d15d69638769cd830f470373ea93745a1cab3718c9b",
"research_files": [
"scripts/research/reported_offset_sweep.py",
"scripts/research/cluster_width_lib.py",
"scripts/research/probe_supply_after_six.py",
"scripts/research/sealed_holdout_rerun.py",
"scripts/minute_rectification_blind_eval.py",
"scripts/minute_rectification_fact_blind_eval_v4.py",
"scripts/minute_rectification_holdout_validator.py"
],
"research_implementation_sha256": "4eb2c03b09a179dd81f912d735823dd09ec8506da2538f40d3a8e04d3ebc6c67",
"file_sha256": {
"scripts/active_rectification_event_engine.py": "96c537d221a84680ddaaba74e3335162c44b5bbd9a60d10e69550a2095910d98",
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
"scripts/ashtakavarga.py": "c524da3f54b2ed9c080b78b33854854a0ca3d5d79b7e536bb1c3bc2be3e02852",
"scripts/dasha_analyzer.py": "3949b96813217fe624899856afec9f0b787c4cb0fea3a9a0d961990dbd11943a",
"scripts/divisional_charts_extended.py": "e9820e80f14fddc86ab5495d11455d16c2d3c9502a9a242fcf9efc41186e0d11",
"scripts/domain_calculation_service.py": "66923a2bc69daf65c965d2973c4b9234edbec5147909eaf3609b6b377ce3c7ca",
"scripts/functional_benefics.py": "cbaac3b8c09b97f8724b5300e9a402cbf77089af6c7db8788550d40fd35ac57b",
"scripts/jaimini.py": "6b88658da5404da9b136686d92a04be462d61a39da6e8de4255021e2ed2d1173",
"scripts/minute_rectification_blind_eval.py": "07aa30d8bad3278669495d5fea8be937aaf6367c8af980ff4f2fe9aa84ccc6ff",
"scripts/minute_rectification_fact_blind_eval_v4.py": "bdf460e3467208e8b87345c5beb2128f3e22de7eeffd68f72b281b3ad9affc92",
"scripts/minute_rectification_fact_ranker_v4.py": "f1a0d8d2482cd754d2e7f253a9606b0373519435a2bf58cfc3753e2b9ae0fb76",
"scripts/minute_rectification_feature_facts_v4.py": "3d899a2cdd4825b8e32062443d487edcd2173a4ea55a36eb9f3abe587c0faf0f",
"scripts/minute_rectification_holdout_validator.py": "b60b1c752e58672beaee8b36eb3b2348169726cda070ec969db0f13e7ed715af",
"scripts/narayana_dasha.py": "bc667c30c9562fb73fb0b7b4c22a5e377f9a531795141fc629b2cd3cf396773a",
"scripts/rectification/api_service.py": "089730097d3872a4f7b5d7dd5574bb7e9ab4d2e246d4a380800bc824d7979b95",
"scripts/rectification/candidate_contrast.py": "eee7da71c0574a08876404b78ca111153fa95fb83ace82b9fdca141d1992e273",
"scripts/rectification/candidate_window.py": "2fbc5058b12049b15fca375cdc125b8283e19f9f3e4bedcc291e344501891bef",
"scripts/rectification/case_holdout.py": "fe0e699b617d9e216acdfeff87af4221c1d6f4c101bf33e1dbf14e2bcd75a8b5",
"scripts/rectification/contracts.py": "c6dc6bd230e38f9f2126c224aae9ddbd6415304c15340f8c7cd3f06f6ef3160f",
"scripts/rectification/dasha_transition_proximity.py": "5ce4ed27b0f06c681abc34e5fd998fafb10c153a0070aa36c99ddfa869a2cbf2",
"scripts/rectification/decision_policy.py": "80e8de4680d19a052213bb821d2a9c94143a2962235aeb27f6ad81374d2e60d5",
"scripts/rectification/event_probes.py": "f5ca9d54501f67a1546fcf5b01da0c1277dec2e2c6df481884e8900d14909a7c",
"scripts/rectification/refinement_packet.py": "dbeea5aa780889785ce850f3881e8b7f67bb44594e9bc382c65b2e730884a2f4",
"scripts/rectification/scoring_service.py": "fa056fa30d9e6ffa4b75295fc49c793e35b26ebeca64ca843d26c8abef3050f2",
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
"scripts/research/reported_offset_sweep.py": "cabc96d1f8c7ed06ef34da4e02e052f598a5e62fd71a7ccbe7b0b099247c27d0",
"scripts/research/sealed_holdout_rerun.py": "69a7ddddfc4a88ec5c85f400c763f8cdbb3c58c00fe9e788a72f79daba1d3bc1",
"scripts/shadbala.py": "334dc9d8e4292f0c95d40fd4c29285aa89b9e49d4f187fb9498f4bb0ad93bdfc",
"scripts/varga.py": "1bca389e4f36d293a755de175163c3f39b42bab5831cb6f7828830899f9f177e"
},
"hash_scope": "explicit_identity_file_sets_not_a_transitive_dependency_lock"
},
"scorer_frozen_before_rerun": true,
"source_audit_status": "corrected_known_date_errors",
"trial_count": 20,
"official_valid_independent_blind": false,
"is_blind_evaluation": false,
"truth_hidden_from_ranker": true,
"results_previously_seen": true,
"must_not_claim_as_release_metrics": true,
"must_not_use_for_tuning": true,
"verified_minute_claim_allowed": false,
"metric_gates_passed": false,
"events_per_case": 3,
"boundary": "Previously exposed v3 shadow fixed-protocol rerun after the D60 mapping fix (ERR-110, BUG-1500). Trials and metrics match the 2026-10-18 upstream sync8 and the upstream_sync9b reports. Versus the 2026-09-20 historical report, changed_trial_count stays 8. Not a release metric. Prior reports and freezes preserved byte-for-byte.",
"report_sha256": "9e667c4e5819674e82519bfe9415d49a202515c765ea99609a9dd27feb69c77d",
"freeze_record_sha256": "8f300876eca9aac683879f1b26204be885c03b2c7b6d03e5930386852cbe4700",
"replay_started_at_utc": "2026-10-29T06:07:59.312582+00:00",
"replay_finished_at_utc": "2026-10-29T06:08:15.756678+00:00",
"previous_fixed_protocol_rerun": {
"report_path": "docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.json",
"freeze_record_path": "docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.freeze.json",
"superseded_reason": "The D60 mapping fix (BUG-1500) changed scripts/varga.py, which is part of the extended identity. Output is unchanged, so ERR-110 stored a new record. Prior upstream_sync9b report and freeze preserved byte-for-byte."
}
},
"previous_fixed_protocol_rerun": {
"evaluated_on": "2026-10-28",
"report_path": "docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.json",
"freeze_record_path": "docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.freeze.json",
@@ -212,106 +312,6 @@
"superseded_reason": "Upstream sync9b (BUG-1494 to BUG-1495) changed scripts/varga.py, which is part of the extended identity. Output is unchanged, so ERR-110 stored a new record. Prior sync8 report and freeze preserved byte-for-byte."
}
},
"previous_fixed_protocol_rerun": {
"evaluated_on": "2026-10-18",
"report_path": "docs/research/sealed_holdout_rerun_upstream_sync8_2026_10_18.json",
"freeze_record_path": "docs/research/sealed_holdout_rerun_upstream_sync8_2026_10_18.freeze.json",
"implementation_sha256": "bf8981b5c41702f9b333444deee2ab7378b9e98b111240e85ea62e6aae02fda8",
"extended_identity": {
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
"production_scoring_files": [
"scripts/active_rectification_event_engine.py",
"scripts/active_rectification_events.py",
"scripts/ashtakavarga.py",
"scripts/dasha_analyzer.py",
"scripts/divisional_charts_extended.py",
"scripts/domain_calculation_service.py",
"scripts/functional_benefics.py",
"scripts/jaimini.py",
"scripts/minute_rectification_fact_ranker_v4.py",
"scripts/minute_rectification_feature_facts_v4.py",
"scripts/narayana_dasha.py",
"scripts/rectification/api_service.py",
"scripts/rectification/candidate_contrast.py",
"scripts/rectification/candidate_window.py",
"scripts/rectification/case_holdout.py",
"scripts/rectification/contracts.py",
"scripts/rectification/dasha_transition_proximity.py",
"scripts/rectification/decision_policy.py",
"scripts/rectification/event_probes.py",
"scripts/rectification/refinement_packet.py",
"scripts/rectification/scoring_service.py",
"scripts/shadbala.py",
"scripts/varga.py"
],
"production_scoring_sha256": "c2c23bcbde5de58e519ae1d6545620edd0f738ce8dc2e872e659b598137a728f",
"research_files": [
"scripts/research/reported_offset_sweep.py",
"scripts/research/cluster_width_lib.py",
"scripts/research/probe_supply_after_six.py",
"scripts/research/sealed_holdout_rerun.py",
"scripts/minute_rectification_blind_eval.py",
"scripts/minute_rectification_fact_blind_eval_v4.py",
"scripts/minute_rectification_holdout_validator.py"
],
"research_implementation_sha256": "9df579bdacd7dec43abd92c9abc1831771feb800fc29e6864dc315d083d52a03",
"file_sha256": {
"scripts/active_rectification_event_engine.py": "96c537d221a84680ddaaba74e3335162c44b5bbd9a60d10e69550a2095910d98",
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
"scripts/ashtakavarga.py": "c524da3f54b2ed9c080b78b33854854a0ca3d5d79b7e536bb1c3bc2be3e02852",
"scripts/dasha_analyzer.py": "3949b96813217fe624899856afec9f0b787c4cb0fea3a9a0d961990dbd11943a",
"scripts/divisional_charts_extended.py": "e9820e80f14fddc86ab5495d11455d16c2d3c9502a9a242fcf9efc41186e0d11",
"scripts/domain_calculation_service.py": "66923a2bc69daf65c965d2973c4b9234edbec5147909eaf3609b6b377ce3c7ca",
"scripts/functional_benefics.py": "cbaac3b8c09b97f8724b5300e9a402cbf77089af6c7db8788550d40fd35ac57b",
"scripts/jaimini.py": "6b88658da5404da9b136686d92a04be462d61a39da6e8de4255021e2ed2d1173",
"scripts/minute_rectification_blind_eval.py": "07aa30d8bad3278669495d5fea8be937aaf6367c8af980ff4f2fe9aa84ccc6ff",
"scripts/minute_rectification_fact_blind_eval_v4.py": "bdf460e3467208e8b87345c5beb2128f3e22de7eeffd68f72b281b3ad9affc92",
"scripts/minute_rectification_fact_ranker_v4.py": "f1a0d8d2482cd754d2e7f253a9606b0373519435a2bf58cfc3753e2b9ae0fb76",
"scripts/minute_rectification_feature_facts_v4.py": "3d899a2cdd4825b8e32062443d487edcd2173a4ea55a36eb9f3abe587c0faf0f",
"scripts/minute_rectification_holdout_validator.py": "b60b1c752e58672beaee8b36eb3b2348169726cda070ec969db0f13e7ed715af",
"scripts/narayana_dasha.py": "bc667c30c9562fb73fb0b7b4c22a5e377f9a531795141fc629b2cd3cf396773a",
"scripts/rectification/api_service.py": "089730097d3872a4f7b5d7dd5574bb7e9ab4d2e246d4a380800bc824d7979b95",
"scripts/rectification/candidate_contrast.py": "eee7da71c0574a08876404b78ca111153fa95fb83ace82b9fdca141d1992e273",
"scripts/rectification/candidate_window.py": "2fbc5058b12049b15fca375cdc125b8283e19f9f3e4bedcc291e344501891bef",
"scripts/rectification/case_holdout.py": "fe0e699b617d9e216acdfeff87af4221c1d6f4c101bf33e1dbf14e2bcd75a8b5",
"scripts/rectification/contracts.py": "c6dc6bd230e38f9f2126c224aae9ddbd6415304c15340f8c7cd3f06f6ef3160f",
"scripts/rectification/dasha_transition_proximity.py": "5ce4ed27b0f06c681abc34e5fd998fafb10c153a0070aa36c99ddfa869a2cbf2",
"scripts/rectification/decision_policy.py": "80e8de4680d19a052213bb821d2a9c94143a2962235aeb27f6ad81374d2e60d5",
"scripts/rectification/event_probes.py": "f5ca9d54501f67a1546fcf5b01da0c1277dec2e2c6df481884e8900d14909a7c",
"scripts/rectification/refinement_packet.py": "dbeea5aa780889785ce850f3881e8b7f67bb44594e9bc382c65b2e730884a2f4",
"scripts/rectification/scoring_service.py": "fa056fa30d9e6ffa4b75295fc49c793e35b26ebeca64ca843d26c8abef3050f2",
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
"scripts/research/reported_offset_sweep.py": "e10537ca2caba3a4e6a8d2460265543b0cca55935afa8004108e45bef4bc3de7",
"scripts/research/sealed_holdout_rerun.py": "7945353014b93b6d7641f278779111d85b1773293781343b802a9b4b655ca4b5",
"scripts/shadbala.py": "334dc9d8e4292f0c95d40fd4c29285aa89b9e49d4f187fb9498f4bb0ad93bdfc",
"scripts/varga.py": "c1f06967c3d4d214edadff139c24aa31e59fb628477174235abe14f799a99076"
},
"hash_scope": "explicit_identity_file_sets_not_a_transitive_dependency_lock"
},
"scorer_frozen_before_rerun": true,
"source_audit_status": "corrected_known_date_errors",
"trial_count": 20,
"official_valid_independent_blind": false,
"is_blind_evaluation": false,
"truth_hidden_from_ranker": true,
"results_previously_seen": true,
"must_not_claim_as_release_metrics": true,
"must_not_use_for_tuning": true,
"verified_minute_claim_allowed": false,
"metric_gates_passed": false,
"events_per_case": 3,
"boundary": "Previously exposed v3 shadow fixed-protocol rerun after upstream sync8 (ERR-110, BUG-1380 to BUG-1390). Trials and metrics match the 2026-10-13 scoring_perf report. Versus the 2026-09-20 historical report, changed_trial_count stays 8. Not a release metric. Prior scoring_perf report and freeze preserved byte-for-byte.",
"report_sha256": "4573440f00138563122dd3aa12f4ca66517f2b4aad5a2db9373a87eeb8997ce4",
"freeze_record_sha256": "493b4199df86c1d8782ae1016b2509d7602758d6fdb4e2c492207eb1af38eac0",
"replay_started_at_utc": "2026-10-18T10:46:24.464749+00:00",
"replay_finished_at_utc": "2026-10-18T10:46:26.772898+00:00",
"previous_fixed_protocol_rerun": {
"report_path": "docs/research/sealed_holdout_rerun_scoring_perf_2026_10_13.json",
"freeze_record_path": "docs/research/sealed_holdout_rerun_scoring_perf_2026_10_13.freeze.json",
"superseded_reason": "Upstream sync8 (BUG-1380 to BUG-1390) changed frozen identity files. Output is unchanged, so ERR-110 stored a new record. Prior scoring_perf report and freeze preserved byte-for-byte."
}
},
"current_tree_unfrozen_diagnostic": {
"is_blind_evaluation": false,
"results_already_seen": true,
@@ -330,6 +330,28 @@
"verified_minute_claim_allowed": false
},
"current_tree_reported_offset_replay": {
"report_path": "docs/research/reported_offset_d60_mapping_2026_10_29.json",
"report_sha256": "f40157139733552dbefdfc999f95458de75594cd511df0e5377d606e27559f0d",
"freeze_record_path": "docs/research/reported_offset_d60_mapping_2026_10_29.freeze.json",
"freeze_record_sha256": "20e7684bc6c7356a421c2c20517c153279561f810cd15d77f260c9915352aed9",
"scope": "reported_offset_sensitivity_not_product_accuracy",
"trial_count": 900,
"official_valid_independent_blind": false,
"official_blind_trial_count": 0,
"must_not_use_for_tuning": true,
"must_not_claim_as_release_metrics": true,
"replay_started_at_utc": "2026-10-29T06:08:17.701243+00:00",
"replay_finished_at_utc": "2026-10-29T06:29:23.437778+00:00",
"boundary": "Previously exposed reported-offset sensitivity after the D60 mapping fix (ERR-110, BUG-1500). Summary and trials match the 2026-10-18 upstream sync8 and the upstream_sync9b reports. Versus the 2026-09-20 historical report, changed_trial_count stays 581 of 900. Not a release metric. No tuning. Prior reports and freezes preserved byte-for-byte.",
"previous_reported_offset_replay": {
"report_path": "docs/research/reported_offset_upstream_sync9b_2026_10_28.json",
"report_sha256": "880bebc2e217100994a1442e47ead3f9d33e48aa3ac20f69d993f38def3ef25c",
"freeze_record_path": "docs/research/reported_offset_upstream_sync9b_2026_10_28.freeze.json",
"freeze_record_sha256": "385817bb27f04afeba230af5e547dd10dc8cf6db4b25c18bebe4f4e674cab972",
"superseded_reason": "The D60 mapping fix (BUG-1500) changed scripts/varga.py, which is part of the extended identity. Output is unchanged, so ERR-110 stored a new record. Prior upstream_sync9b report and freeze preserved byte-for-byte."
}
},
"previous_reported_offset_replay": {
"report_path": "docs/research/reported_offset_upstream_sync9b_2026_10_28.json",
"report_sha256": "880bebc2e217100994a1442e47ead3f9d33e48aa3ac20f69d993f38def3ef25c",
"freeze_record_path": "docs/research/reported_offset_upstream_sync9b_2026_10_28.freeze.json",
@@ -350,27 +372,5 @@
"freeze_record_sha256": "117ab0bfa4a283e9d52073808f71dd8317f613c96b27ec271d887ef40087f4f5",
"superseded_reason": "Upstream sync9b (BUG-1494 to BUG-1495) changed scripts/varga.py, which is part of the extended identity. Output is unchanged, so ERR-110 stored a new record. Prior sync8 report and freeze preserved byte-for-byte."
}
},
"previous_reported_offset_replay": {
"report_path": "docs/research/reported_offset_upstream_sync8_2026_10_18.json",
"report_sha256": "a51aad2e743dccba7726d1a0a5e44c5e431ff429fe1725c9be2f7fa5e9282da6",
"freeze_record_path": "docs/research/reported_offset_upstream_sync8_2026_10_18.freeze.json",
"freeze_record_sha256": "117ab0bfa4a283e9d52073808f71dd8317f613c96b27ec271d887ef40087f4f5",
"scope": "reported_offset_sensitivity_not_product_accuracy",
"trial_count": 900,
"official_valid_independent_blind": false,
"official_blind_trial_count": 0,
"must_not_use_for_tuning": true,
"must_not_claim_as_release_metrics": true,
"replay_started_at_utc": "2026-10-18T10:46:27.013583+00:00",
"replay_finished_at_utc": "2026-10-18T10:49:10.767675+00:00",
"boundary": "Previously exposed reported-offset sensitivity after upstream sync8 (ERR-110, BUG-1380 to BUG-1390). Summary and trials match the 2026-10-13 scoring_perf report. Versus the 2026-09-20 historical report, changed_trial_count stays 581 of 900. Not a release metric. No tuning. Prior scoring_perf report and freeze preserved byte-for-byte.",
"previous_reported_offset_replay": {
"report_path": "docs/research/reported_offset_scoring_perf_2026_10_13.json",
"report_sha256": "9466cf3945a63621104157fb34291cb23205ddb045effa7e70f3c35647516443",
"freeze_record_path": "docs/research/reported_offset_scoring_perf_2026_10_13.freeze.json",
"freeze_record_sha256": "1560f24ffea19116c904272907ff9cce24904960406676f3aada3c8c174cf98a",
"superseded_reason": "Upstream sync8 (BUG-1380 to BUG-1390) changed frozen identity files. Output is unchanged, so ERR-110 stored a new record. Versus the 2026-09-20 historical report, changed_trial_count stays 581 of 900. Prior scoring_perf report and freeze preserved byte-for-byte."
}
}
}
+145
View File
@@ -0,0 +1,145 @@
#!/usr/bin/env python3
"""G1: compare the production D60 ascendant with an external engine (issue #149).
For every case of the v5 minute-rectification holdout this prints the D60
(rashi) sign of the ascendant from the production mapping and from PyJHora's
traditional Parasara shashtyamsa chart. The gate in
docs/tasks/TASK-rectification-d60-two-way-20261028.md asks for >=95% agreement
with at least one external engine; after BUG-1500 both count from the sign
itself and the expected result is 77/77.
The output is deterministic: no timestamps, sorted keys, fixed formatting, so
a rerun on another machine can be compared byte for byte.
Usage:
python scripts/research/d60_two_way_run.py # writes the results JSON
python scripts/research/d60_two_way_run.py --json # prints it to stdout
PyJHora is AGPL; it is imported here only, never copied into production code.
"""
from __future__ import annotations
import argparse
import hashlib
import json
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
if str(ROOT) not in sys.path:
sys.path.insert(0, str(ROOT))
SCRIPTS = ROOT / "scripts"
if str(SCRIPTS) not in sys.path:
sys.path.insert(0, str(SCRIPTS))
from scripts.jyotish_engine import compute_chart_data # noqa: E402
DATASET = ROOT / "references/real_case_calibration/minute_rectification_holdout_v5.json"
DEFAULT_OUT = ROOT / "docs/research/d60_two_way_results_2026_10_29.json"
GATE_RATE = 0.95
def _cases() -> list[dict]:
return json.loads(DATASET.read_text(encoding="utf-8"))["cases"]
def our_d60_ascendant(case: dict) -> tuple[float, int]:
birth = case["birth"]
year, month, day = (int(part) for part in birth["date"].split("-"))
hour, minute = (int(part) for part in birth["time"].split(":"))
chart, _asc_idx, _jd, _ayanamsa = compute_chart_data(
year,
month,
day,
hour,
minute,
birth["latitude"],
birth["longitude"],
birth["timezone_offset"],
node_mode="mean",
ayanamsa_name="raman",
)
import varga
longitude = float((chart.get("ascendant") or {})["degree_raw"])
return longitude, int(varga.calc_varga(longitude, 60)["sign_idx"])
def pyjhora_d60_ascendant(case: dict) -> int:
from jhora import utils
from jhora.horoscope.chart import charts
from jhora.panchanga import drik
birth = case["birth"]
year, month, day = (int(part) for part in birth["date"].split("-"))
hour, minute = (int(part) for part in birth["time"].split(":"))
drik.set_ayanamsa_mode("Raman")
jd = utils.julian_day_number((year, month, day), (hour, minute, 0))
place = drik.Place("case", birth["latitude"], birth["longitude"], birth["timezone_offset"])
chart = charts.divisional_chart(jd, place, divisional_chart_factor=60)
lagna = next(item for item in chart if str(item[0]) == "L")
return int(lagna[1][0])
def run() -> dict:
rows = []
for case in _cases():
longitude, ours = our_d60_ascendant(case)
theirs = pyjhora_d60_ascendant(case)
rows.append(
{
"case_id": case["case_id"],
"ascendant_longitude": round(longitude, 6),
"d60_sign_idx_production": ours,
"d60_sign_idx_pyjhora": theirs,
"matches_pyjhora": ours == theirs,
}
)
matches = sum(row["matches_pyjhora"] for row in rows)
count = len(rows)
return {
"scope": "d60_gate_g1_engine_reconciliation",
"task": "docs/tasks/TASK-rectification-d60-two-way-20261028.md",
"brief": "docs/tasks/TASK-rectification-d60-fix-20261029.md",
"issue": 149,
"bug": "BUG-1500",
"dataset": {
"path": DATASET.relative_to(ROOT).as_posix(),
"sha256": hashlib.sha256(DATASET.read_bytes()).hexdigest(),
"cases": count,
},
"profile": {
"ayanamsa": "raman",
"node_mode": "mean",
"pyjhora_ayanamsa_mode": "Raman",
"pyjhora_chart": "divisional_chart(divisional_chart_factor=60), traditional Parasara from sign",
},
"gate": {
"threshold": GATE_RATE,
"matches": matches,
"rate": round(matches / count, 4) if count else None,
"passed": bool(count) and matches / count >= GATE_RATE,
},
"cases": rows,
}
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--json", action="store_true", help="print instead of writing the default path")
parser.add_argument("--out", default=None)
args = parser.parse_args()
payload = run()
text = json.dumps(payload, ensure_ascii=False, indent=2, sort_keys=True) + "\n"
if args.json:
print(text, end="")
return 0
out = Path(args.out) if args.out else DEFAULT_OUT
out.write_text(text, encoding="utf-8", newline="\n")
print(out.relative_to(ROOT).as_posix())
return 0
if __name__ == "__main__":
raise SystemExit(main())
+5 -2
View File
@@ -33,8 +33,11 @@ MINUTE_STEP = 1
# 原值: docs/research/reported_offset_upstream_sync8_2026_10_18.{freeze.json,json}
# 新值: docs/research/reported_offset_upstream_sync9b_2026_10_28.{freeze.json,json}
# 原因: sync9b(BUG-1494~1495)改了 scripts/varga.py,它在扩展身份里;报时窗口输出不变,ERR-110 另存新记录
FREEZE = ROOT / "docs/research/reported_offset_upstream_sync9b_2026_10_28.freeze.json"
REPORT = ROOT / "docs/research/reported_offset_upstream_sync9b_2026_10_28.json"
# 原值: docs/research/reported_offset_upstream_sync9b_2026_10_28.{freeze.json,json}
# 新值: docs/research/reported_offset_d60_mapping_2026_10_29.{freeze.json,json}
# 原因: BUG-1500 修正生产 D60 映射,scripts/varga.py 变了(在扩展身份里);900 条回放不变,ERR-110 另存新记录
FREEZE = ROOT / "docs/research/reported_offset_d60_mapping_2026_10_29.freeze.json"
REPORT = ROOT / "docs/research/reported_offset_d60_mapping_2026_10_29.json"
LEGACY_REPORT = ROOT / "docs/research/reported_offset_2026_09_20.json"
+5 -2
View File
@@ -30,8 +30,11 @@ DATASET = ROOT / "references/real_case_calibration/minute_rectification_holdout_
# 原值: docs/research/sealed_holdout_rerun_upstream_sync8_2026_10_18.{freeze.json,json}
# 新值: docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.{freeze.json,json}
# 原因: sync9b(BUG-1494~1495)改了 scripts/varga.py,它在扩展身份里;切盘输出不变,ERR-110 另存新记录
FREEZE = ROOT / "docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.freeze.json"
REPORT = ROOT / "docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.json"
# 原值: docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28.{freeze.json,json}
# 新值: docs/research/sealed_holdout_rerun_d60_mapping_2026_10_29.{freeze.json,json}
# 原因: BUG-1500 修正生产 D60 映射,scripts/varga.py 变了(在扩展身份里);20 条回放不变,ERR-110 另存新记录
FREEZE = ROOT / "docs/research/sealed_holdout_rerun_d60_mapping_2026_10_29.freeze.json"
REPORT = ROOT / "docs/research/sealed_holdout_rerun_d60_mapping_2026_10_29.json"
LEGACY_REPORT = ROOT / "docs/research/sealed_holdout_rerun_2026_09_20.json"
ARCHIVE = ROOT / "docs/research/history/rectification_pre_cross_midnight_2026_09_20"
PRODUCTION_FILES = [
+3 -1
View File
@@ -90,7 +90,9 @@ def varga_map(si, pi, div):
if div==30: return _d30_map(si,pi)
if div==40: return ((0 if o else 6)+pi)%12
if div==45: return ((0 if o else 6)+pi)%12
if div==60: return (si+pi)%12 if o else (si+1+pi)%12
# D60 Shashtyamsa: every sign counts from itself (references/shodasavarga-complete-guide.md;
# PyJHora traditional Parasara "from sign" agrees 77/77 on the v5 recorded times, BUG-1500).
if div==60: return (si+pi)%12
if div==81:
outer_part = pi // 9
inner_part = pi % 9
+24
View File
@@ -0,0 +1,24 @@
"""G1 contract for the D60 two-way study (issue #149, BUG-1500).
The gate compares the production D60 ascendant with PyJHora for every v5 case.
It must agree on all of them now that both count from the sign itself; the
payload must stay free of recorded birth times so it can be published.
"""
from __future__ import annotations
import pytest
def test_g1_agrees_with_pyjhora_on_every_v5_case() -> None:
pytest.importorskip("jhora.horoscope.chart.charts")
from scripts.research.d60_two_way_run import run
payload = run()
assert payload["dataset"]["cases"] == 77
assert payload["gate"]["matches"] == 77
assert payload["gate"]["passed"] is True
for row in payload["cases"]:
assert row["matches_pyjhora"] is True
assert "true_minute" not in row
assert "birth_time" not in row
+36
View File
@@ -0,0 +1,36 @@
"""D60 Shashtyamsa counts from the sign itself for every sign (BUG-1500).
The production mapping used to add one sign for 1-based even signs, which put
the same ascendant one D60 sign away from PyJHora on 44 of 77 recorded times.
The guide (references/shodasavarga-complete-guide.md) and PyJHora both count
from the sign itself, odd and even alike.
"""
from __future__ import annotations
import pytest
from scripts.varga import calc_varga
def test_d60_first_part_starts_in_its_own_sign() -> None:
for sign in range(12):
for part in range(60):
longitude = sign * 30 + part * 0.5 + 0.25
assert calc_varga(longitude, 60)["sign_idx"] == (sign + part) % 12, (sign, part)
@pytest.mark.parametrize("sign", [1, 3, 5, 7, 9, 11])
def test_d60_even_signs_first_part_is_the_same_sign(sign: int) -> None:
# 1-based even signs: Taurus, Cancer, Virgo, Scorpio, Capricorn, Pisces.
result = calc_varga(sign * 30 + 0.25, 60)
assert result["sign_idx"] == sign
def test_d60_matches_pyjhora_shashtyamsa_for_all_signs_and_parts() -> None:
charts = pytest.importorskip("jhora.horoscope.chart.charts")
for sign in range(12):
for part in range(60):
degree = part * 0.5 + 0.25
their = int(charts.shashtyamsa_chart([["L", [sign, degree]]])[0][1][0])
assert calc_varga(sign * 30 + degree, 60)["sign_idx"] == their, (sign, part)
@@ -58,6 +58,11 @@ IDENTITY_FORBIDDEN_PREFIXES = (
# 原因: sync9b 改了扩展身份里的 scripts/varga.py,回放输出不变,ERR-110 另存新记录
"docs/research/sealed_holdout_rerun_upstream_sync9b_2026_10_28",
"docs/research/reported_offset_upstream_sync9b_2026_10_28",
# 原值: 排除到 upstream_sync9b_2026_10_28
# 新值: 再排除 d60_mapping_2026_10_29 两份冻结路径(追加,不替换上面的)
# 原因: BUG-1500 修正生产 D60 映射,varga.py 变了,回放输出不变,ERR-110 另存新记录
"docs/research/sealed_holdout_rerun_d60_mapping_2026_10_29",
"docs/research/reported_offset_d60_mapping_2026_10_29",
"docs/research/history/",
"artifacts/",
)