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
12 KiB
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.jsondocs/research/sealed_holdout_rerun_ephemeris_nutation_2026_10_08.jsondocs/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 test4992 项、失败 24,与基线逐名相同;tsc 0。