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

126 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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。