Files
Jyotisha/docs/tasks/TASK-upstream-sync6-20261007.md

10 KiB
Raw Permalink Blame History

TASK · 上游同步第六轮:上游 10-05 五个计算修正(2026-10-07)

  • 基线:origin/staging @ 0ed45a4b(staging 已部署同一 SHA)。
  • 上游参照:/workspace/yinduzhanxing origin/main @ 23be1807。只按下表逐提交挑选,不整文件覆盖。
  • 分支 / worktree:codex/upstream-sync6-20261007 / .worktrees/upstream-sync6-20261007
  • 串行顺序:本单最先做。TASK-report-full-data-edition-20261007(报告)与 TASK-consult-card-full-source-20261007(对话数据卡)都基于本单合入后的 staging 开工。
  • BUG 编号:开工时核对 docs/BUG_HISTORY.md 最大号(写作时 BUG-1259)后顺延;三份单共用一个序列,先开工的先取号。
  • 若执行方因权限无法跨仓读取或拷贝上游代码:停下,在进度记录里写明,由 Claude 移植代码,测试 / golden / 评测交执行方。

1. 事故实证

产品 10-07 拿一份上游导出的用户报告(pl9_ai_density 版)和网站报告对比,认为前者准确得多。Claude 用乔布斯的公开盘(AA,1955-02-24 19:15 San Francisco,Lahiri,平均交点)在两边各导出一份,结果如下:

项 我方 0ed45a4b 上游 23be1807
D5 太阳 / 月亮 白羊 / 摩羯 射手 / 双鱼
D6 太阳 / 月亮 白羊 / 天蝎 双子 / 射手
D8 太阳 / 月亮 金牛 / 水瓶 双鱼 / 天蝎
D11 太阳 / 月亮 双子 / 白羊 天秤 / 天秤
Yogini 第一段 木星,出生起满 5 年 水星,只剩出生余额 0.81 年
Shadbala 木星第 3 列 80.59 39.41(原因未定位,见 T9)
特殊上升点 Bhava 巨蟹 27.06°;Hora 与 Ghati 同为双鱼 17.81°(不可能相同);无 Sree / Indu / Vighati / Pranapada / Varnada Bhava 狮子 17.12°、Hora 水瓶 22.58°、Ghati 处女 8.94°;另有 Sree、Indu、Vighati、Pranapada、Varnada

对照上游五个提交里新增的代码行,逐行检查它们在我方文件中是否存在:

上游提交 文件 我方状态
f32472b5 scripts/varga.py、scripts/vimsopaka_calculator.py、scripts/divisional_charts_extended.py 新增行 0 / 7、0 / 32;extended 与上游改前逐字节相同
1918ffaf scripts/yogini_dasha.py、scripts/tajika.py、scripts/special_lagnas.py、scripts/narayana_dasha.py、yoga_rules yogini 与上游改前相同;tajika 0 / 8;special_lagnas 0 / 37;narayana 3 / 32
e4a6ac01 scripts/solar_return.py、scripts/cmd_solar_return.py 等 solar_return 0 / 5
4a807e7d scripts/jyotish_engine.py(Neecha Bhanga、首段大运子运、渲染) 8 / 94
23be1807 scripts/ayanamsa_utils.py、scripts/bhava_chalit.py、scripts/cmd_nakshatra_adv.py、scripts/jyotish_engine.py ayanamsa_utils 0 / 6;另两个文件与上游改前相同;engine 8 / 55

影响面:普通对话的健康卡用 D6 / D8,财富卡用 D11,学业卡用 D5;报告的分盘表、Vimsopaka、Yogini、年主都受影响。

2. 根因

我方上次对齐上游是 10-04 的 03bea6ed(第一到第五批)。上游 10-05 又提交了这五个计算修正,我方没有同步。

3. 决策记录(产品 2026-10-07 授权)

  1. 同步上游 10-05 的计算修正。逐项对照上游声称的原书出处核实后再合入,不整包照搬。上游以前出过「只换标签、声称已修」的情况(c7117f92 的 Narayana),所以核实是本单的一部分,不是可选项。
  2. 核实可以只读上游仓的 references/book_corpus/(PVR Integrated Approach 切卡包、V.P. Goel 等)。不得把书籍原文拷进我方仓库:这些第三方作品不随仓库授权。
  3. 不搬:0c0f31b2(上游自家隐私清理);089f80d1、49ff15e8、0f955334、2b10d566、ddec2a9a(书籍与文章语料、全文检索)——涉及版权,待产品另定;e4a6ac01 中的 MCP、canonical_jyotish_profile、pl9_compatibility_profile、evidence_labeled_reporting,我方没有这些模块,只取其中的出生秒数传递,以及 Shadbala 方法说明不再夸大的部分(若我方有对应代码)。e4a6ac01 关于 pl9_ai_density 客户档的部分留给报告单。
