Files
Jyotisha/docs/tasks/TASK-upstream-sync9-20261028.md
T
Jesse_ChenandClaude 9a0ce76d48 docs(tasks): upstream sync 9 brief (agent loop, issue #141)
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>
2026-10-28 08:44:22 +08:00

14 KiB
Raw Blame History

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/staging 3eeb8980(#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)。
  • 上游 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. 决策记录

  1. 产品 10-28 要求同步上游并查清计算要更新的地方(issue #141)。本单按第八轮先例只做计算修正,按语义移植,不整文件覆盖;我方文件与上游已分叉,三方合并在优先文件上几乎都有冲突(15 个优先计算文件里只有 aspects.py、karaka_calculator.py 可以干净合并;前者收为 A9,后者依赖我方没有的 calc_chara_karaka,不搬)。
  2. issue 附的接入说明是给「从零接入另一个项目」写的,我方已经接了八轮。本单从中只取两样:一张接入映射表(T9),以及「无法运行的模块列为未验收」的口径。说明里的统一结果外层(source_commit / execution_status 等)会改所有接口形状,本单不做;产品要做再单独开单。
  3. 分两批,乙批等 #137:B1、B2 改的是生时校正冻结文件。#137(星盘页与报告大运统一从真实出生时刻算,另一会话在做)也会改冻结文件并重新冻结。乙批在 #137 合入 staging 后由 Claude 另开单,冻结只按顺序各做一次。
  4. 用户可见变化已知并接受(与第八轮同一口径:计算按来源修正,数值会变):
    • 月亮恰在星宿起点的盘,Yogini 第一大运会从约 0 变成整段,后续日期整体移动;
    • Tithi 主星会变;
    • 年运 Saham 会多出 Table 74 其余各项,个别旧近似值会变;
    • Ashtottari、Kalachakra 的日期边界会变;
    • Arudha / A10 / Upapada 不再显示星座内度数,只显示星座。
  5. 重新冻结的先例:第八轮在分数逐条相同的前提下重新冻结(79f6ac52)。本单甲批不应改任何冻结文件;如果发现必须改,停下回报为「需拍板」,不要自行重新冻结。

5. 硬红线

  1. 生时校正输出逐字节不变。 跑 scripts/research/sealed_holdout_rerun.py(20 条)与 scripts/research/reported_offset_sweep.py(900 条),改前改后逐条相同。A6 特别注意:校正读 special_lagnas,若改 Arudha 输出让校正结果变了,A6 停下,保留校正路径原行为(加显式参数、默认即现行为),做不到就回报。
  2. 不改冻结清单里的文件: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;我方没有可用函数就回报。
  3. 不新增 scripts/ 根目录文件(根目录预算见 #81 决策 A)。上游测试放 tests/,上游配套研究文档按原路径放 docs/research/。
  4. 不改 .gitea/workflows/**、不动数据库与迁移、不改个人报告导出合同、不碰前端。
  5. 上游测试按语义改写成我方接口时,不得放宽断言的数值;名字或形状不同就改调用方式,数值一律按上游。某条上游断言我方确实不该照做(如第八轮 T3 那类数据形状差异),在 PROGRESS「断言三栏」写清原值 / 新值 / 原因。
  6. 公开仓库:测试与文档只用公开或虚构出生资料。

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。