Files
Jyotisha/docs/tasks/PROGRESS-ephemeris-nutation-20261008.md
T
Jesse_ChenandClaude Opus 5.5 db0134f9db
Independent Staging Quality Gate / validate (push) Successful in 16m45s
Independent Staging Quality Gate / publish (push) Successful in 4m25s
test(ephemeris): move the expectations BUG-1275 shifts and regenerate three goldens
The nutation branch left the quick gate red: eight expectations still encoded
the mean-ayanamsa frame (dasha boundaries two days late, a solar-return frame
gap that was the bug itself, a 0.01 Kala drift from frozen sidereal fixtures)
and three goldens were never regenerated. Python full suite is back to the
baseline list; quick gate passes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-08 22:28:09 +08:00

12 KiB
Raw Blame History

PROGRESS · 恒星黄道章动(2026-10-08)

工作树:G:\Ferti\Jyotisha\.worktrees\ephemeris-nutation-20261008。分支 codex/ephemeris-nutation-20261008。开工 HEAD 1a8c97f6。没有 upstream。未推送,未做 HEAD:staging,未改 .gitea/workflows,未提升 main,未动主检出。未核对 /api/health。

开工预检

python scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45 退出码 1,用时 144.42 秒。JSON 状态 fail。远端可见。碎片扫描 90 秒超时,定向测试 45 秒超时。外部适配器正常。本机没有仓库 .venv(.venv/bin/python 与 .venv/Scripts/python.exe 均为 WinError 2)。解释器是 C:\Users\74082\anaconda3\python.exe 3.11.7。超时退出不算通过。没有另建镜像,没有放宽断言。

T0 调用点

调用点 开工分类 处理
_sidereal_calculation_profile 的 mean 一致 保持 FLG_NONUT
同函数 apparent 一致 保持真岁差
同函数 legacy 的 get_ayanamsa 不一致 改为与 apparent 相同的 get_ayanamsa_ex_ut。不新增第四档
_calc_sidereal_planets_for_jd 不一致 真岁差,与 FLG_SIDEREAL 一致。这是产品默认路径
compute_chart_data 上升、宫头、行星 不一致 同一个真岁差。宫位仍用 houses(..., b'A')。速度仍取热带,避免岁差变化率改动逆行判断
引擎约 13006 不一致,下一行覆盖 删掉死赋值
cmd_double_transit_pac 不一致 真岁差,并用同一套 flags
_calc_transit_lon 不一致 真岁差
政策字段约 13620、13805 标签 记录的数字改为真岁差,避免和经度框架不一致
cmd_planetary_congregation 不一致 真岁差
全盘约 16519、16738,cmd_nakshatra_adv.py,consultation_native_layers.py 经共享函数,原先不一致 随 _calc_sidereal_planets_for_jd 一致
全盘 houses_ex(..., b"R") 宫头已是 FLG_SIDEREAL;行星和上升来自有偏差的盘 宫制仍是 sripati / b"R"。盘修好后相对误差消失
cmd_bhava_chalit 读取的 MC 随函数返回的岁差 返回值改为真岁差后一致
bhava_chalit._cusps_swe 不一致 真岁差。只影响 Placidus / Koch
domain_calculation_service.compute_chart 经 compute_chart_data 修好后一致
compute_transit_longitude 不一致 真岁差。calc_ut 的 flags 未改
daily_guidance_service._moon_transit 不一致 真岁差
shadbala 宫头 已是 FLG_SIDEREAL,一致 不改。Dig 短弧仍是 BUG-1270,不在本轮
shadbala 的 ayanamsa_degrees 标签是平岁差 改记真岁差
western_chart_engine.py 不适用(热带;岁差只作显示偏移) 不改
kp_cusp_observation.py 不一致(展示,不计分) 真岁差
validate_yoga_accuracy.py 上升 不一致(校验脚本) 上升改为真岁差;行星本来就是 FLG_SIDEREAL
muhurta 固定 23.85 不适用 不改
solar_return.py、ephemeris_events.py、native_special_lagnas.py 已是 FLG_SIDEREAL,一致 不改
calculate_hora_lagna / calculate_ghati_lagna / calculate_bhava_lagna 红线 不改
供应商树与基准脚本里的 get_ayanamsa 不适用 不改

Windows 上 inspect.signature(swe.houses_ex) 会 ValueError。没有去包这个签名。产品盘用热带 houses 减去与行星相同标志的真岁差。四盘、三种岁差下,未取整的等宫宫头与 houses_ex 的 FLG_SIDEREAL 差在 1e-6° 内。

度数差

相对旧公式(热带视位置减 get_ayanamsa),四张盘、Lahiri / Raman / KP 的最大绝对差是 0.005043°。章动范围约 −0.002279° 到 +0.005043°。回归要求的对照是 Swiss Ephemeris FLG_SIDEREAL,不是旧公式。tests/test_sidereal_nutation_frame.py 24 组(四盘 × 三种岁差 × 两种交点)九星 degree_raw 差 ≤ 1e-6°,退出码 0。

