# 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,没有就写成环境缺口。