Files
Jyotisha/docs/tasks/TASK-special-lagnas-native-20261008.md
T

3.8 KiB
Raw Blame History

TASK · 特殊上升点改为本仓原生计算,不依赖 PyJHora(2026-10-08)

  • 基线:origin/staging @ c04786f7(已部署代码 2df6ee72)。
  • 分支 / worktree:codex/special-lagnas-native-20261008 / .worktrees/special-lagnas-native-20261008
  • 串行顺序:最先做,它是线上缺陷。报告补充单 TASK-report-full-data-fix-20261008 合入前 rebase 到本单之后。
  • BUG 编号:开工时核对 docs/BUG_HISTORY.md 最大号(写作时 BUG-1271;报告分支上已有 BUG-1272,未合入,本单从 1273 起)。

1. 事故实证

sync6 的 U6(BUG-1265,4b9c0198)把 Bhava / Hora / Ghati / Vighati / Sree / Indu / Pranapada / Varnada 上升改成「有经纬度时调用 PyJHora」(scripts/special_lagnas.py 的 calculate_pyjhora_special_lagnas)。

  • 生产与 staging 镜像只装 requirements.txt(deploy/railway-api.Dockerfile),里面没有 PyJHora;PyJHora 写在 requirements-reference-engines.txt,注释是「AGPL-3.0,只能作为外部对照」。
  • Claude 在本机屏蔽 jhora 导入后跑乔布斯盘的 cmd_full_reading:Hora_Lagna、Ghati_Lagna、Sree_Lagna、Indu_Lagna、Pranapada_Lagna 全部是 {"status": "blocked", "reason": "pyjhora_unavailable:no jhora"}。
  • 所以 staging 部署 2df6ee72 后,这些点从「算错」(Hora 与 Ghati 同为双鱼 17.81°)变成「没有」。报告的特殊上升表与对话卡受影响;生时校正打分仍用原公式,不受影响。
  • sync6 验收(Claude)用的机器装了 PyJHora,所以和上游对上了。门禁的 .venv 也不装 PyJHora,但 tests/test_special_lagnas_birth_instant.py 不在快速门里,没拦住。

2. 根因

运行时代码依赖了一个按许可证不能进生产的库;验收环境与生产依赖不一致。

3. 决策记录

产品 2026-10-08 已知悉;这是对 sync6 的修复,不需要另行授权。PyJHora 只能用来生成对照答案,不能出现在运行时路径上。

4. 硬红线

  1. scripts/ 里被 cmd_full_reading、报告、对话卡调用的代码不得导入 jhora。
  2. 对照答案(PyJHora 4.8.7 的输出)离线生成后冻结成 fixture,并写明生成命令;测试只读 fixture,不导入 jhora。
  3. 公式按本仓 references/ 或原书写出处(BPHS 第 4 章特殊上升;Sree / Indu 的出处写清)。找不到出处的点写 blocked,不自拟。
  4. 生时校正打分不改(仍用原 Hora / Ghati 公式),不升算法身份。
  5. 隐私:只用公开名人盘和虚构盘。

5. 任务分解

# 内容 验收标准
T1 原生实现上述 8 个点(日出时刻用 Swiss Ephemeris,按出生地经纬度和岁差) 乔布斯、奥巴马、虚构盘三张盘、6 种岁差中至少 Lahiri 与 Raman:与 PyJHora 冻结答案相差 ≤ 0.01°;Hora ≠ Ghati
T2 去掉运行时的 PyJHora 调用;calculate_pyjhora_special_lagnas 若保留,只给研究脚本用,并改名注明 新测试:屏蔽 jhora 导入后跑 cmd_full_reading,8 个点都是 computed,source 不含 pyjhora
T3 防复发:在快速门里加一条测试,扫描运行时调用链(cmd_full_reading 与报告、对话卡的入口)用到的模块,出现 import jhora / from jhora 即失败 测试进 scripts/run_quality_gate.py 的 quick 档
T4 记录 docs/BUG_HISTORY.md 新编号,关联 BUG-1265(复发类型:验收环境与生产不一致);CHANGELOG.md;进度记录;状态板

6. 验收口径

ruff、py_compile、快速门、Python 全量失败名单 ⊆ 基线(Linux 基线 62)、npm test 失败名单与基线相同。验收必须在没有 PyJHora 的环境里跑一次(门禁 .venv 即是)。部署后核对 /api/health 的 deployment.gitCommit、/login 200、未登录 /api/account 401。