Vimshottari 月亮余额折成日(365.2425):乔布斯公开盘土星 +2.625 天;奥巴马公开盘月亮 −0.624 天;爱因斯坦公开盘水星 +1.926 天;虚构盘金星 +2.299 天。主星都没有换。

换座

四盘 × Lahiri / Raman / KP × 九星与上升:星座、星宿、D9、D10 都没有换。唯一分盘槽位变化是虚构盘在 Lahiri 下月亮的 D60。

PyJHora

离线生成器 scripts/research/freeze_sidereal_nutation_pyjhora_fixture.py 用本机 anaconda 里的 PyJHora 4.8.7。drik.planetary_positions 会 AttributeError(planet_list 是 dict,没有 index),所以冻结的是 drik.sidereal_longitude。pytest 只读 tests/fixtures/sidereal_nutation_pyjhora_487.json,不导入 jhora。真实交点下,引擎与冻结值的最大绝对差是 0.014454°(奥巴马公开盘的水星,三种岁差相同)。差来自 PyJHora 的真位置标志,不是 1e-6° 那条红线。产品运行时不导入 jhora。

算法身份

同一份公开烟测请求:12:00 由 8.5289 变为 8.5336,12:01 仍是 8.5242,12:02 由 8.0833 变为 8.088。身份升到 rectification-v5-matrix-scoring-12。策略仍是 policy-v4。记忆化 golden 新写 v5,v1–v4 逐字节保留。v4 sha256 8491093281fe9767defea1b46d325237f1a4c6c0d4f076b9a77f07b985b526c3。v5 的 source_commit 是章动修复提交 e5f2a75183381c4a027014c7f1e89ddcb8393bd3。

日期窗合同本来就是代数 ≥ 9。数据库守卫已是 scoring-(9|[1-9][0-9]+),没有新迁移。本机没有把 npm run test:db 当 SQL 证据(迁移符号链接)。scoring-11 历史记录在 scoring-12 下只读打开并可以再比(BUG-621)。没有加拒绝打开旧会话的门。

ERR-110

另存,不覆盖 sync6 记录:

  • docs/research/sealed_holdout_rerun_ephemeris_nutation_2026_10_08.freeze.json
  • docs/research/sealed_holdout_rerun_ephemeris_nutation_2026_10_08.json
  • docs/research/reported_offset_ephemeris_nutation_2026_10_08.freeze.json

影子 20 例相对 2026-09-20 历史报告 changed_trial_count 为 8。指标 top-1 0.5、top-3 0.5、平均绝对分钟误差 6.65。这不是发布指标,没有调参。合同 references/rectification_sealed_holdout.v1.json 的当前树指针改到这份记录;根上的历史 top_1_rate 0.15 与 status: not_ready 未改。

报偏移:900 例,退出码 0,约 911 秒。写出 docs/research/reported_offset_ephemeris_nutation_2026_10_08.json(sha256 b433a906280a5b12e4e48fd5e86292b73d21a627f490e3083d719aceea3252c9)和已有冻结文件(sha256 bc43921250cdcc160fb51d88ebcae0262d180e18c0ab2b14791605b09d639d39)。相对 2026-09-20 历史报告 changed_trial_count 581。sync6 那次是 235。没有调参。合同当前指针改到这份记录,sync6 放进该对象里的 previous_reported_offset_replay。根上原来的 batch1 指针留着。sync6 文件没有覆盖。

三栏

  • tests/test_cli_smoke.py 全盘第一段大运起点。原值 1952-03-19T20:24:47;新值 1952-03-22T11:42:07;原因:章动进入月亮经度后大运起点移动(BUG-1275)。
  • tests/test_rectification_engine_memoization.py、tests/test_dasha_transition_proximity_cross_midnight.py、tests/test_rectification_relative_support.py:当前身份 scoring-11 → scoring-12。原因:同输入分数变了(BUG-1275)。
  • frontend/tests/rectification-dated-algorithm-generation-20261002.test.ts:回执默认 scoring-12。另有一条 scoring-11 历史在 scoring-12 下只读打开(BUG-621)。
  • frontend/tests/rectification-engine-version-cross-midnight.test.ts:LIVE_CURRENT 改为 scoring-12。scoring-11 缓存不再当现行。
  • frontend/tests/rectification-midnight-date-anchor.test.ts:fixture 循环加上 scoring-12。文件由 midnight_date_anchor_regression.py --golden 用真实引擎写出,虚构请求。
  • frontend/tests/rectification-confirmation-gate.test.ts 与密封合同:当前冻结重跑路径从 sync6 改到 ephemeris_nutation_2026_10_08。
  • tests/test_sealed_holdout_contract_freshness.py:身份排除名单加上这两份新冻结路径。

报告、对话卡、日运、Bhava Chalit、Shadbala 的定向测试没有把旧平岁差经度钉死。上述集合通过后没有重写那些 JSON。

测试

