Fifteen calculation fixes landed on upstream main on 10-16 that sync 8 never saw, because sync 8 took the upstream-notice branch instead. Batch A (nine items outside the rectification freeze) goes to Grok now; Varga and Narayana touch frozen files and wait for #137. Co-Authored-By: Claude (agent loop) <noreply@anthropic.com>
14 KiB
14 KiB
TASK · 上游同步第九轮:上游 main 10-16 的计算修正(甲批九项)+ 接入映射表(2026-10-28)
- 日期:2026-10-28
- 来源:issue #141「同步上游 skill 技法」。产品负责人 10-28 说明上游 Skill 仓已更新,要求同步并查清计算需要更新的地方,附了上游作者的接入说明(「把印度占星仓的计算能力接入另一个项目」)。
- 执行方:Grok(Windows + Docker),分支
codex/upstream-sync9-20261028,只推这个分支 - 验收:Claude(Linux)
- BUG 编号:开工时按
docs/BUG_HISTORY.md全文件取最大号 +1。写作时最大号为 BUG-1471;另一会话正在串行做 #121~#140,会继续占号,务必开工当时再核对。本单预计 8 个号(A1~A7、A9 各一个)。
1. 基线
- 基线 commit:
origin/staging3eeb8980(#121/#122 已在其中)。 - 上游:GitHub
732642856/yinduzhanxing(本机/workspace/yinduzhanxing,10-28 已 fetch,与远端 main 一致)。上游 main 头5fb8379c(10-21)。 - 我方已跟到哪里:
- 第八轮(BUG-1380~1389)按上游分支
codex/upstream-notice-20261016的caf1ed4e搬了十项。该分支没有合入上游 main,两者从97dea658分叉。 - 之后按单搬过
7a773d13(合盘 D4 / Niryaana PVR)、9f08b57b、258e08e3(Niryaana 强度)、5fb8379c(Goel Jaimini,#94)。 references/upstream/yinduzhanxing/source-manifest.json仍写b9a0ef8f(09-09 第二轮),该提交已被上游改写历史后不存在,提交时间与上游dc3b8fef相同。本单更新这份清单(T0)。
- 第八轮(BUG-1380~1389)按上游分支
- 上游 main 自
97dea658以来 58 个提交,其中 synastry 产品、报告形态、研究工具占大头;计算修正 15 个,我方提交历史与文档里一次都没有提到。 第八轮按分支取材,这批 main 上的修正因此漏掉了。
2. 事故实证(3eeb8980,把上游这些提交自带的测试原样放到我方代码上跑)
| 项 | 上游提交 | 上游测试在我方的结果 | 我方现状(按符号定位) |
|---|---|---|---|
| A1 Yogini 恰在星宿边界 | d268d519 |
test_yogini_exact_boundaries.py 24 败 7 过 |
scripts/yogini_dasha.py:月亮恰在星宿起点时第一大运余额算成约 0(应为整段,如 7 年),与第八轮 T2(BUG-1381)同类,当时只修了 dasha_analyzer / cmd_dasha。经 jyotish_engine、consult_card_domain_facts、annual_native/dasha_children 进星盘页大运右栏(#88)、咨询卡和年运 |
| A2 Tithi 主星 | 33537b31 |
test_tithi_lord_source.py 21 败 14 过 |
scripts/tithi_lord.py:三十个 tithi 的主星顺序不是来源顺序(如某 tithi 我方给 Sun,来源为 Rahu);非法种子被静默接受 |
| A3 Saham Table 74 | cb8a1ca7 |
test_saham_table74_completion.py 7 败;test_saham_pvr_directed_arc.py 8 败 5 过 |
references/saham_rules.json 缺 Table 74 其余公式(如 Samartha_Saham);scripts/tajika.py 有按宫位的旧近似公式会覆盖来源公式。注意第八轮 T9(BUG-1387)已按 ce9fed15 改过例外弧方向,directed_arc 测试的失败要逐条分清是新问题还是我方写法不同 |
| A4 Ashtottari 弧与子运时钟 | 0712f98f |
test_ashtottari_source_arcs.py 11 败 7 过;test_ashtottari_reference_clock.py 2 败 |
scripts/ashtottari_dasha.py、scripts/cmd_nakshatra_adv.py:星宿弧没用来源弧段;第二轮循环的子运不随父运移动;辅助出生余额改写了子运时钟。进星盘页 Ashtottari(#88) |
| A5 Kalachakra 星座期 | f353a096 |
test_kalachakra_source_lords.py 116 败(大部分是缺 _fraction_completed_in_pada 这类接口,先补接口再看数值) |
scripts/kalachakra_dasha.py:古典星座期没按月亮实际经度起算;非有限输入会退回默认值而不是报错 |
| A6 Arudha 只到星座 | 8b55630a |
test_special_lagnas_arudha_coordinates.py 2 败(我方没有 calculate_arudha_lagna,名字是 calculate_arudha_pada) |
scripts/special_lagnas.py:Arudha、A10、Upapada 按数宫只确定星座,我方却给出星座内度数。上游改为标明坐标口径、不编造度数。该文件被生时校正调用(active_rectification_event_engine.py) |
| A7 Darakaraka 排序 | 45b3b66b |
收集即失败:我方 scripts.jaimini 没有 calc_chara_karaka |
scripts/darakaraka_reader.py 自己排七/八 Karaka,交点处理、原始经度、排除星与主 Jaimini 表可能不一致。经 jyotish_api_server(合盘)与 jyotish_engine 使用 |
| A8 已覆盖,只核对 | 07fc5be3 |
test_dasha_analyzer_boundary_contract.py 2 过 |
第八轮 T2 已修。本单只把上游测试收进来,不改 dasha_analyzer.py |
| A9 相位含计都与速度 | e628118d(只取 aspects.py) |
上游 5fb8379c 起自 dc3b8fef 改过相位的测试(如 test_yoga_node_aspect_policy.py)放到我方再判 |
scripts/aspects.py 与上游 dc3b8fef 逐字相同,上游之后把计都纳入相位、按行星速度判入相/离相(planet_speeds 参数,计都取罗睺速度)。三方合并 0 冲突。注意上游同期 2f52cfca 改 karaka_calculator.py 依赖 jaimini.calc_chara_karaka,与 A7 同一缺口,本单不搬 |
乙批(本单不做,见 §4.3):
| 项 | 上游提交 | 上游测试在我方的结果 | 为什么后做 |
|---|---|---|---|
| B1 22 号 Drekkana 与 Sarpa 范围 | 50847e57 |
test_varga_bphs.py 3 败 14 过;test_sarpa_drekkana_precision.py 4 败 2 过(我方 Sarpa 范围 5 段,书上 3 段) |
改 scripts/varga.py,在校正冻结清单里 |
| B2 Narayana 小运强度口径贯通 | 6859b263 |
3 败:build_narayana_dense_boundaries() 不收 strength_profile |
改 scripts/narayana_dasha.py,在校正冻结清单里 |
不搬:72ce63e1(完整调用回执)、55eecebd(依赖我方没有的 shodashottari_pyjhora_md_replay 研究回放)、20859457(依赖第二轮就决定不搬的 professional_parity_closure)、cdb6c03a(改的是我方没有的 rashi_dasha_explicit_contract,第二轮也决定不搬)、55f26e4f(合盘匹配产品,我方已有自己的七项匹配 cf063834)、synastry 产品与报告系列、a13d3abf 等 checkpoint。
3. 根因
前八轮都按上游提交标题或某一条分支挑修正。上游 10-16 在 main 上一次性提交了十几项「按来源纠正」的计算修正,同期我方第八轮取的是另一条分支,所以这批全部漏掉。另外 A1 与第八轮 T2 是同一个边界问题在第三个大运实现里的复发,T2 当时只修了被点名的两处。
4. 决策记录
- 产品 10-28 要求同步上游并查清计算要更新的地方(issue #141)。本单按第八轮先例只做计算修正,按语义移植,不整文件覆盖;我方文件与上游已分叉,三方合并在优先文件上几乎都有冲突(15 个优先计算文件里只有
aspects.py、karaka_calculator.py可以干净合并;前者收为 A9,后者依赖我方没有的calc_chara_karaka,不搬)。 - issue 附的接入说明是给「从零接入另一个项目」写的,我方已经接了八轮。本单从中只取两样:一张接入映射表(T9),以及「无法运行的模块列为未验收」的口径。说明里的统一结果外层(
source_commit/execution_status等)会改所有接口形状,本单不做;产品要做再单独开单。 - 分两批,乙批等 #137:B1、B2 改的是生时校正冻结文件。#137(星盘页与报告大运统一从真实出生时刻算,另一会话在做)也会改冻结文件并重新冻结。乙批在 #137 合入 staging 后由 Claude 另开单,冻结只按顺序各做一次。
- 用户可见变化已知并接受(与第八轮同一口径:计算按来源修正,数值会变):
- 月亮恰在星宿起点的盘,Yogini 第一大运会从约 0 变成整段,后续日期整体移动;
- Tithi 主星会变;
- 年运 Saham 会多出 Table 74 其余各项,个别旧近似值会变;
- Ashtottari、Kalachakra 的日期边界会变;
- Arudha / A10 / Upapada 不再显示星座内度数,只显示星座。
- 重新冻结的先例:第八轮在分数逐条相同的前提下重新冻结(
79f6ac52)。本单甲批不应改任何冻结文件;如果发现必须改,停下回报为「需拍板」,不要自行重新冻结。
5. 硬红线
- 生时校正输出逐字节不变。 跑
scripts/research/sealed_holdout_rerun.py(20 条)与scripts/research/reported_offset_sweep.py(900 条),改前改后逐条相同。A6 特别注意:校正读special_lagnas,若改 Arudha 输出让校正结果变了,A6 停下,保留校正路径原行为(加显式参数、默认即现行为),做不到就回报。 - 不改冻结清单里的文件:
docs/research/*upstream_sync8_2026_10_18.freeze.json列出的 16 个文件(含varga.py、narayana_dasha.py、jaimini.py、dasha_analyzer.py、shadbala.py、divisional_charts_extended.py)。A7 若要用上游calc_chara_karaka,在darakaraka_reader.py里调用我方jaimini.py已有的排序函数,不改jaimini.py;我方没有可用函数就回报。 - 不新增
scripts/根目录文件(根目录预算见 #81 决策 A)。上游测试放tests/,上游配套研究文档按原路径放docs/research/。 - 不改
.gitea/workflows/**、不动数据库与迁移、不改个人报告导出合同、不碰前端。 - 上游测试按语义改写成我方接口时,不得放宽断言的数值;名字或形状不同就改调用方式,数值一律按上游。某条上游断言我方确实不该照做(如第八轮 T3 那类数据形状差异),在 PROGRESS「断言三栏」写清原值 / 新值 / 原因。
- 公开仓库:测试与文档只用公开或虚构出生资料。
6. 任务分解
每项一个提交、一个 BUG 号,提交信息写上游提交号。先把对应上游测试收进 tests/(文件名前加 test_upstream_sync9_),确认改前失败,再改代码让它通过。
| 任务 | 内容 | 验收标准 |
|---|---|---|
| T0 | 更新 references/upstream/yinduzhanxing/source-manifest.json 与 references/cross_project_contract/sync_ledger.json:上游 main 头 5fb8379c,写明 b9a0ef8f 已不存在、对应 dc3b8fef,本轮只取 §2 甲批。用现有导入器的 ledger 写法,不手写哈希 |
相关合同测试通过(tests/test_cross_project_*、tests/test_upstream_* 中与清单有关的) |
| T1 | A1 Yogini 边界(d268d519) |
上游 31 条全过;非边界经度随机抽样 1 万点,第一大运余额与改前相同 |
| T2 | A2 Tithi 主星(33537b31) |
上游 35 条全过 |
| T3 | A3 Saham Table 74(cb8a1ca7) |
table74_completion 7 条全过;directed_arc 13 条逐条判定:要么通过,要么在 PROGRESS 写清它与 BUG-1387 的关系 |
| T4 | A4 Ashtottari(0712f98f) |
上游 20 条全过;cmd_nakshatra_adv 的输出键不变 |
| T5 | A5 Kalachakra(f353a096) |
上游 116 条全过,先补测试要用的内部接口;非有限输入报错,不退回默认 |
| T6 | A6 Arudha 坐标口径(8b55630a) |
上游 2 条按我方函数名改写后通过;红线 1 成立;chart_view_points/api.py 与 full_report_quality_gate.py 的相关测试通过 |
| T7 | A7 Darakaraka(45b3b66b) |
上游测试按我方接口改写后通过;红线 2 成立 |
| T8 | A8 收测试(07fc5be3) |
2 条通过,不改代码 |
| T8b | A9 相位(e628118d 的 aspects.py 部分) |
上游相关测试通过;所有调用 calc_aspects(或我方对应函数)的地方要么传速度、要么明确不传,PROGRESS 列出调用方与是否传速度;瑜伽相位既有测试通过 |
| T9 | 写 docs/research/upstream_capability_map_2026_10_28.md:issue 列的「优先接入」八类(行星、宫位、分盘 D1/D9/D10、Vimshottari/Narayana、行运、Shadbala/Bhava Bala/Vimsopaka、相位、瑜伽),每类一行:上游文件与函数(5fb8379c)、我方文件与函数、我方入口(CLI/API)、状态 A/B/C/D(定义照 issue)、最后一次跟上游的提交号、未跟的上游修正。另列上游 main 有、我方从入口不可达的新模块(43 个,如 sudasa、tara_dasha、kaala_dasha、varnada_dasha),标「未接入,第二批另评估」 |
每行的「我方函数」在 staging 上真实存在;不写「已计算」除非能从 CLI/API 调到 |
| T10 | 记录:BUG_HISTORY 每项一条、CHANGELOG、PROGRESS(含断言三栏、校正回放、跑过的命令与数字)、docs/tasks/README.md 状态板这一行改状态 |
— |
7. 让步顺序
时间不够时:先 T1、T2(用户可见、改动小),再 T3、T4、T5,最后 T6、T7。T0、T8、T10 必做。T9 可以只交八类表,不可达模块清单列文件名即可。做不完的项在 PROGRESS 写「未做」,不得写成通过。
8. 验收命令
| 检查 | Grok 自跑 | Claude 验收时跑 |
|---|---|---|
| 本单新增与改到的 Python 测试文件 | 必跑(工作树 .venv) |
复验 |
与改动模块相关的既有测试(tests/test_yogini*、test_tithi*、test_saham*、test_tajika*、test_ashtottari*、test_kalachakra*、test_special_lagnas*、test_darakaraka*、test_annual*、test_chart_view*) |
必跑 | 复验 |
| 生时校正回放 20 条 + 900 条,与改前逐条比 | 必跑 | 复验 |
Python 快速门 run_quality_gate.py --profile quick |
不跑 | 以 Claude 为准 |
| 前端 | 本单不改前端,不跑 | 跑 report-fact-tables.test.ts 与星盘页大运相关测试 |
9. 开工前置命令
git fetch origin
git worktree add .worktrees/upstream-sync9-20261028 -b codex/upstream-sync9-20261028 origin/staging
python scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
grep -o 'BUG-[0-9]\+' docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1
git remote add upstream https://github.com/732642856/yinduzhanxing.git # 已有则跳过
git fetch upstream main
git show <上游提交> -- <文件> # 每项只读 diff,按语义移植
10. 真机
改动用户可见(星盘页 Yogini / Ashtottari 大运、年运 Saham、Arudha 显示)。走查清单:docs/testing/upstream-sync9-20261028.md。