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
126 lines
12 KiB
Markdown
126 lines
12 KiB
Markdown
# 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。
|