# 共享引擎复用核对:Narayana / Tajika / 年盘时刻(2026-10-03) > 只读核对,未改代码。范围是任务书 `TASK-astrologer-rulings-batch3-20261003` 涉及的五个点,加上核对中新发现的一个年盘时刻缺陷。逐项都写了证据和可复跑的方法。 ## 结论先行 | # | 问题 | 根因归类 | 网站现状(staging 部署 503c1190) | 第三批分支 ecc76274 | 还要做什么 | |---|---|---|---|---|---| | N1 | Narayana 起运宫强弱 | 方法差异 + 原书自相矛盾 | 产品仍用旧算法(从上升起、一律顺行),已标「旧算法」 | 7 级通则已实现:Table 15、17 复现,Table 18 不复现,按红线 3 停在 T3 | 红线 3 要改口径(见 §N1),并请占星师复核 3 处 | | N2 | Narayana 子运 | 方法差异(原书正文、原书表、原书例题三者不一) | 产品子运:旧加权算法 | 起点按问 4;方向按起点星座查 Table 13(与原书 Table 25 一致,与 p.47 正文不一致) | 方向规则请占星师定 | | T1 | 年主比强弱用的 Panchavargiya | 网站沿用近似值;上游自身也有同一缺陷 | `native_proxy`(D1/D2/D3/D9/D12 庙旺近似) | 已改正式五分法,规则表与上游逐字节相同 | 验收即可 | | T2 | Muntha | 上游缺陷(同一响应两种 Muntha) | 已按本命上升 + 已满年数(BUG-1212) | 不变 | 向上游报告 | | T3 | Mudda Dasha | 网站旧方法;上游主入口也是旧方法 | 从年主起排 | 已改出生月宿 + 已满年数起排,与年主无关 | 年长取 365.25 天未经裁定,列入问题 | | **S1** | **太阳返照时刻(新发现)** | **网站缺陷(同步漏掉上游 7cc6425d / 46ed9399)** | 返照时刻偏 3–7 分钟;243 张年盘里年盘上升变 13 张、年主变 11 张 | 未涉及 | 新任务书 `TASK-annual-return-frame-20261003` | 测试通过不代表占星预测准确。本文所有「复现」都是**原书数字对得上**,不是应验率。 ## 0. 版本事实 | 项 | 值 | 核实方式 | |---|---|---| | 共享仓 | `https://github.com/732642856/yinduzhanxing.git`,`origin/main` = `c7117f92`(本地 `main` 落后 14,未用本地副本) | `git fetch` 后 `git archive c7117f92` 解到临时目录运行 | | 网站仓 | Gitea `origin/staging` = `ac588172`(纯文档);最近含门禁改动的提交 `503c1190` | `deploy/is-docs-only-range.sh 503c1190… ac588172…` 退出 0 | | 线上 staging | `/api/health` → `deployment.gitCommit` = `apiGitCommit` = `503c1190`,`skillVersion 6.9.17` | 2026-10-03 19:26 实测 | | 网站引擎 | 网站仓自带 `scripts/`(上游的分叉,按 sync 单逐批搬),不是运行时调上游 | `scripts/tajika_year_lord.py` 等文件头写明搬运来源 SHA | | 第三批执行分支 | `codex/astrologer-rulings-batch3-20261003` HEAD `ecc76274`(另一会话执行中,本文未改它) | 定向测试 6 个文件 229 passed | | 预检 | 网站仓 `scripts/pre_work_check.py` → `status: pass`(远端可见、碎片扫描、外部适配器、定向测试全过) | 上游仓预检未跑:只有归档副本,没有工作树 | | 原书 | Sanjay Rath《Narayana Dasa》PDF,sha256 `d5b576db…`,与上游账本 `references/oracle/sanjay_rath_narayana_book_ledger_2026_08_28.json` 记录的 `source_sha256` 相同 | 下载到会话临时目录比对,未入库 | 页码说明:下文用 PDF 页脚「Page N of 194」。占星师答卷里写的 p.35–36、p.48 等可能是另一套页码,内容对得上。 ## N1 Narayana 起运宫强弱 **已有能力在哪:** - 上游 `scripts/narayana_dasha.py:select_narayana_seed_sign(strength_profile=…)`。 - `rath_p36_role_conjunction_v1`:木星、水星、宫主三个角色**各记一次、不按星体去重**;同宫或 Rasi Drishti(`_rasi_aspects`)都算。 - 默认 `jaimini_lagna_seventh_strength_v1`:按星体去重,只算 Rasi Drishti,不算同宫。 - 两者都不用 Parashari 行星相位。 - 上游用到 `rath_p36…` 的只有专题入口 `scripts/padanadhamsa.py` 和 `tests/test_rath_role_strength.py`。出生盘 Narayana 主函数 `calc_narayana_mahadasha` 的 `_NARAYANA_SEED_PROFILES` 只有 `legacy_lagna_v0` 和 `jaimini_lagna_seventh_strength_v1`,选不到它。 - 上游第 3 级以后是分开的几个 profile,各管一段:`rath_empty_sign_lord_strength_v1`、`rath_classical_exaltation_strength_v1`、`rath_single_occupant_sign_dignity_v1`、`pvr_classical_lord_sign_strength_v1`。没有一个统一的 7 级选择器。 - 网站第三批 `scripts/narayana_rath.py:compare_signs`:第 1–2 级逐行搬自 `rath_p36…`,有测试与上游函数对比;第 3–7 级按占星师第五轮问 2 拼成。 **原书原文(Page 31–32):** - 第一来源共 8 条: 1. 含 AK 的宫; 2. 星多; 3. 尊贵; 4. 双体 > 固定 > 活动; 5. 宫主是 AK; 6. 宫主度数高者强(Chara Karaka 意义); 7. 两宫同主或宫主度数相等时,看宫主是否落奇偶相反的星座; 8. 给出较长大运者强。 - 正文说 Narayana 用 (2)(3)(4)(6) 和 (7) 或 (8)。脚注 27 却说 Narayana「只用第一来源的 (2)(3)(4),加上第二来源」。**原书在第 6 条用不用上自相矛盾。** - 优先次序(Page 33):第一来源 (2) → 第二来源 → (3) → (4)…。与占星师问 2 一致。 **用原书软件表核对(新增证据):** 原书 20 张表的表头印有「Stronger planets and signs」,即该盘 6 对宫的强弱裁决和 2 对双主星的裁决,是原书软件输出。取其中 5 张出生盘(D1): | 表 | 盘 | 6 对宫:书 vs 7 级通则 | 双主星 | |---|---|---|---| | Table 22 | Chart 14(1962-03-28 06:29 IST) | 6/6 | 2/2 | | Table 23 | Chart 15 标准盘(1963-08-07 21:15 IST) | 6/6 | 1/2(书:水瓶取土星;我们取罗睺) | | Table 24 | Chart 16(1954-12-19 00:20 IST) | 6/6 | 2/2 | | Table 25 | Chart 17 Wadiyar(1884-06-04 10:18 LMT) | **4/6**(双子/射手、处女/双鱼,书取双子、处女;通则第 5 级取射手、双鱼) | 1/2(书:天蝎取计都;我们取火星) | | Table 27 | Chart 22 Indira Gandhi(1917-11-19) | 6/6(**书取摩羯强于巨蟹**) | 2/2 | | 合计 | | **28/30** | **8/10** | - Wadiyar 两处不符对平均交点 / 真交点、Lahiri / Raman / True Chitra 都不敏感。两处都是「水星(1.3°)主的宫 对 木星(10.0°)主的宫」,在第 5 级判出。 - 试过「去掉第 6 条(宫主度数)」的读法:27/30,并且 Indira 的巨蟹/摩羯变成平局。这个读法被否定,不提。 **Table 18 为什么复现不了:** - 原书 Indira 手算例(Page 62)的顺序是 (2) → 第二来源 → (3) → (4) → **(7)** → 「(5) 与 (6)」。最后一句是「Saturn is the Atmakaraka and has gained the highest longitude. Hence, we can take Cancer」。 - 可是土星**落在**巨蟹、**主**摩羯。照第 5、6 条字面(看宫主),两条都指向摩羯。 - 同一位命主,原书 Table 27 的软件裁决也是摩羯。 - 所以 Table 18 是原书手算例与原书规则、原书软件表三方不一致。不是我们的代码错。 **根因:** 方法差异 + 原书自相矛盾。网站没有调用错误。 **最小修复:** 不改代码。改的是任务书红线 3 的验收口径,见 §8 待产品决定。 **未确认:** - 第 1 级「占据星数」是否算罗睺 / 计都(第三批算了;占星师只说「数实际星体」)。 - 第 3 级同为尊贵时比最高等级还是比个数(第三批先比最高等级再比个数,是工程选择)。 - Wadiyar 两对与两处双主星的差异原因。 - 分盘(D3/D4/D9/D10/D12/D16/D20)的 14 张软件表未核。 ## N2 Narayana 子运 **已有能力(上游 `calc_narayana_antardasha`):** | profile | 起点 | 方向 | 适用边界(上游自己写的) | |---|---|---|---| | `rath_table13_equal_v1` | 大运星座 | Table 13 按起点星座 | 排序表;土星 / 计都在大运宫时拒绝运行 | | `rath_table25_lord_start_v1` | 大运宫主所在星座 | Table 13 / 11 / 14 按起点星座 | 书例复现,opt-in,「不是全局默认」 | | `parashara_equal_v1`(配 `rath_p36…`,Padanadhamsa 走这条) | 大运宫与第 7 宫较强者的宫主所在星座 | 按**大运星座**奇偶 | 无土星 / 计都例外 | **原书原文(Page 47–48):** - 正文(BPHS 50.30-31):比大运宫与其第 7 宫,较强者的宫主所在星座起;方向「依大运星座奇偶」。 - J.S. 2.4.31-32 的说明:「大运星座为奇,**或其宫主落奇宫**,则顺行」。 - 土星在大运宫:子运一律顺行。 - 计都在大运宫:子运反向(Table 14)。 - Table 13 的行按「起点(Arambha)星座」排。 **用原书 Table 25(Wadiyar,36 行子运)核对:** | 做法 | 巨蟹大运 | 双子大运 | 金牛大运(土星在内) | |---|---|---|---| | 原书 | 天秤起顺行 | 金牛起逆行 | 巨蟹起顺行 | | 上游 `rath_table25_lord_start_v1` | 12/12 | 12/12 | 12/12 | | 第三批(问 4 起点 + Table 13 按起点星座) | 12/12 | **0/12**(N1 判射手更强,从木星所在巨蟹起) | 12/12 | | 上游 `parashara_equal_v1` + `rath_p36…` | 方向反了 | 平局拒绝运行 | 方向反了(没有土星例外) | - 原书这张表的方向跟随**起点星座**奇偶(与 J.S. 说明的「宫主所落」一致),不跟大运星座奇偶。这和原书 p.47 正文不一致。 - 第三批选了「按起点星座」,有书例支持,但占星师问 4 没有裁方向。 - 双子大运那 12 行的差异来自 N1 的强弱判定,不是子运规则本身。 **根因:** 方法差异。上游 Padanadhamsa 那条路对 Table 25 方向错、缺土星 / 计都例外,是上游缺陷,见 §9。 **未确认:** 方向按大运星座、起点星座,还是 J.S. 的「大运星座或宫主所落」三选一,需占星师定。 ## T1 年主比强弱的 Panchavargiya **已有能力:** - 上游 `scripts/tajika.py:_calc_native_panchavargiya_bala`:Kshetra(graha_bala)30 + Uchcha 20 + Hadda 15 + Drekkana 10 + Navamsa 5 = 80,除以 4 得满分 20。 - 关系按 Tajika 宫距:3/5/9/11 友、2/6/8/12 中、1/4/7/10 敌。 - 规则表 `references/tajika_panchavargiya_rules.json`,来源注明 K. S. Charak《A Textbook of Varshaphala》与 Shanker Adawal 公开页。 - 上游只在 `calc_tajika_strength_layers`(力量报告)里调用它。 **上游年主路径:** `calc_panchadhikari_year_lord` → `_resolve_year_lord_panchavargiya_score`。 - 本机能 import PyJHora 时,进程内调 PyJHora。 - 否则退回 `native_proxy`(`_calc_panchavargiya_bala_for_planet`,D1/D2/D3/D9/D12 庙旺分)。 - **从不调用正式五分法。** 实测上游 CLI `tajika` 在本机输出 `engine: pyjhora`,直接调函数输出 `native_proxy`:同一输入,结果随环境变。 **网站:** - staging 部署版:一律 `native_proxy`,卡片标「Panchavargiya 为本地近似计算」。 - 第三批:改用正式五分法(`engine: tajika_native_five_fold`),缺星时 blocked,不再退回近似。规则 JSON 与上游逐字节相同。 **同一年盘的分数对比(标准盘 1963,2025 年返照,满分 20):** | 星 | 正式五分 | 近似 | |---|---|---| | 太阳 | 10.01 | 14.0 | | 月亮 | 5.31 | 12.0 | | 火星 | 11.69 | 12.0 | | 水星 | 11.97 | 12.5 | | 木星 | 11.12 | 14.5 | | 金星 | 8.48 | 14.0 | | 土星 | 7.44 | 12.5 | 这张盘的年主因此由土星(近似)变火星(正式)。 **根因:** 网站沿用近似值(第二批的工程选择)。上游年主路径有同一缺陷。 **未确认:** 正式五分法没有外部同盘逐分量对照。上游有 PyJHora 侧车对照通道,CI 没有 PyJHora。 ## T2 Muntha **两个入口:** - `calc_muntha(birth_asc_idx, age)`:本命上升 + 年数,正确。 - `calc_panchadhikari_year_lord`:Muntha 主候选用 `(annual_asc_sign_idx + years_from_dob) % 12`,即年盘上升 + 年数。 **上游同一响应自相矛盾(最小复现):** 上游 `c7117f92`,`python3 scripts/jyotish_engine.py tajika --year 1963 --month 8 --day 7 --hour 21 --minute 15 --lat 21.4667 --lon 84.0167 --tz 5.5 --age 62 --ayanamsa lahiri` - `muntha.muntha_sign = Taurus`(本命双鱼 + 62); - `year_lord.muntha_sign = Pisces`(年盘摩羯 + 62)。 - 候选因此漏了正确 Muntha 主「金星」。 另有两处 Muntha 写法:`scripts/muntha.py:calc_muntha_from_sun_sign`(从太阳星座起)和 `varshaphala._calc_muntha`。网站产品路径不走这两处。 **网站:** - `tajika_year_lord.select_annual_year_lord` 显式传 `muntha_sign_idx = 本命上升 + 已满年数`(BUG-1212,第五轮问 6 维持)。 - 年主、卡片、Tri-Pataka 用同一个值。 - 「Muntha 星座」和「它落年盘第几宫」是两回事:网站只用星座选年主,宫位只在报告解释层显示。 **根因:** 上游缺陷。网站已修。 ## T3 Mudda Dasha **已有能力(上游 `tajika.py`):** - `calc_mudda_dasha`:年主起排,旧。 - `calc_mudda_without_dasha_balance`:p135 无余额,也从年主起。 - `calc_mudda_with_dasha_balance`:起运星 = (已满年数 + 出生月宿序号 − 2) mod 9;余额来自本命月或年盘月;在返照时刻截断。 **上游实际调用:** - 只有 `annual_tajika_pack.py` 用新函数。 - 上游 `cmd_tajika` 和 full-reading 第 9 步仍用 `calc_mudda_dasha`(年主起)。 - full-reading 第 9 步的年主还是 `calc_year_lord`(Muntha 主即年主),与 `cmd_tajika` 的 Panchadhikari 不同。上游三条入口三种口径。 **网站第三批:** `scripts/tajika_mudda.annual_mudda_dasha` 原样包上游新函数。 - 余额取本命月;年长 `solar_year_365_25`(另有 `savana_360` 只供研究)。 - `cmd_tajika`、full-reading 第 9 步、`solar_return_full_report` 共用 `_tajika_annual_core`,口径一致。 - 有「只改年主,Mudda 不变」的测试。 **根因:** 网站旧方法,第三批已改。上游主入口未改,是上游缺陷。 **未确认:** - 年长 365.25 天还是 360 天,占星师未裁。 - 第三批把状态写成 `partial_verified`,上游同一函数标 `parameter_sensitive`(日期未经外部同盘对照)。建议页面口径跟上游,`upstream_status` 字段已保留。 ## S1 太阳返照时刻错位(新发现,网站缺陷) **现象:** 同一张盘、同一岁差,网站算出的返照时刻比上游晚或早几分钟。 - 例:标准盘 2025 年,网站 18:24:47、上游 18:31:03,差 6 分 16 秒。 **根因:** - 网站 `solar_return.calc_solar_return_chart` 的目标经度取自出生盘 `compute_chart_data` 的太阳经度。 - 求解器 `_find_solar_return_swe` 用 `swe` 恒星参考系逐步逼近。 - 两套参考系对出生太阳差 15.1″,折合返照时刻约 6.3 分钟。 - 网站还把返照时刻截到整分钟再起年盘(丢秒)。 - 上游 `7cc6425d`(2026-09-08,出生太阳改在求解器同一参考系重算)和 `46ed9399`(2026-09-07,保留秒)已修。 - 网站引擎同步停在 2026-09-03 的 `f2241463`,漏了这两处。与 ERR-109「同步太阳返照时只核对函数在不在」同类。 **独立复核:** 用 PyJHora `drik.next_solar_date` 算 5 个样本年(乔布斯 2012/2015/2024、齐达内 2002、小布什 2007)。 - PyJHora 与「同一参考系 + 保留秒」版本相差 0.0 分钟; - 与网站现状相差 −7.2~+6.8 分钟。 **影响面(9 位公开名人 × 2000–2026 年 = 243 张年盘,Lahiri,第三批代码):** | 指标 | 结果 | |---|---| | 返照时刻最大偏差 | 7.2 分钟 | | 年盘上升星座改变 | 13/243(5.3%) | | 昼夜判定改变 | 0/243(本样本没有返照时刻正好落在日出 / 日落前后几分钟的) | | 年主改变 | 11/243(4.5%) | 例:乔布斯 2012 年盘上升金牛 → 白羊,年主金星 → 太阳;奥巴马 2024 年盘上升双鱼 → 白羊,年主月亮 → 土星。 - 受影响的是用户可见的年盘上升、年主、Mudda 起点时刻、Sahams。 - 校正打分不用年盘(`solar_return.py`、`tajika.py` 不在冻结清单),v5 不受影响。 **最小修复:** 见 `docs/tasks/TASK-annual-return-frame-20261003.md`。必须排在第三批合入之后(两边都改 `solar_return.py`)。 ## 7. 本命原始数据对齐 - 三张盘(标准盘 1963、Wadiyar 1884、Indira 1917)× 平均 / 真交点,上游与网站 `compute_chart_data` 的上升与九星经度:最大差 0.0038°(真交点算法细差约 14″),月亮差 0.0001°,其余相同。星座、宫位不受影响。 - 未核:分盘、Karaka、功能吉凶、Shadbala 各分量、原始与净化 Ashtakavarga、Vimshottari 余额与日期。不在本轮五个点范围,写为未核,不写为一致。 ## 8. 待产品决定 1. **第三批红线 3 改口径**(推荐):验收集改为 Table 15、Table 17 起运宫 + 原书 5 张 D1 软件表 30 对强弱(现 28/30)+ Table 25 子运 36 行。 - Table 18 记作「原书手算例与原书规则、原书 Table 27 互相矛盾」,只能显式指定起运宫复现(现已 12/12),不再要求通则自动复现。 - 若维持原红线,Rath 版永远上不了线。 2. 太阳返照修复单是否开工(推荐开,排在第三批之后)。 ## 8.1 第六轮请占星师复核(草稿,按页码给原文) 1. **第 6 条用不用。** Page 32 正文说 Narayana 用 (2)(3)(4)(6) 和 (7) 或 (8),脚注 27 说只用 (2)(3)(4) 加第二来源。您第五轮把「宫主度数」放在第 5 级,我们照做。用原书 5 张软件表核对是 28/30;去掉这一级是 27/30。请确认保留。 2. **Indira 例。** Page 62 先用 (7),再用「(5) 与 (6)」,以「土星是 AK、度数最高」取巨蟹。但土星落巨蟹、主摩羯,字面上两条都指向摩羯;原书 Table 27 对同一人也判摩羯更强。请确认 Table 18 按「书内特例、需显式指定」处理,不进通则。 3. **Wadiyar 两对。** 双子/射手、处女/双鱼,原书软件表取双子、处女,通则第 5 级取射手、双鱼(水星 1.3° 对木星 10.0°)。是否有我们漏掉的规则? 4. **子运方向。** p.47 正文「依大运星座奇偶」;J.S. 2.4.31-32「大运星座为奇或其宫主落奇宫则顺行」;原书 Table 25 三段都跟起点星座奇偶。取哪一种? 5. **Mudda 年长。** 365.25 天还是 360 天? 6. **占据星数**是否计罗睺、计都? ## 9. 给上游的缺陷报告(最小复现,供转发) 1. **Muntha 两口径。** 见 T2 的复现命令。修法:`calc_panchadhikari_year_lord` 的 Muntha 用本命上升 + 年数,或由调用方传入。 2. **年主 Panchavargiya 不用正式五分法,且随环境变。** `_resolve_year_lord_panchavargiya_score` 只走 PyJHora(进程内)或 `native_proxy`;同一输入在有 / 无 PyJHora 的机器上分数不同。修法:改用 `_calc_native_panchavargiya_bala`,PyJHora 只做对照。 3. **Mudda 三条入口三种口径。** `cmd_tajika`、full-reading 第 9 步用 `calc_mudda_dasha`(年主起),`annual_tajika_pack` 用月宿起。full-reading 年主用 `calc_year_lord`,不是 Panchadhikari。 4. **Padanadhamsa 的 Rath 子运。** `parashara_equal_v1` 按大运星座奇偶定方向、无土星 / 计都例外;对 Table 25 三段大运都不符,而上游自己的 `rath_table25_lord_start_v1` 回放 36/36。 ## 10. 环境与边界 - 未改网站代码、未改上游、未推代码分支。 - 原书 PDF 只在会话临时目录比对,未入库。 - PyJHora(AGPL)只做外部数字对照,没有代码进入网站仓。 - 本文复跑脚本在会话临时目录。要固化成测试的,写在修复单里。