fix(ephemeris): include nutation in the sidereal frame
恒星黄道改为与 Swiss Ephemeris FLG_SIDEREAL 同一套含章动岁差。 产品默认路径不再用平岁差去减含章动的视位置。上升和宫头用同一个岁差。 校正身份升到 rectification-v5-matrix-scoring-12。 BUG-1275。未推送,未部署。v5 先验头名三格下降 1.3 个百分点,不调参。
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
# 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` 在章动修复提交之后写成该提交的 40 位 SHA。
|
||||
|
||||
日期窗合同本来就是代数 ≥ 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。
|
||||
|
||||
sweep 已打印(77 例,日志里的 `sweep done`)。先验头名 `top1`:0.1948 / 0.1039 / 0.0779。六题回放 `replay_top1`:0.6364 / 0.5455 / 0.3766。和已接受的九格相比,先验头名三格各下降 0.0130(1.3 个百分点),超过 1 个百分点。六题回放三格是上升(+0.0260 / +0.0130 / +0.0649)。按红线停下:不调参,不推送。线上区间回放(cluster width)落笔时还在跑,这一行仍是未跑完。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 例:先验头名三格已下降 1.3 个百分点,停下,不调参,不推送。线上区间回放未跑完。九格没有全部关闭。BUG-1275 的 resolved 只覆盖经度修复。
|
||||
- 报偏移重放:已结束,见 ERR-110。581/900 与历史报告不同,没有调参。
|
||||
- 快速门:`python scripts/run_quality_gate.py --profile quick` 已启动,用 anaconda,并带技能占位的 `NODE_OPTIONS`。日志 `C:\Users\74082\.grok\sessions\G%3A%5CFerti%5CJyotisha%5C.worktrees%5Cephemeris-nutation-20261008\01a11af8-5880-78f1-be55-5fe3bf46523a\terminal\call-fed60a7a-1a0e-4362-a6b9-147749990e50-156.log`。落笔时未结束,不写成通过。
|
||||
- `npm run test:db` 未跑。SQL 守卫没有改。
|
||||
- 记忆化 v5 的 `source_commit` 在章动修复提交之后写成该提交的 40 位 SHA。提交前仍是占位符。
|
||||
@@ -157,3 +157,5 @@ reported-offset:900 例,exit 0,约 804 秒。相对 2026-09-20 历史报
|
||||
| 抽查 | 乔布斯盘 D5/D6/D8/D11、Bhava/Hora/Ghati/Sree/Indu 上升与上游 `23be1807` 一致;Yogini 顺序与结构一致,首段余额差约 0.002 年(月亮约 17 角秒,属岁差细节) |
|
||||
| v5 全表 | 执行方「六题回放 ±10 下降 2.6、线上区间 ±60 下降 1.3」复核无误(列为 ±10 / ±30 / ±60)。全表:先验 +2.6 / +2.6 / +1.3;六题回放 −2.6 / +3.9 / 0;线上区间 0 / +2.6 / −1.3。9 格 5 升 2 平 2 降 |
|
||||
| 产品决定 | 2026-10-07 接受上述评测变化;门禁补修由 Claude 直接执行(分支 `codex/sync6-gate-fix-20261007`:重新生成扫描金样的 `scan`,更新小运起点断言并写三栏,Bug 历史补记) |
|
||||
|
||||
当时「虚构盘大运与独立计算差约 2 天」误判为岁差版本差异,实为 BUG-1275。
|
||||
|
||||
@@ -317,7 +317,7 @@
|
||||
| `TASK-rectification-refresh-r3-r4-20260913.md` | `PROGRESS-rectification-refresh-r3-r4-20260913.md` | 刷新阶段 R3(MIN_BOUNDARY_DAYS 45→30)+ R4(pratyantar 与 D9/D10 上升 Narayana);首轮出题不变。即使放宽仍有 0 题例子,定向补事另线保留(BUG-664/665) | 已实现 `ab1ade59`,已部署;2026-09-13 验收通过(实现单由执行方自拟,无产品决策记录段;收益口径见研究文档) | `codex/rectification-refresh-r3-r4-20260913` |
|
||||
| `TASK-upstream-sync6-20261007.md` | [PROGRESS-upstream-sync6-20261007.md](PROGRESS-upstream-sync6-20261007.md) | **上游同步第六轮(`23be1807`)**:10-05 五个计算修正一行未合——D5/D6/D8/D11 映射(乔布斯盘四张分盘星座全不同)、Vimsopaka 权重、Yogini 顺序与出生余额、Panchadhikari 宫位参照、Narayana 并列、特殊上升、出生秒数、Neecha Bhanga 两条件、首段大运子运、岁差被覆盖;逐项对照原书核实;最先做 | 已验收(门禁补修 `2df6ee72`,已部署 staging) | [PROGRESS-upstream-sync6-20261007.md](PROGRESS-upstream-sync6-20261007.md) |
|
||||
| `TASK-special-lagnas-native-20261008.md` | `PROGRESS-special-lagnas-native-20261008.md` | **特殊上升点原生计算(线上缺陷)**:sync6 U6 运行时调 PyJHora,生产镜像没有 PyJHora → staging 上 Hora/Ghati/Sree/Indu/Pranapada 全 blocked;原生实现、PyJHora 只作冻结对照、快速门禁止运行时 import jhora;最先做 | 已验收(已部署 staging `795b8845`,BUG-1273) | `codex/special-lagnas-native-20261008`(未上线;部署以 `/api/health` 为准) |
|
||||
| `TASK-ephemeris-nutation-20261008.md` | — | **恒星黄道少扣章动(BUG-1275)**:行星 = 含章动热带视位置 − 平岁差,全体偏 Δψ(≤17″),大运日期差 2–3 天;改标准算法、PyJHora 冻结对照、scoring-12、v5 重跑 | 待领取 | — |
|
||||
| `TASK-ephemeris-nutation-20261008.md` | `PROGRESS-ephemeris-nutation-20261008.md` | **恒星黄道少扣章动(BUG-1275)**:行星 = 含章动热带视位置 − 平岁差,全体偏 Δψ(≤17″),大运日期差 2–3 天;改标准算法、PyJHora 冻结对照、scoring-12、v5 重跑 | 待验收 | `codex/ephemeris-nutation-20261008`(未推送,未部署) |
|
||||
| `TASK-sync6-gate-red-20261007.md` | — | **sync6 后门禁仍红**:run 3213 快速门已过,「Frontend and database tests」开跑 20 秒后日志中断、15 分钟后判失败,后续步骤 failure 0 秒;疑运行机掉线;先 Re-run,红则本机带 Docker 跑 `CI=1 npm test` 对照 `0ed45a4b` | 已完成(Re-run 通过,BUG-1271,部署 `2df6ee72`) | — |
|
||||
|
||||
| `TASK-rectification-tie-break-entry-fix-20260913.md` | `PROGRESS-rectification-tie-break-entry-fix-20260913.md` | 修复单:参考题入口只读 `window_scan` 标志位 → 两道答完后仍显示、再点弹「现在没有可答的参考题」;并按产品拍板改成点一次连出 D9+D10(BUG-666~668,Skill 10.0.26) | 已合入(无独立验收记录) | `99127601`(BUG-666~668 resolved;已部署 staging,run 2589) |
|
||||
|
||||
Reference in New Issue
Block a user