项 上游提交 内容 核实依据(上游自称)
U1 f32472b5 D5 / D6 / D8 / D11 映射改为有出处的版本;extended 计算委托 varga.calc_varga;记录 mapping_source PVR Integrated Approach §6.2.5 / 6.2.6 / 6.2.8 / 6.2.11
U2 f32472b5 Vimsopaka:去掉 D9 的 3.0 权重;自宫 virupa 改为 20;Neecha Bhanga 不作为尊贵输入;分档改名 BPHS 16 分盘体系
U3 1918ffaf Yogini:按原书顺序;按月宿起运(我方 sync5 已改);计算出生余额 V.P. Goel,Classical 章 Table I
U4 1918ffaf Tajika Panchadhikari:planet_house 改为相对年盘上升的第 1–12 宫,星座序号单独存(我方 BUG-1214 移植自 c7117f92,很可能带着这个错) —
U5 1918ffaf Narayana 两种算法并列报告;解释行写明实际选用的起运规则 —
U6 1918ffaf 特殊上升点:从出生点推算,不再用午夜近似;补 Varnada、Pranapada;PyJHora 生产者传入岁差 —
U7 1918ffaf yoga_rules 的 jupiter_upachaya_from_moon:按月亮起第 3/6/10/11 宫实现,标为「配置」,不叫瑜伽 —
U8 e4a6ac01 年盘与太阳返照:出生秒数一路传递 —
U9 4a807e7d Neecha Bhanga 补两个条件(定位星落月亮起角宫、落上升起角宫);首段大运被出生截断时,AD / PD 按完整大运起点推,只裁显示部分;宫位力量表不再多印一行汇总;Karaka 表加排位度数列 —
U10 23be1807 岁差:import 时的引导设定不再覆盖调用方已选的岁差;行运、Bhava Chalit、星宿命令都用本命岁差,并传入出生秒数 —

4. 硬红线

  1. 打分语义变化按 BUG-1181 先例处理:同一输入出不同分时,升生时校正算法身份(当前 scoring-10);记忆化 golden 出新版本、旧版冻结;研究记录按 ERR-110 重新冻结;验证历史校正记录仍能打开(BUG-621);前端与数据库里的版本字面量按 BUG-1181 改为代数判断。
  2. 生时校正 v5 77 例评测任一格下降超过 1 个百分点:停下逐项定位,报给产品,不得自行调参。
  3. 引擎数值一变,就跑 Python 全量,失败名单必须是基线的子集(基线在 Linux 上约 62 条)。快速门曾漏掉一条读者测试(BUG-1220)。
  4. scripts/jyotish_api_server.py 只许 bugfix 级改动(增长合同)。golden 一律用真实引擎重新生成,不手改。任何既有断言的改动写「原值 / 新值 / 原因」三栏。
  5. 不改 workflow、不提升 main、不动迁移(除非 T1 的版本字面量必须动守卫,届时按 sync5 先例只改守卫一行,并真跑 npm run test:db)。
  6. 隐私:只用公开名人盘或虚构盘。产品上传的那份用户报告不得进入仓库、测试、进度记录或 Bug 历史。

5. 任务分解

# 内容 验收标准
T0 开工前置:git fetch origin --prune;git worktree add -b codex/upstream-sync6-20261007 .worktrees/upstream-sync6-20261007 origin/staging;读 docs/research/pre_work_error_ledger.md;跑 python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45;在基线上记录 Python 全量、npm test、v5 评测三份基线数字 进度记录里有三份基线
T1 U1 + U2 乔布斯、奥巴马、泰勒三盘的 D5 / D6 / D8 / D11 与上游 23be1807 一致;按 PVR 原书各给一个手算示例并写进测试;Vimsopaka 全自宫反例等于 20
T2 U3 三盘的 Yogini 首段余额、起止日期与上游一致;按 Goel Table I 写顺序断言
T3 U4 构造一个能区分「0 起星座序号」和「1 起相对宫」的用例;年主结果与上游一致;BUG-1214 记录补关联
T4 U5 + U6 + U7 Narayana 两种算法并列显示,且不改打分(打分仍用旧 Narayana,产品 10-04 已定);Varnada、Pranapada 上卡或进报告的位置写清;三张公开盘的 Bhava / Hora / Ghati / Sree / Indu 上升与上游一致,且 Hora ≠ Ghati;jupiter_upachaya_from_moon 在卡和报告里不再叫瑜伽
T5 U8 + U9 出生秒数非 0 的虚构盘:年盘时刻与上游一致;首段大运被截断的盘:AD / PD 边界与上游一致;Neecha Bhanga 的 conditions_checked 含两个新条件
T6 U10 6 种岁差各跑一次:本命、行运、Bhava Chalit、星宿命令实际使用的岁差都等于请求的岁差(断言 requested == applied);同时核实我方是否存在 import 引导覆盖已选岁差的问题,写明有或没有
T7 下游 golden 与卡片 重新生成 frontend/tests/fixtures/consult-evidence-card-golden.json 等真实引擎 golden;健康 / 财富 / 学业卡的分盘值变化逐盘列表
T8 生时校正 按红线 1、2 执行;报告 v5 前后每格数字
T9 Shadbala 木星第 3 列差异 只定位、不修:找出是上游哪个提交造成的、哪边符合原书,写进进度记录与 Bug 历史(investigating);如果属于本单五个提交之一,就按该项一起合入
T10 记录 每项一个提交,提交说明写上游提交号与 BUG 号;docs/BUG_HISTORY.md、CHANGELOG.md、docs/tasks/PROGRESS-upstream-sync6-20261007.md、docs/tasks/README.md 状态板

6. 让步顺序

时间不够时按这个顺序往后放:T9 → T4 的 U5(Narayana 并列)。U1 / U2 / U3 / U4 / U6 / U10 不让步(U6 有实证:我方 Hora 与 Ghati 上升相同,且对话单要用这些点)。

7. 验收口径

ruff、py_compile、快速门 failures []、Python 全量失败名单 ⊆ 基线、tsc --noEmit 0、npm run lint 0 error、npm test 失败名单与基线逐条相同、next build 后 / 仍 Static、v5 评测每格不降超过 1 个百分点。名人生平回测需要模型 key,没有就写成环境缺口。