chore(rectification): re-freeze sealed holdout and offset sweep for #166 batch 2 at scoring-15 (ERR-110, BUG-1590..1598)
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m25s
Independent Staging Quality Gate / validate-python (push) Successful in 6m30s
Independent Staging Quality Gate / publish (push) Successful in 3m3s

FREEZE / REPORT constants first, --freeze, then replay:
astrologer_166b_2026_11_04 (frozen after 7ff447ac); contract rotated with
previous = astrologer_166_2026_11_04 (kept byte-for-byte).

Versus astrologer_166_2026_11_04 (no tuning):
- sealed 20: all identical, metrics unchanged.
- reported offset 900: 114 changed; top-1 hits at +-15/30/60 stay 4/3/0;
  top-3 30/34/29 -> 31/34/30; delivery coverage at +-15 220 -> 219; mean
  top-1 minute error 20.87 -> 20.52.

BUG-1590..1598 recorded; ledger and CHANGELOG lines added.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
This commit is contained in:
2026-11-04 22:42:41 +08:00
co-authored by Claude Opus 5.5
parent 7ff447ac67
commit 013f889529
12 changed files with 45344 additions and 51 deletions
+8
View File
@@ -1,5 +1,13 @@
# 印度占星 Skill 更新日志
## 2026-11-04 — #166 占星师裁定第二批:功能吉凶歧义格、Gajakesari / Matrunasa、Chara 双主星、Gulika 口径与日出记录,生时校正算法升到 scoring-15
- 双子上升土星、处女上升土星改为「混合」,不再按三方宫优先判纯吉;8 个歧义格附占星师说明(BUG-1590)。
- Gajakesari 只按严格定义成立(吉星合相或相照,木星不落陷、不燃烧、不落敌宫);强木星变体和单纯的月木角宫关系另列,不进传统格局名单(BUG-1596)。Matrunasa 拆成 Raman 198、199 两条,198 只用具名行星相照,每次命中写出触发项,不再写「高置信」和母亲健康判语(BUG-1597)。
- Chara 大运天蝎 / 水瓶两颗主星都在本宫固定 12 年(BUG-1591);Narayana 只算九曜为占据星(BUG-1592),12 年上限处显示实际生效的修正(BUG-1593)。
- Gulika / Maandi 同时给出土星段起点与中点两个原始点,并写明现用对应关系不是 PVR 教材口径(BUG-1594)。日出、时主口径写进输出,数值不变(BUG-1595)。D3 / D24 / D30 / D60 写明方法名(BUG-1598)。七星制 Chara Karaka 注明父亲星不适用。
- 功能吉凶进生时校正打分,算法身份升到 `rectification-v5-matrix-scoring-15`;密封 20 例回放不变,报时窗口 900 次头名命中不变。Narayana 默认换成 Sanjay Rath 版(第 9 条)另行处理。
## 2026-11-04 — 按占星师 #166 裁定改正 Shadbala、Arudha 与 D30 度数,生时校正算法升到 scoring-14
- 月亮盈亏力改用口径 C:亏月也取 P(梵文 27.11 把月亮与水、金、木并列),Chesta = Paksha,总分 2P(BUG-1581,取代 BUG-1557 的口径 B)。太阳南北行力不再乘 2,Chesta 取同一基础值,A + A(BUG-1582)。
+145
View File
@@ -21744,3 +21744,148 @@
- 关联记录:BUG-1560、BUG-1561、#166。
- 复发自:无
- 修复版本:分支 `codex/astrologer-166-rulings`,`78f98eba`。
## BUG-1590 | 功能吉凶歧义格:双子上升土星(8、9 宫主)、处女上升土星(5、6 宫主)按三方宫优先判纯吉
- 状态:resolved(引擎 + 回归测试;未部署)
- 首次发现 / 最近更新:2026-11-04(#166 第 4 条,数据核对 I)/ 2026-11-04
- 影响面:`scripts/functional_benefics.py`:星盘页功能角色列、数据卡、报告、瑜伽引擎的功能层,以及生时校正的 `*_functional_*` 规则(进打分)。
- 现象:双子上升土星、处女上升土星显示为功能吉星。
- 触发条件:上升双子或处女。
- 根因:通用规则「兼管三方宫与 6 / 8 / 12 宫时三方宫优先」覆盖了专条语境;占星师裁定这两格是混合,不标纯吉。
- 修复:`ROLE_OVERRIDES` 加双子土星、处女土星为 neutral(混合),代码按「原值 / 新值 / 原因」注明。占星师给的 8 个歧义格说明随结果输出为 `ambiguous_cell_notes`(其余 6 格现状已与裁定一致);另一宫主身份保留在 `owned_houses`。
- 验证:`tests/test_astrologer_rulings_166_batch2.py::test_q4_*`(8 格角色、双子水星不是 Yogakaraka)。
- 冻结身份(ERR-110,第二批一次重冻):`functional_benefics.py`、`jaimini.py`、`narayana_dasha.py`、`shadbala.py`、`varga.py`、`rectification/scoring_service.py` 在冻结身份里。先升 `rectification-v5-matrix-scoring-15`(记忆化 golden v8:这条公开请求候选分数不变,只有指纹与身份变;scoring-15 跨午夜 golden,独立进程 A/B 3 × 7 项全同),再按 ERR-110 改 FREEZE / REPORT 常量、`--freeze` 后回放,标签 `astrologer_166b_2026_11_04`,合同轮换,`astrologer_166_2026_11_04` 逐字节保留。与 `astrologer_166_2026_11_04` 逐条比:密封 20 条全同、`metrics` 不变;报时 900 条 114 条变,±15 / 30 / 60 头名命中仍 4 / 3 / 0,前三 30 / 34 / 29 → 31 / 34 / 30,±15 交付覆盖 220 → 219,头名平均分钟误差 20.87 → 20.52。相对 09-20 历史报告:密封 10 / 20、报时 731 / 900。未调参。
- 防复发:歧义格由测试逐格锁住。
- 关联记录:BUG-1570(同文件)、#166。
- 复发自:无
- 修复版本:分支 `codex/astrologer-166-batch2`,`4b223eb8`;校正身份 scoring-15。
## BUG-1591 | Chara 大运天蝎 / 水瓶两颗主星都在本宫时,选中的主星入旺再加 1 年,得 13 年
- 状态:resolved(引擎 + 回归测试;未部署)
- 首次发现 / 最近更新:2026-11-04(#166 第 10 条;本单子代理用直接调用复现:火星、计都同在天蝎得 13 年)/ 2026-11-04
- 影响面:`scripts/jaimini.py` `_chara_dasha_duration_profile`(K.N. Rao 本地口径):星盘页、全读、咨询的 Chara 大运年数与之后各运起止。不进校正打分。
- 现象:火星、计都同在天蝎时天蝎大运 13 年。
- 触发条件:天蝎(火星 / 计都)或水瓶(土星 / 罗睺)两颗主星都在本宫,且选中的主星在 `_PLANET_DIGNITY_KNRAO` 里算入旺(计都在天蝎)。
- 根因:数到本宫时先置 12,再无条件按入旺 +1;`_resolve_chara_dasha_lord` 注释写「两种情况都是 12」,与实际不符。
- 修复:两颗主星都在本宫时固定 12 年,不再加减(Rath p.43 (a),占星师裁定);注释同步。
- 验证:`test_astrologer_rulings_166_batch2.py::test_q10_chara_both_lords_in_sign_is_twelve`。
- 冻结身份:见 BUG-1590。
- 防复发:回归测试。
- 关联记录:BUG-1566、#166。
- 复发自:无
- 修复版本:分支 `codex/astrologer-166-batch2`,`4b223eb8`。
## BUG-1592 | 旧 Narayana 起运宫比较把 planet_lons 里的所有键都算成占据星(含 Lagna)
- 状态:resolved(引擎 + 回归测试;未部署)
- 首次发现 / 最近更新:2026-11-04(#166 第 11 条;子代理探针:传入 Lagna 键时占据数 0 → 2)/ 2026-11-04
- 影响面:`scripts/narayana_dasha.py` `select_narayana_seed_sign`、`_narayana_dual_lord_strength`。现有调用方只传九曜经度,产品输出不变;防的是以后传入上升等点。
- 现象:见首次发现。
- 触发条件:调用方在 planet_lons 里放 Lagna 或其他非行星点。
- 根因:按字典键计数,没有限定九曜。
- 修复:`OCCUPANT_GRAHAS` 只含九曜。Rath 版与 Chara 早已只算九曜。
- 验证:`test_q11_lagna_is_not_an_occupant`。
- 冻结身份:见 BUG-1590。
- 防复发:同上。
- 关联记录:#166。
- 复发自:无
- 修复版本:分支 `codex/astrologer-166-batch2`,`4b223eb8`。
## BUG-1593 | Narayana 大运 12 年上限截掉 +1 后,结果仍报 dignity_adjustment = 1(水星在处女)
- 状态:resolved(引擎 + 回归测试;未部署)
- 首次发现 / 最近更新:2026-11-04(#166 第 8 条;子代理探针 `{'base_years': 12, 'dignity_adjustment': 1, 'years': 12}`)/ 2026-11-04
- 影响面:`scripts/narayana_dasha.py` `calculate_narayana_period_years`(`jaimini_odd_footed_dignity_v2`),Rath 版表格的「修正」列。
- 现象:表里显示「12 年、修正 +1」,读起来像 13 年被截。
- 触发条件:基本年数 12 且入旺。
- 根因:返回的是原始调整量,不是生效的调整量。
- 修复:返回 `years − base_years`。Rath 版其余规则(逐级比较、双主星 p.43 (a)–(e)、上限 12、九曜才算占据)子代理逐条核对已符合裁定,未改。
- 验证:`test_q8_mercury_in_virgo_cap_reports_no_plus_one`。
- 冻结身份:见 BUG-1590。
- 防复发:同上。
- 关联记录:#166。
- 复发自:无
- 修复版本:分支 `codex/astrologer-166-batch2`,`4b223eb8`。
## BUG-1594 | Gulika / Maandi 只按一种对应关系输出,名称与 PVR 教材相反却没有标口径
- 状态:resolved(引擎 + 回归测试;未部署)
- 首次发现 / 最近更新:2026-11-04(#166 第 15 条)/ 2026-11-04
- 影响面:`scripts/gulika.py` `calculate_upagrahas`(本命基础、星盘页特殊点、瑜伽引擎的 Gulika / Maandi 宫)。数值不变。
- 现象:本仓 Gulika = 土星段起点、Maandi = 中点(与 PyJHora 同);PVR 教材 §4.3 正好相反。输出没有说明。
- 触发条件:任何盘。
- 根因:只存了按名字的两个点,没有存原始点和口径名。
- 修复:输出新增 `saturn_segment_points`(`saturn_segment_start`、`saturn_segment_midpoint`)、`gulika_maandi_method = pyjhora_compatible_gulika_start_maandi_midpoint`、两种对应表 `GULIKA_MAANDI_METHODS`(含 `pvr_textbook_4_3`)和一句说明。现行对应关系保留,不称作 PVR 口径。第 14 条(无主段放土星之后)按裁定维持现状。
- 验证:`test_q15_saturn_segment_points_and_method`。
- 冻结身份:不在冻结身份里。
- 防复发:口径名写进输出。
- 关联记录:BUG-1565、#166。
- 复发自:无
- 修复版本:分支 `codex/astrologer-166-batch2`,`4b223eb8`。
## BUG-1595 | 日出与时主口径没有记录:各模块各用一种日出,输出看不出用了哪一种
- 状态:resolved(只加记录,数值不变;未部署)
- 首次发现 / 最近更新:2026-11-04(#166 第 12、13 条;子代理盘点各处日出与时主)/ 2026-11-04
- 影响面:`scripts/saham_daynight.py` `determine_daytime`(Gulika、Saham、Panchanga、年主昼夜、生时校正 Hora / Ghati Lagna 共用)、`scripts/shadbala.py`(`method_variants.sunrise`、`.hora`)、`scripts/jyotish_engine.py` 出生 Panchanga `calculation_profile`。
- 现象:Gulika / Saham / Shadbala 用印度日出(日心、不计折射),Panchanga / 年主 / 生时校正用视日出(上缘、计折射),19 张盘有 3 张时主不同;输出里没有任何字段说明用了哪一种。时主 Shadbala、Panchanga 都按日出后固定 60 分钟。
- 触发条件:任何盘。
- 根因:日出口径散在各模块,没有统一记录。
- 修复:产品 2026-11-04 决定只记录、不切换。昼夜窗口输出新增 `sunrise_convention`(名称、日面上缘 / 中心、是否计折射、地平高度 0、swisseph 标志、经纬度);Shadbala `method_variants` 写 `sunrise`、`hora`(`fixed_60_minutes_from_sunrise_approximation`,标为近似);Panchanga `calculation_profile` 写 `sunrise_convention`、`hora_method`。未统一到印度日出(会改校正分数与部分 Panchanga,留待产品另行决定)。
- 验证:`test_saham_daynight.py`(视日出窗口去掉新字段后与旧实现逐字段相同,并核对口径名)、`test_shadbala_service_api.py`。
- 冻结身份:shadbala.py 在冻结身份里,见 BUG-1590。
- 防复发:口径写进输出。
- 关联记录:BUG-1388、BUG-1547、BUG-1568、#166。
- 复发自:无
- 修复版本:分支 `codex/astrologer-166-batch2`,`4b223eb8`。
## BUG-1596 | Gajakesari 把「强木星」变体并进严格定义,也不查燃烧和敌宫(乔布斯木星落敌宫仍显示成立)
- 状态:resolved(引擎 + 回归测试;未部署)
- 首次发现 / 最近更新:2026-11-04(#166 第 5 条,数据核对 I)/ 2026-11-04
- 影响面:`references/yoga_rules.json` `gajakesari`、`scripts/yoga_engine.py`:全读瑜伽列表、星盘页瑜伽页签、咨询卡传统格局(按 `gajakesari` 前缀匹配)。不进校正打分(不在冻结身份里)。
- 现象:乔布斯盘木星在双子(水星宫,木星的自然敌星)仍判 Gajakesari;条件文字固定为「木星有吉星合/照或不弱陷」,看不出走的是哪一支。
- 触发条件:木星在月亮角宫,且(吉星关联 或 强木星),只查落陷。
- 根因:PVR 教材的严格定义与其后的变体被 OR 在一起;燃烧、敌宫两项没有实现。
- 修复:`Gajakesari Yoga` 改为严格定义:月亮角宫 + 金星 / 水星合相或相照 + 不落陷、不燃烧、不落自然敌星的宫;命中时写出触发的吉星。另立 `Strong-Jupiter Gajakesari Variant`(严格定义不成立、木星入旺 / 本宫 / 根本三角)与 `Moon-Jupiter Kendra Relation`(只有结构),两者名称不以 Gajakesari 开头,不进咨询卡和星盘页的传统格局名单。瑜伽沙盒新增 `combust()`(优先读盘面 `combust`,否则按顺行燃烧度数)、`in_natural_enemy_sign()`(BPHS 3.55 自然敌星)。四张公开盘:乔布斯、泰勒不再成立,只剩「月木角宫关系」。
- 验证:`test_astrologer_rulings_166_batch2.py::test_q5_*`(敌宫不成立、吉星关联成立并写触发、强木星只成变体);`test_yoga_audit_i_20261104.py` 静态扫描通过(新辅助函数已入命名空间)。
- 冻结身份:不在冻结身份里。
- 防复发:严格定义与变体分开命名;规则可写 `triggers`。
- 关联记录:BUG-1571、#166。前端的咨询 / 回测捕获文件(`consult-career-yoga-functional-20261002` 依赖的乔布斯 / 泰勒 Gajakesari)仍是改前快照,待重生成。
- 复发自:无
- 修复版本:分支 `codex/astrologer-166-batch2`,`4b223eb8`。
## BUG-1597 | Matrunasa 在 19 张测试盘全部成立:Raman 198 的「相位」用了 Jaimini 星座相照(含交点),198、199 合成一条
- 状态:resolved(引擎 + 回归测试;未部署)
- 首次发现 / 最近更新:2026-11-04(#166 第 6 条,数据核对 I)/ 2026-11-04
- 影响面:`references/yoga_rules.json` `bvr_matrunasa_precise`(新增 `bvr_matrunasa_199`)、`scripts/yoga_engine.py`:全读、报告、咨询卡父母领域的 Raman 支持项。
- 现象:19 / 19 成立;规则说明写「高置信」,效果写「母亲健康不佳」;不说是哪一条触发。
- 触发条件:任何凶星(含罗睺、计都)以星座相照照到月亮所在星座。
- 根因:Raman 198 的「aspected by malefics」被实现为 Jaimini 星座相照,且给了交点;198、199 合在一条 OR 里。
- 修复:`bvr_matrunasa_precise` 只做 198:月亮受凶星夹制(2、12 宫都有凶星)、与凶星同宫、或受太阳 / 火星 / 土星的具名行星相照(7 宫;火 4/8、木 5/9、土 3/10);罗睺、计都只算同宫与夹制,不给相照(实现选择,按占星师「交点可参与合相等明确关系,但不自动赋予特殊投射」)。新增 `bvr_matrunasa_199`(4 宫主的 Navamsa 链),用 `canonical_mapping` 落到咨询卡同一行。每次命中写出触发项(引擎新增:custom 规则可设 `triggers`,附在条件文字后并作为字段输出;AND 规则把子条件的触发项合并)。去掉「高置信」,效果改为「母亲相关的结构特征,只作参考,不作母亲健康或寿命判断」。四张公开盘:奥巴马不再成立,其余三张写出了具体触发。
- 验证:`test_q6_matrunasa_198_*`。
- 冻结身份:不在冻结身份里。
- 防复发:同上。前端 `consult-card-affliction-data-20261001` 依赖的奥巴马父母命中仍是改前快照,待重生成。
- 推送前补记:快速门 `test_report_english_sweep_smoke` 在 #1 号虚构盘的中文报告里数出 3 处中英混排(199 条触发项「… in house 8」里的 house 被译成「第」后剩下 in;BUG-1590 的英文歧义格说明)。触发项改为(中文,英文)成对输出(`triggers_zh` / `triggers`),歧义格说明改为中文正文加 `_en` 字段(`7ff447ac`);因 functional_benefics.py 在冻结身份里,第二批记录在这之后重新冻结、回放,结果与之前逐条相同。
- 关联记录:BUG-1571、#166。
- 复发自:无
- 修复版本:分支 `codex/astrologer-166-batch2`,`4b223eb8`。
## BUG-1598 | D3 / D24 / D60 只写「PyJHora 默认方法」,没有写明的方法合同
- 状态:resolved(只加方法名与一致性测试;数值不变;未部署)
- 首次发现 / 最近更新:2026-11-04(#166 第 31 条)/ 2026-11-04
- 影响面:`scripts/varga.py` `calc_varga` 输出。
- 现象:分盘结果不说用的是哪种 D3 / D24 / D60 变体。
- 触发条件:任何盘。
- 根因:依赖上游默认值,没有方法名。
- 修复:`VARGA_METHODS` 写明 D3 Parashari(本宫、5、9)、D24 奇数星座从狮子、偶数从巨蟹顺数(每份 1°15′)、D30 BPHS 第 6 章不等分且度数等比、D60 从本宫顺数(每份 30′;名称 / 吉凶序列另算);结果带 `method`。核对:varga.py 与 divisional_charts_extended 的 D3 / D24 / D60 在 0–360° 每 0.1° 落座一致(本单中间一次「D24 不一致」是测试把经度跑到了 360° 以外,非代码问题)。
- 验证:`test_q31_named_methods_and_module_agreement`、`test_q31_spec_examples`。
- 冻结身份:varga.py 在冻结身份里,见 BUG-1590。
- 防复发:同上。
- 关联记录:BUG-1589、#166。
- 复发自:无
- 修复版本:分支 `codex/astrologer-166-batch2`,`4b223eb8`。
+1
View File
@@ -4,6 +4,7 @@ Purpose: read this file before substantial project work. It exists to stop repea
## 2026-11-04 · 数据核对 1a / 1b(worktree `/workspace/wt-data`)
- #166 第二批(worktree `/workspace/wt-166b`,`codex/astrologer-166-batch2`,基于 staging 7141cc99):第一批推送后 backend-quality-gate #6711 前端 1 / 5672 红(`chart-board-20261027` 用两位小数显示值推百分比),本机 `npm test` 因 docker / rsync / Postgres 缺失整体 exit 1,把它混在环境失败里漏看了。以后本机前端全量按「改前改后失败清单」对比。其他教训:① 瑜伽 custom 表达式沙盒没有 `str` 等内置函数,用 f-string;新增辅助函数必须进 `_build_custom_exec_globals`,`test_yoga_audit_i_20261104` 会扫。② `pytest` 参数里混进非测试文件(`tests/yoga_test_suite.json`)会在收集阶段整体报错、一条都不跑,比对前后失败清单时要看总数,不能只看 diff 为空。③ 自己写的扫描循环把经度跑到 360° 以外,造出了「D24 两模块不一致」的假象;扫描前先限定 0–360°。④ 第 9 条(Narayana 默认换 Rath 版)牵涉 Python 约 10 处、前端约 20 处读取旧字段,单独做。
- #166 占星师裁定第一批(worktree `/workspace/wt-166`,`codex/astrologer-166-rulings`,基于 staging 6491388e):`pre_work_check.py` exit 0、六项全部 ok。教训:① 占星师答复里说「本仓已经是 X」时,那是上游仓;第 27 条说「两处 Arudha 都是落点 + 9」,本仓 jaimini.py 仍是原宫 + 9,改前先在本仓核对。② 把默认口径从 Raman 换成 BPHS 时,旧写法保留为具名 variant(`raman_gbb`),Raman 例题、PyJHora 存档对照改为显式传 variant,不改期望值,避免对照测试失去意义。③ 跑 Shadbala 相关测试会顺带改写 `references/oracle/prashna_*`、`shadbala_component_closure_batch1` 等存档(同上一条),提交前 `git checkout` 掉;`vp_jain_shadbala_component_benchmark` 是本单要更新的报告,保留。④ `chart-insight-golden.json` 的 `chart_modules_shadbala` 是「只带星体」的旧路径快照,要从 `/api/shadbala` 只带 planets 重生成;从 `/api/chart` 拿会是精确路径,数值全错,而且 `json.dumps` 默认缩进会改写整个文件(这个文件是 indent=1、无结尾换行)。⑤ 重冻前先升 scoring 版本(scoring_service.py 在冻结身份里),否则冻结记录马上过期。⑥ 用脚本改文件时先算好内容再 `open(p, "w")`:一次写入失败把台账截成了 0 字节,靠 `git checkout` 恢复。⑦ Q4–15、Q28–31 还要改 functional_benefics.py、narayana_dasha.py、jaimini.py,留给第二批,单独重冻。
- `pre_work_check.py` 用 `/workspace/wt-153/.venv-annual` 跑,exit 0,六项全部 ok。
- PyJHora 对照第一次跑出总匹配 59%:本地基线按引擎默认岁差算(已改为 Raman),PyJHora 那边写死 Lahiri,所有经度差 1.446°。基线文件里写的是 `lahiri_assumed_by_skill`,没有任何检查。已改为两边显式传 `--ayanamsa`、基线记录引擎实际岁差、对不上就拒绝比较。以后对照前先看两边口径,任何「匹配率突然掉一大截」先查口径。
@@ -0,0 +1,118 @@
{
"record_version": "reported-offset-native-candidate-date-v3",
"frozen_at_utc": "2026-11-04T14:39:15.468537+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": "b9786fca4ea6177177f4817b9711e9109b1e65151fc751274575dc83c4c95739",
"implementation_sha256_prefix": "b9786fca4ea61771",
"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": "5cacff2855a6fbc98c09246c9a5e5d7d0fc9050ee7b2910e5aa413f420c78ae9",
"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": "49235e50585a2ae1aa3e15016c3711abe4e975d33d5d082d7234abf81f088697",
"file_sha256": {
"scripts/active_rectification_event_engine.py": "dced0b398ad90bdec59c743a55ffe01613306127c17a1e44c8c9cfb569c57841",
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
"scripts/ashtakavarga.py": "c524da3f54b2ed9c080b78b33854854a0ca3d5d79b7e536bb1c3bc2be3e02852",
"scripts/dasha_analyzer.py": "3949b96813217fe624899856afec9f0b787c4cb0fea3a9a0d961990dbd11943a",
"scripts/divisional_charts_extended.py": "b13ad68c45685568d6eb17f87017624a9288e31fad74662735cd6d6564f7755d",
"scripts/domain_calculation_service.py": "66923a2bc69daf65c965d2973c4b9234edbec5147909eaf3609b6b377ce3c7ca",
"scripts/functional_benefics.py": "3ea76805fa6b710b12589f5bd996fcba3a2a8eea2bf65a701ecead64930cc114",
"scripts/jaimini.py": "e474b3a1d5c50de87fafdbdcc3df9bd724de004aa2495463763f5b2688b8f5e2",
"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": "116628437b07b1a57b2b0710c714ef90844635156a195140e4be82dafe8d339c",
"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": "919794a75a257b8d43b60b81a7da61a39406e19dc62ecf0135c8c0a2bce5f20b",
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
"scripts/research/reported_offset_sweep.py": "10a3fb7bf8639e4ffcaa4b2231a6fc748a3afaea2581ef65a9f799d19c36da1f",
"scripts/research/sealed_holdout_rerun.py": "9aea8030889c5ea691ead93f47d37cfd9ee7b152f39bfbf0494d8d0820b9ec62",
"scripts/shadbala.py": "f72ed22f0c543fd5381c56f82f430ceb5129079ac023c8fadaec85593b8d6fa5",
"scripts/varga.py": "6af031be1701a1bef8d48b73e8107d3d9729100f379535032924f43350af60e6"
},
"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": "10a3fb7bf8639e4ffcaa4b2231a6fc748a3afaea2581ef65a9f799d19c36da1f",
"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": "5cacff2855a6fbc98c09246c9a5e5d7d0fc9050ee7b2910e5aa413f420c78ae9",
"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": "49235e50585a2ae1aa3e15016c3711abe4e975d33d5d082d7234abf81f088697",
"file_sha256": {
"scripts/active_rectification_event_engine.py": "dced0b398ad90bdec59c743a55ffe01613306127c17a1e44c8c9cfb569c57841",
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
"scripts/ashtakavarga.py": "c524da3f54b2ed9c080b78b33854854a0ca3d5d79b7e536bb1c3bc2be3e02852",
"scripts/dasha_analyzer.py": "3949b96813217fe624899856afec9f0b787c4cb0fea3a9a0d961990dbd11943a",
"scripts/divisional_charts_extended.py": "b13ad68c45685568d6eb17f87017624a9288e31fad74662735cd6d6564f7755d",
"scripts/domain_calculation_service.py": "66923a2bc69daf65c965d2973c4b9234edbec5147909eaf3609b6b377ce3c7ca",
"scripts/functional_benefics.py": "3ea76805fa6b710b12589f5bd996fcba3a2a8eea2bf65a701ecead64930cc114",
"scripts/jaimini.py": "e474b3a1d5c50de87fafdbdcc3df9bd724de004aa2495463763f5b2688b8f5e2",
"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": "116628437b07b1a57b2b0710c714ef90844635156a195140e4be82dafe8d339c",
"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": "919794a75a257b8d43b60b81a7da61a39406e19dc62ecf0135c8c0a2bce5f20b",
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
"scripts/research/reported_offset_sweep.py": "10a3fb7bf8639e4ffcaa4b2231a6fc748a3afaea2581ef65a9f799d19c36da1f",
"scripts/research/sealed_holdout_rerun.py": "9aea8030889c5ea691ead93f47d37cfd9ee7b152f39bfbf0494d8d0820b9ec62",
"scripts/shadbala.py": "f72ed22f0c543fd5381c56f82f430ceb5129079ac023c8fadaec85593b8d6fa5",
"scripts/varga.py": "6af031be1701a1bef8d48b73e8107d3d9729100f379535032924f43350af60e6"
},
"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-11-04T14:39:15.362232+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": "b9786fca4ea6177177f4817b9711e9109b1e65151fc751274575dc83c4c95739",
"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": "9aea8030889c5ea691ead93f47d37cfd9ee7b152f39bfbf0494d8d0820b9ec62",
"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
@@ -132,8 +132,11 @@ const diagnosticReport = JSON.parse(readFileSync(
// 原值(17):docs/research/sealed_holdout_rerun_d30_venus_2026_11_04.json
// 新值(17):docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.json
// 原因(17):#166 占星师裁定(BUG-1581~1589)改了 shadbala.py、jaimini.py、varga.py、divisional_charts_extended.py,scoring-14;冻结身份变了、20 条回放 3 条变(影子头名率 0.45 → 0.40),ERR-110 另存新记录。影子重跑不是发布指标,确认门行为与阈值不变。
// 原值(18):docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.json
// 新值(18):docs/research/sealed_holdout_rerun_astrologer_166b_2026_11_04.json
// 原因(18):#166 第二批(BUG-1590~1598)改了 functional_benefics.py、jaimini.py、narayana_dasha.py、shadbala.py、varga.py,scoring-15;20 条回放与上一份逐条相同,ERR-110 另存新记录。确认门行为与阈值不变。
const currentTreeRerun = JSON.parse(readFileSync(
new URL("../../docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.json", import.meta.url),
new URL("../../docs/research/sealed_holdout_rerun_astrologer_166b_2026_11_04.json", import.meta.url),
"utf8",
)) as {
frozen_record: { implementation_sha256: string };
@@ -288,9 +291,10 @@ test("sealed holdout aggregates match the v3 report and still block confirmation
// 原值(14):…moon_paksha_2026_11_04.json / 新值(14):…audit_wave2_2026_11_04.json / 原因(14):数据核对第二波 BUG-1560 / 1561、1566 / 1567、1270 / 1576 改了冻结身份文件,输出不变,ERR-110 在合并后的代码上另存新记录(audit_g / h / j 为中间记录)。
// 原值(15):…audit_wave2_2026_11_04.json / 新值(15):…d30_venus_2026_11_04.json / 原因(15):BUG-1560 / BUG-1570 与 scoring-13 重新冻结(ERR-110,产品 2026-11-04 决定),影子回放 3 / 20 条变。
// 原值(16):…d30_venus_2026_11_04.json / 新值(16):…astrologer_166_2026_11_04.json / 原因(16):#166 占星师裁定与 scoring-14 重新冻结(ERR-110,产品 2026-11-04 决定),影子回放 3 / 20 条变。
// 原值(17):…astrologer_166_2026_11_04.json / 新值(17):…astrologer_166b_2026_11_04.json / 原因(17):#166 第二批与 scoring-15 重新冻结(ERR-110),影子回放 20 条不变。
assert.equal(
productHoldout.current_tree_scorer.source_report,
"docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.json",
"docs/research/sealed_holdout_rerun_astrologer_166b_2026_11_04.json",
);
assert.equal(currentTreeRerun.official_valid_independent_blind, false);
assert.equal(productHoldout.current_tree_scorer.matches_metrics_scorer, false);
+45 -45
View File
@@ -24,7 +24,7 @@
"evaluated_on": "2026-07-21"
},
"current_tree_scorer": {
"implementation_sha256": "cbb8807b91e3592b9d17aa0f3f53114e182ba97cf1eb2f7dd283ad49b9021ba9",
"implementation_sha256": "b9786fca4ea6177177f4817b9711e9109b1e65151fc751274575dc83c4c95739",
"extended_identity": {
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
"production_scoring_files": [
@@ -52,7 +52,7 @@
"scripts/shadbala.py",
"scripts/varga.py"
],
"production_scoring_sha256": "36e02d7996b9941fff8f9398c167f4f437e67d21048e0755edcefc5263e03ffa",
"production_scoring_sha256": "5cacff2855a6fbc98c09246c9a5e5d7d0fc9050ee7b2910e5aa413f420c78ae9",
"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": "e5ac948d574dd3b9a1a78b2f74126f3c9b8b30d7397177dd4f332f6b2a63b2a0",
"research_implementation_sha256": "49235e50585a2ae1aa3e15016c3711abe4e975d33d5d082d7234abf81f088697",
"file_sha256": {
"scripts/active_rectification_event_engine.py": "dced0b398ad90bdec59c743a55ffe01613306127c17a1e44c8c9cfb569c57841",
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
@@ -70,14 +70,14 @@
"scripts/dasha_analyzer.py": "3949b96813217fe624899856afec9f0b787c4cb0fea3a9a0d961990dbd11943a",
"scripts/divisional_charts_extended.py": "b13ad68c45685568d6eb17f87017624a9288e31fad74662735cd6d6564f7755d",
"scripts/domain_calculation_service.py": "66923a2bc69daf65c965d2973c4b9234edbec5147909eaf3609b6b377ce3c7ca",
"scripts/functional_benefics.py": "f2c0b25cf0b112584ed54dada3c1403eb2f73760a9935719f023a17fb17ee867",
"scripts/jaimini.py": "cb5dc686e3bcb319e26a08f2e5cc0d81bd583a29a2a3940a845f790e1d66b86a",
"scripts/functional_benefics.py": "3ea76805fa6b710b12589f5bd996fcba3a2a8eea2bf65a701ecead64930cc114",
"scripts/jaimini.py": "e474b3a1d5c50de87fafdbdcc3df9bd724de004aa2495463763f5b2688b8f5e2",
"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": "9a847d3b8d05f90d4f275079c97af1f71e83a74f930e14bd8f3f37b293d91d1e",
"scripts/narayana_dasha.py": "116628437b07b1a57b2b0710c714ef90844635156a195140e4be82dafe8d339c",
"scripts/rectification/api_service.py": "089730097d3872a4f7b5d7dd5574bb7e9ab4d2e246d4a380800bc824d7979b95",
"scripts/rectification/candidate_contrast.py": "eee7da71c0574a08876404b78ca111153fa95fb83ace82b9fdca141d1992e273",
"scripts/rectification/candidate_window.py": "2fbc5058b12049b15fca375cdc125b8283e19f9f3e4bedcc291e344501891bef",
@@ -87,20 +87,20 @@
"scripts/rectification/decision_policy.py": "80e8de4680d19a052213bb821d2a9c94143a2962235aeb27f6ad81374d2e60d5",
"scripts/rectification/event_probes.py": "f5ca9d54501f67a1546fcf5b01da0c1277dec2e2c6df481884e8900d14909a7c",
"scripts/rectification/refinement_packet.py": "dbeea5aa780889785ce850f3881e8b7f67bb44594e9bc382c65b2e730884a2f4",
"scripts/rectification/scoring_service.py": "d1b27d1717c20aaef6c8a083388b1fabad1dc10c6a110286abb631c1c39abb0d",
"scripts/rectification/scoring_service.py": "919794a75a257b8d43b60b81a7da61a39406e19dc62ecf0135c8c0a2bce5f20b",
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
"scripts/research/reported_offset_sweep.py": "daf7521278eeb3776e6d503921b06ecc6151864c1a8530fca15ef84c0322c37c",
"scripts/research/sealed_holdout_rerun.py": "1089e578c3a280fe026b06c49df46b2358d3e3ef8eb92f756e90c9e9b850f6cb",
"scripts/shadbala.py": "abd753de45047c896fc9647bebcfd28c7426d870495e60c6b4d184973970db30",
"scripts/varga.py": "9060d4073e9f70103cd663fdb81b86f4003925b75dbbd0c9c5d4bc9610a4ccc6"
"scripts/research/reported_offset_sweep.py": "10a3fb7bf8639e4ffcaa4b2231a6fc748a3afaea2581ef65a9f799d19c36da1f",
"scripts/research/sealed_holdout_rerun.py": "9aea8030889c5ea691ead93f47d37cfd9ee7b152f39bfbf0494d8d0820b9ec62",
"scripts/shadbala.py": "f72ed22f0c543fd5381c56f82f430ceb5129079ac023c8fadaec85593b8d6fa5",
"scripts/varga.py": "6af031be1701a1bef8d48b73e8107d3d9729100f379535032924f43350af60e6"
},
"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_astrologer_166_2026_11_04.json",
"source_report": "docs/research/sealed_holdout_rerun_astrologer_166b_2026_11_04.json",
"fixed_protocol_rerun_trial_count": 20,
"fixed_protocol_rerun_hash_matches": true,
"metrics": {
@@ -114,9 +114,9 @@
},
"current_tree_fixed_protocol_rerun": {
"evaluated_on": "2026-11-04",
"report_path": "docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.json",
"freeze_record_path": "docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.freeze.json",
"implementation_sha256": "cbb8807b91e3592b9d17aa0f3f53114e182ba97cf1eb2f7dd283ad49b9021ba9",
"report_path": "docs/research/sealed_holdout_rerun_astrologer_166b_2026_11_04.json",
"freeze_record_path": "docs/research/sealed_holdout_rerun_astrologer_166b_2026_11_04.freeze.json",
"implementation_sha256": "b9786fca4ea6177177f4817b9711e9109b1e65151fc751274575dc83c4c95739",
"extended_identity": {
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
"production_scoring_files": [
@@ -144,7 +144,7 @@
"scripts/shadbala.py",
"scripts/varga.py"
],
"production_scoring_sha256": "36e02d7996b9941fff8f9398c167f4f437e67d21048e0755edcefc5263e03ffa",
"production_scoring_sha256": "5cacff2855a6fbc98c09246c9a5e5d7d0fc9050ee7b2910e5aa413f420c78ae9",
"research_files": [
"scripts/research/reported_offset_sweep.py",
"scripts/research/cluster_width_lib.py",
@@ -154,7 +154,7 @@
"scripts/minute_rectification_fact_blind_eval_v4.py",
"scripts/minute_rectification_holdout_validator.py"
],
"research_implementation_sha256": "e5ac948d574dd3b9a1a78b2f74126f3c9b8b30d7397177dd4f332f6b2a63b2a0",
"research_implementation_sha256": "49235e50585a2ae1aa3e15016c3711abe4e975d33d5d082d7234abf81f088697",
"file_sha256": {
"scripts/active_rectification_event_engine.py": "dced0b398ad90bdec59c743a55ffe01613306127c17a1e44c8c9cfb569c57841",
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
@@ -162,14 +162,14 @@
"scripts/dasha_analyzer.py": "3949b96813217fe624899856afec9f0b787c4cb0fea3a9a0d961990dbd11943a",
"scripts/divisional_charts_extended.py": "b13ad68c45685568d6eb17f87017624a9288e31fad74662735cd6d6564f7755d",
"scripts/domain_calculation_service.py": "66923a2bc69daf65c965d2973c4b9234edbec5147909eaf3609b6b377ce3c7ca",
"scripts/functional_benefics.py": "f2c0b25cf0b112584ed54dada3c1403eb2f73760a9935719f023a17fb17ee867",
"scripts/jaimini.py": "cb5dc686e3bcb319e26a08f2e5cc0d81bd583a29a2a3940a845f790e1d66b86a",
"scripts/functional_benefics.py": "3ea76805fa6b710b12589f5bd996fcba3a2a8eea2bf65a701ecead64930cc114",
"scripts/jaimini.py": "e474b3a1d5c50de87fafdbdcc3df9bd724de004aa2495463763f5b2688b8f5e2",
"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": "9a847d3b8d05f90d4f275079c97af1f71e83a74f930e14bd8f3f37b293d91d1e",
"scripts/narayana_dasha.py": "116628437b07b1a57b2b0710c714ef90844635156a195140e4be82dafe8d339c",
"scripts/rectification/api_service.py": "089730097d3872a4f7b5d7dd5574bb7e9ab4d2e246d4a380800bc824d7979b95",
"scripts/rectification/candidate_contrast.py": "eee7da71c0574a08876404b78ca111153fa95fb83ace82b9fdca141d1992e273",
"scripts/rectification/candidate_window.py": "2fbc5058b12049b15fca375cdc125b8283e19f9f3e4bedcc291e344501891bef",
@@ -179,13 +179,13 @@
"scripts/rectification/decision_policy.py": "80e8de4680d19a052213bb821d2a9c94143a2962235aeb27f6ad81374d2e60d5",
"scripts/rectification/event_probes.py": "f5ca9d54501f67a1546fcf5b01da0c1277dec2e2c6df481884e8900d14909a7c",
"scripts/rectification/refinement_packet.py": "dbeea5aa780889785ce850f3881e8b7f67bb44594e9bc382c65b2e730884a2f4",
"scripts/rectification/scoring_service.py": "d1b27d1717c20aaef6c8a083388b1fabad1dc10c6a110286abb631c1c39abb0d",
"scripts/rectification/scoring_service.py": "919794a75a257b8d43b60b81a7da61a39406e19dc62ecf0135c8c0a2bce5f20b",
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
"scripts/research/reported_offset_sweep.py": "daf7521278eeb3776e6d503921b06ecc6151864c1a8530fca15ef84c0322c37c",
"scripts/research/sealed_holdout_rerun.py": "1089e578c3a280fe026b06c49df46b2358d3e3ef8eb92f756e90c9e9b850f6cb",
"scripts/shadbala.py": "abd753de45047c896fc9647bebcfd28c7426d870495e60c6b4d184973970db30",
"scripts/varga.py": "9060d4073e9f70103cd663fdb81b86f4003925b75dbbd0c9c5d4bc9610a4ccc6"
"scripts/research/reported_offset_sweep.py": "10a3fb7bf8639e4ffcaa4b2231a6fc748a3afaea2581ef65a9f799d19c36da1f",
"scripts/research/sealed_holdout_rerun.py": "9aea8030889c5ea691ead93f47d37cfd9ee7b152f39bfbf0494d8d0820b9ec62",
"scripts/shadbala.py": "f72ed22f0c543fd5381c56f82f430ceb5129079ac023c8fadaec85593b8d6fa5",
"scripts/varga.py": "6af031be1701a1bef8d48b73e8107d3d9729100f379535032924f43350af60e6"
},
"hash_scope": "explicit_identity_file_sets_not_a_transitive_dependency_lock"
},
@@ -201,15 +201,15 @@
"verified_minute_claim_allowed": false,
"metric_gates_passed": false,
"events_per_case": 3,
"boundary": "Previously exposed v3 shadow fixed-protocol rerun after the #166 astrologer rulings 2026-11-04, product decision (BUG-1581..1589): scripts/shadbala.py Sthana / Drik follow the named BPHS version (Saptavargaja 45/30/20/15/10/4/2, Moolatrikona Moon 3 / Mercury 15 deg, whole-sign Kendradi, BPHS 26.9-12 special aspects, Mercury malefic with any natural malefic; Moon Paksha option C and Sun Ayana A + A do not enter scoring), scripts/jaimini.py Arudha 1/7 exception counts from the first-count pada, scripts/varga.py and scripts/divisional_charts_extended.py D30 degree proportional within the unequal span; scoring identity rectification-v5-matrix-scoring-14 (ERR-110). Versus the 2026-11-04 d30_venus_2026_11_04 report, 3 of 20 trials changed (case 6 true_rank 8 -> 4, case 16 13 -> 11, case 20 1 -> 8 with minute error 10 -> 8); top_1_rate 0.45 -> 0.4, top_3_rate 0.5 -> 0.45, mean_absolute_minute_error 7.05 -> 6.95. Versus the 2026-09-20 historical report, changed_trial_count is 10. Not a release metric. No tuning. Prior reports and freezes preserved byte-for-byte.",
"report_sha256": "cfe483e6ce730ccaff519281722c8d701b443a12264da8771e2156a0a7062150",
"freeze_record_sha256": "42093ef337c5fa9cc9a28841c15596feb653449433c066d53757fa061294d145",
"replay_started_at_utc": "2026-11-04T13:08:03.728334+00:00",
"replay_finished_at_utc": "2026-11-04T13:08:06.017597+00:00",
"boundary": "Previously exposed v3 shadow fixed-protocol rerun after the #166 astrologer rulings batch 2, 2026-11-04 (BUG-1590..1598): scripts/functional_benefics.py makes Gemini Saturn (8, 9) and Virgo Saturn (5, 6) mixed; scripts/jaimini.py Chara Dasha both Scorpio / Aquarius lords in the sign fixed at 12 years; scripts/narayana_dasha.py counts only the nine grahas as occupants and reports the effective adjustment; scripts/shadbala.py and scripts/varga.py add method labels only; scoring identity rectification-v5-matrix-scoring-15 (ERR-110). Versus the 2026-11-04 astrologer_166_2026_11_04 report, all 20 trials and metrics are identical. Versus the 2026-09-20 historical report, changed_trial_count is 10. Not a release metric. No tuning. Prior reports and freezes preserved byte-for-byte.",
"report_sha256": "14e5ecad6bbaaca58b8dc6cddc247f7863245c15ce5829bb6a007a1aede2a006",
"freeze_record_sha256": "5e6326c141a3ef94199e4dc9d17c774ada66e395403836a955244e4324ec4a1a",
"replay_started_at_utc": "2026-11-04T14:39:18.494939+00:00",
"replay_finished_at_utc": "2026-11-04T14:39:20.935019+00:00",
"previous_fixed_protocol_rerun": {
"report_path": "docs/research/sealed_holdout_rerun_d30_venus_2026_11_04.json",
"freeze_record_path": "docs/research/sealed_holdout_rerun_d30_venus_2026_11_04.freeze.json",
"superseded_reason": "#166 astrologer rulings 2026-11-04, product decision (BUG-1581..1589): scripts/shadbala.py Sthana / Drik follow the named BPHS version (Saptavargaja 45/30/20/15/10/4/2, Moolatrikona Moon 3 / Mercury 15 deg, whole-sign Kendradi, BPHS 26.9-12 special aspects, Mercury malefic with any natural malefic; Moon Paksha option C and Sun Ayana A + A do not enter scoring), scripts/jaimini.py Arudha 1/7 exception counts from the first-count pada, scripts/varga.py and scripts/divisional_charts_extended.py D30 degree proportional within the unequal span; scoring identity rectification-v5-matrix-scoring-14 changed frozen identity files and the replay output, so ERR-110 stored a new record. Prior d30_venus_2026_11_04 report and freeze preserved byte-for-byte."
"report_path": "docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.json",
"freeze_record_path": "docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.freeze.json",
"superseded_reason": "#166 astrologer rulings batch 2, 2026-11-04 (BUG-1590..1598): scripts/functional_benefics.py makes Gemini Saturn (8, 9) and Virgo Saturn (5, 6) mixed; scripts/jaimini.py Chara Dasha both Scorpio / Aquarius lords in the sign fixed at 12 years; scripts/narayana_dasha.py counts only the nine grahas as occupants and reports the effective adjustment; scripts/shadbala.py and scripts/varga.py add method labels only; scoring identity rectification-v5-matrix-scoring-15 changed frozen identity files; the sealed replay output is unchanged, and ERR-110 stored a new record. Prior astrologer_166_2026_11_04 report and freeze preserved byte-for-byte."
}
},
"previous_fixed_protocol_rerun": {
@@ -330,25 +330,25 @@
"verified_minute_claim_allowed": false
},
"current_tree_reported_offset_replay": {
"report_path": "docs/research/reported_offset_astrologer_166_2026_11_04.json",
"report_sha256": "62ec098f1ece6d69826c52e2e6fc44af4d5b6c401d3934dfca7367699ebf5873",
"freeze_record_path": "docs/research/reported_offset_astrologer_166_2026_11_04.freeze.json",
"freeze_record_sha256": "0fbdeb89799b70655b89633fd649c7e7a7d66a39d9a7e557f007f7d570f3b3cf",
"report_path": "docs/research/reported_offset_astrologer_166b_2026_11_04.json",
"report_sha256": "8f195b6ffa258cf55372792c1f4536c77cab96f6abcf31f1e50c54dafd9185ca",
"freeze_record_path": "docs/research/reported_offset_astrologer_166b_2026_11_04.freeze.json",
"freeze_record_sha256": "c9bc41bb89ee5077d1c7952124bf1a9a9f15ec0cd19449cb2efe003559fc59fb",
"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-11-04T13:08:03.745110+00:00",
"replay_finished_at_utc": "2026-11-04T13:11:24.695538+00:00",
"boundary": "Previously exposed reported-offset sensitivity after the #166 astrologer rulings 2026-11-04, product decision (BUG-1581..1589): scripts/shadbala.py Sthana / Drik follow the named BPHS version (Saptavargaja 45/30/20/15/10/4/2, Moolatrikona Moon 3 / Mercury 15 deg, whole-sign Kendradi, BPHS 26.9-12 special aspects, Mercury malefic with any natural malefic; Moon Paksha option C and Sun Ayana A + A do not enter scoring), scripts/jaimini.py Arudha 1/7 exception counts from the first-count pada, scripts/varga.py and scripts/divisional_charts_extended.py D30 degree proportional within the unequal span; scoring identity rectification-v5-matrix-scoring-14 (ERR-110). Versus the 2026-11-04 d30_venus_2026_11_04 report, 316 of 900 trials changed (true_rank better 122, worse 139); top-1 hits at +-15/30/60 stay 4/3/0 of 300 and top-3 stays 30/34/29; delivery coverage at +-15 219 -> 220, unchanged at 30 and 60; mean top-1 minute error 19.51 -> 20.87. Versus the 2026-09-20 historical report, changed_trial_count is 727 of 900. Not a release metric. No tuning. Prior reports and freezes preserved byte-for-byte.",
"replay_started_at_utc": "2026-11-04T14:39:18.486257+00:00",
"replay_finished_at_utc": "2026-11-04T14:42:03.179356+00:00",
"boundary": "Previously exposed reported-offset sensitivity after the #166 astrologer rulings batch 2, 2026-11-04 (BUG-1590..1598): scripts/functional_benefics.py makes Gemini Saturn (8, 9) and Virgo Saturn (5, 6) mixed; scripts/jaimini.py Chara Dasha both Scorpio / Aquarius lords in the sign fixed at 12 years; scripts/narayana_dasha.py counts only the nine grahas as occupants and reports the effective adjustment; scripts/shadbala.py and scripts/varga.py add method labels only; scoring identity rectification-v5-matrix-scoring-15 (ERR-110). Versus the 2026-11-04 astrologer_166_2026_11_04 report, 114 of 900 trials changed; top-1 hits at +-15/30/60 stay 4/3/0 of 300; top-3 30/34/29 -> 31/34/30; delivery coverage at +-15 220 -> 219, unchanged at 30 and 60; mean top-1 minute error 20.87 -> 20.52. Versus the 2026-09-20 historical report, changed_trial_count is 731 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_d30_venus_2026_11_04.json",
"report_sha256": "d67cd503ca51d519ddfd7b2a924055131cc9c95a71cedcd512f0843103441b1a",
"freeze_record_path": "docs/research/reported_offset_d30_venus_2026_11_04.freeze.json",
"freeze_record_sha256": "5d584c71a94b9139fe95b7c9083a07b65b93285dd72384d77802f93a0fb08c69",
"superseded_reason": "#166 astrologer rulings 2026-11-04, product decision (BUG-1581..1589): scripts/shadbala.py Sthana / Drik follow the named BPHS version (Saptavargaja 45/30/20/15/10/4/2, Moolatrikona Moon 3 / Mercury 15 deg, whole-sign Kendradi, BPHS 26.9-12 special aspects, Mercury malefic with any natural malefic; Moon Paksha option C and Sun Ayana A + A do not enter scoring), scripts/jaimini.py Arudha 1/7 exception counts from the first-count pada, scripts/varga.py and scripts/divisional_charts_extended.py D30 degree proportional within the unequal span; scoring identity rectification-v5-matrix-scoring-14 changed frozen identity files and the replay output, so ERR-110 stored a new record. Prior d30_venus_2026_11_04 report and freeze preserved byte-for-byte."
"report_path": "docs/research/reported_offset_astrologer_166_2026_11_04.json",
"report_sha256": "62ec098f1ece6d69826c52e2e6fc44af4d5b6c401d3934dfca7367699ebf5873",
"freeze_record_path": "docs/research/reported_offset_astrologer_166_2026_11_04.freeze.json",
"freeze_record_sha256": "0fbdeb89799b70655b89633fd649c7e7a7d66a39d9a7e557f007f7d570f3b3cf",
"superseded_reason": "#166 astrologer rulings batch 2, 2026-11-04 (BUG-1590..1598): scripts/functional_benefics.py makes Gemini Saturn (8, 9) and Virgo Saturn (5, 6) mixed; scripts/jaimini.py Chara Dasha both Scorpio / Aquarius lords in the sign fixed at 12 years; scripts/narayana_dasha.py counts only the nine grahas as occupants and reports the effective adjustment; scripts/shadbala.py and scripts/varga.py add method labels only; scoring identity rectification-v5-matrix-scoring-15 changed frozen identity files and the replay output, so ERR-110 stored a new record. Prior astrologer_166_2026_11_04 report and freeze preserved byte-for-byte."
}
},
"previous_reported_offset_replay": {
+5 -2
View File
@@ -51,8 +51,11 @@ MINUTE_STEP = 1
# 原值: docs/research/reported_offset_d30_venus_2026_11_04.{freeze.json,json}
# 新值: docs/research/reported_offset_astrologer_166_2026_11_04.{freeze.json,json}
# 原因: #166 占星师裁定(BUG-1581~1589,产品 2026-11-04 决定交付)改了 shadbala.py、jaimini.py、varga.py、divisional_charts_extended.py,校正身份升到 scoring-14;ERR-110 另存新记录
FREEZE = ROOT / "docs/research/reported_offset_astrologer_166_2026_11_04.freeze.json"
REPORT = ROOT / "docs/research/reported_offset_astrologer_166_2026_11_04.json"
# 原值: docs/research/reported_offset_astrologer_166_2026_11_04.{freeze.json,json}
# 新值: docs/research/reported_offset_astrologer_166b_2026_11_04.{freeze.json,json}
# 原因: #166 第二批(BUG-1590~1598)改了 functional_benefics.py、jaimini.py、narayana_dasha.py、shadbala.py、varga.py,校正身份升到 scoring-15;ERR-110 另存新记录
FREEZE = ROOT / "docs/research/reported_offset_astrologer_166b_2026_11_04.freeze.json"
REPORT = ROOT / "docs/research/reported_offset_astrologer_166b_2026_11_04.json"
LEGACY_REPORT = ROOT / "docs/research/reported_offset_2026_09_20.json"
+5 -2
View File
@@ -48,8 +48,11 @@ DATASET = ROOT / "references/real_case_calibration/minute_rectification_holdout_
# 原值: docs/research/sealed_holdout_rerun_d30_venus_2026_11_04.{freeze.json,json}
# 新值: docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.{freeze.json,json}
# 原因: #166 占星师裁定(BUG-1581~1589,产品 2026-11-04 决定交付)改了 shadbala.py、jaimini.py、varga.py、divisional_charts_extended.py,校正身份升到 scoring-14;ERR-110 另存新记录
FREEZE = ROOT / "docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.freeze.json"
REPORT = ROOT / "docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.json"
# 原值: docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04.{freeze.json,json}
# 新值: docs/research/sealed_holdout_rerun_astrologer_166b_2026_11_04.{freeze.json,json}
# 原因: #166 第二批(BUG-1590~1598)改了 functional_benefics.py、jaimini.py、narayana_dasha.py、shadbala.py、varga.py,校正身份升到 scoring-15;ERR-110 另存新记录
FREEZE = ROOT / "docs/research/sealed_holdout_rerun_astrologer_166b_2026_11_04.freeze.json"
REPORT = ROOT / "docs/research/sealed_holdout_rerun_astrologer_166b_2026_11_04.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 = [
@@ -94,6 +94,10 @@ IDENTITY_FORBIDDEN_PREFIXES = (
# 原因: #166 占星师裁定(BUG-1581~1589,产品 2026-11-04 决定交付)改了 shadbala.py、jaimini.py、varga.py、divisional_charts_extended.py,scoring-14,冻结身份与回放结果都变了,ERR-110 另存新记录
"docs/research/sealed_holdout_rerun_astrologer_166_2026_11_04",
"docs/research/reported_offset_astrologer_166_2026_11_04",
# 原值: 排除到 astrologer_166_2026_11_04;新值: 再排除 astrologer_166b_2026_11_04(追加)
# 原因: #166 第二批(BUG-1590~1598)改了 functional_benefics.py、jaimini.py、narayana_dasha.py、shadbala.py、varga.py,scoring-15,ERR-110 另存新记录
"docs/research/sealed_holdout_rerun_astrologer_166b_2026_11_04",
"docs/research/reported_offset_astrologer_166b_2026_11_04",
"docs/research/history/",
"artifacts/",
)