Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
3.8 KiB
3.8 KiB
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. 硬红线
scripts/里被cmd_full_reading、报告、对话卡调用的代码不得导入jhora。- 对照答案(PyJHora 4.8.7 的输出)离线生成后冻结成 fixture,并写明生成命令;测试只读 fixture,不导入
jhora。 - 公式按本仓
references/或原书写出处(BPHS 第 4 章特殊上升;Sree / Indu 的出处写清)。找不到出处的点写blocked,不自拟。 - 生时校正打分不改(仍用原 Hora / Ghati 公式),不升算法身份。
- 隐私:只用公开名人盘和虚构盘。
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。