命令 退出码
pytest tests/test_sidereal_nutation_frame.py tests/test_runtime_jhora_import_scan.py 0(30 通过)
pytest 记忆化、岁差四条路径、相对支持、跨午夜、Bhava、日运、星宿、KP 宫头观察 0
pytest 大运、cli 冒烟、Shadbala 完整、分盘、报告读者、密封合同、校正日期过渡、行运、条件大运、领域计算 1,仅 test_full_reading_accepts_second_and_preserves_birth_time_precision(旧大运起点)。改断言后单测退出码 0
前端 tsx --test:日期窗代数、跨午夜、午夜锚、确认门 0(55 通过,0 失败,0 取消)
pytest tests/test_reported_offset_research.py::test_recorded_specification_and_all_prespecified_cells tests/test_sealed_holdout_contract_freshness.py 0(10 通过)

Python 全量没有跑完。不把失败名单写成 Linux 62 的子集。已知 Windows 失败 tests/test_consultation_native_layers.py::test_the_new_layer_leaves_every_existing_output_unchanged 不是发布依据,本轮没有拿它当门。scripts/jyotish_api_server.py 没有加方法体。page.tsx 的 useState / useRef 没有增长。

快速门与 v5 若还在跑,见文末。

v5 九格

对照 sync6 已接受的九格(±10 / ±30 / ±60):先验头名 0.2078 / 0.1169 / 0.0909;六题回放 0.6104 / 0.5325 / 0.3117;线上区间回放 0.6623 / 0.5844 / 0.3896。

评测进程已结束,退出码 0,77 例。先验头名 top1:0.1948 / 0.1039 / 0.0779。六题回放 replay_top1:0.6364 / 0.5455 / 0.3766。线上区间回放 cluster_width 的 top1:0.6623 / 0.5325 / 0.3896。和已接受的九格相比,先验头名三格各下降 0.0130(1.3 个百分点);线上区间 ±30 由 0.5844 降到 0.5325(5.2 个百分点);线上区间 ±10 与 ±60 持平。六题回放三格上升(+0.0260 / +0.0130 / +0.0649)。按红线停下:不调参,不推送。JSON 在临时目录,不进仓库。

命令:C:\Users\74082\anaconda3\python.exe scripts/research/holdout_v5_baseline.py --dataset v5 --out-dir D:\Users\74082\AppData\Local\Temp\nutation-v5-20261008 --json-out D:\Users\74082\AppData\Local\Temp\nutation-v5-20261008\holdout_v5_baseline.json

日志:C:\Users\74082\.grok\sessions\G%3A%5CFerti%5CJyotisha%5C.worktrees%5Cephemeris-nutation-20261008\01a11af8-5880-78f1-be55-5fe3bf46523a\terminal\call-6ae2fd7a-997e-4a5a-abff-159b4b919895-104.log

代码与 scoring-12 落地后才启动。脚本的临时副本 references/real_case_calibration/_holdout_v5_baseline_tmp_minute_rectification_holdout_v5_all.json 不提交。

未完成

  • v5 77 例已结束,退出码 0。先验头名三格各降 1.3 个百分点,线上区间 ±30 降 5.2 个百分点。停下,不调参,不推送。BUG-1275 的 resolved 只覆盖经度修复。
  • 报偏移重放:已结束,见 ERR-110。581/900 与历史报告不同,没有调参。
  • 快速门:同一条命令已经结束,退出码 1。pytest 段 4 failed / 1059 passed / 1 skipped,用时 667.64 秒。两条记忆化失败是门禁进程读到的还是 PENDING_NUTATION_COMMIT;第二笔提交把 SOURCE_COMMIT 写成 e5f2a75183381c4a027014c7f1e89ddcb8393bd3 之后,tests/test_rectification_engine_memoization.py 再跑为 25 通过、退出码 0。test_consultation_native_layers.py::test_the_new_layer_leaves_every_existing_output_unchanged 是本机已知失败,不是发布依据。tests/test_double_transit_d9_targets.py::test_d1_and_chandra_lagna_layers_match_the_pre_fix_golden 仍对照章动修正前的相位度数,golden 没有重生成。这一条算未完成,不把快速门写成通过。
  • npm run test:db 未跑。SQL 守卫没有改。
  • 记忆化 v5 的 source_commit 已写成 e5f2a75183381c4a027014c7f1e89ddcb8393bd3。

Claude 验收与补修(2026-10-08)

  • 结论:通过(产品接受 v5 变化)。代码由 Claude 在 claude/nutation-merge-20261008 上补修后快进推 staging。
  • 独立核对:屏蔽 PyJHora 后,三张盘 × 三种岁差七星与 FLG_SIDEREAL 最大差 5.7e-14°。
  • Linux Python 全量:执行方分支 70 条失败,基线 62(另有 3 条 prashna 并行噪声);新增 8 条均为旧期望,已按 BUG-1275 验收补修逐条改(三栏见 Bug 历史)。快速门转绿。
  • npm test 4992 项、失败 24,与基线逐名相同;tsc 0。