Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
20 KiB
20 KiB
PROGRESS:占星师口径第二批(D9 修饰、Tajika 年主、Narayana Rath 版)— 2026-10-03
- 任务书:
docs/tasks/TASK-astrologer-rulings-batch2-20261003.md。执行方:Claude 子代理(产品负责人要求直接执行)。 - 分支
codex/astrologer-rulings-batch2-20261003,工作树.worktrees/astrologer-rulings-batch2-20261003,基线origin/staging=52b3061f。未推送。 - 上游:
/workspace/yinduzhanxingorigin/main=c7117f92(与任务书一致;只读,未提交、未推送)。 - BUG 编号:开工时最大号 BUG-1212;本单 BUG-1213~1215。
结论
| 任务 | 结果 |
|---|---|
| T1 五大人格 D9 落陷只算减弱 | 完成(BUG-1213) |
| T2 Tajika 年主 Panchadhikari | 完成(BUG-1214);同输入与上游函数逐项相同 9/9 |
| T3 Narayana Rath 版 | 实现并按原书样表回放:给定原书起运宫时大运顺序与年数 36/36 全对;起运宫只对 1/3(Table 17 选出处女、原书双鱼;Table 18 平局、原书巨蟹)→ 红线 2:未接任何用户可见面与打分 |
| T4 旧 Narayana 如实标注 | 完成(BUG-1215) |
| T5 Rath 版替换校正试算 | 未做(红线 2 / 让步顺序:T3 样表不过就停在 T3);研究记录写明原因 |
| 生时校正 | 本单没有改动任何冻结身份文件(PRODUCTION_FILES 与 dataset frozen_scoring.files),无需重新冻结;v5 77 例改前改后逐项相同;不升打分版本 |
环境
| 项 | 实际 |
|---|---|
| Python | 无 .venv,全部用系统 python3(3.13.5)。本机用户目录装了 PyJHora 4.8.7(API 镜像与 CI 都没有) |
| Node | /exec-daemon/node v22.14.0(scratchpad 临时 bin 软链);frontend/node_modules 软链到同 lockfile 的 .worktrees/consult-career-yoga-functional-20261002/frontend/node_modules |
| 磁盘 | 开工 45G 可用;评测前 45G |
| 预检 | pre_work_check.py exit 0 |
| 模型 key | 无 → 名人生平回测未跑(BLOCKED) |
next build |
未跑(node_modules 为软链,Turbopack 拒绝;本单不改页面与路由) |
| 一次性工作树 | .worktrees/batch2-baseline-52b3061f(基线)、.worktrees/batch2-eval-921b336b(改后评测),均 --detach 新建,未切换任何别人的工作树分支 |
提交与任务对应
| 任务 | 提交 | BUG |
|---|---|---|
| T1 | bc03bba2 |
BUG-1213 |
| T2 | 0afcc2d9 |
BUG-1214 |
| T3 | 7cb332bc |
BUG-1215 |
| T4 | 9eb22f63、693467bf(卡片字数预算补修) |
BUG-1215 |
| golden 重采 | 921b336b、693467bf |
— |
| 记录(BUG 历史、CHANGELOG、本文件、任务索引、BLOCKED、T5 研究记录) | 最后一个 docs 提交 | — |
实现说明
T1(BUG-1213)
pancha_mahapurusha.detect_pancha_mahapurusha:D9 落陷 →status: formed、d9_dignity_modifier: "weakened"、d9_sign,原因「D9 落陷,兑现减弱」,强度部分减弱。D1 条件不成立才是not_formed(include_not_formed=True时返回该行)。- 「调用方都传 D9」的做法:检测器在没收到
navamsa_sign时由经度推出 D9(与main_yoga_detectors.with_navamsa同公式),所以_detect_yogas(卡片chart.yogas)、规则引擎(报告、卡片筛选)、/api/pancha_mahapurusha(_compute_pmc)都检查,不必逐个改调用方。规则引擎行与 API 行带d9_dignity_modifier。 - 9 位公开名人:五大人格星都不在 D9 落陷(奥巴马萨萨 D9 水瓶、嘉兰巴德拉 D9 射手),卡片与报告结论不变;golden 只多
d9_dignity_modifier: null。
T2(BUG-1214)
- 从上游
c7117f92原样移植:calc_panchadhikari_year_lord、TRI_RASI_DAYTIME_LORDS / NIGHTTIME_LORDS、PLANET_TO_INDEX / INDEX_TO_PLANET、_PYJHORA_PVB_SIDECAR_CACHE、带岁差参数的_resolve_year_lord_panchavargiya_score/_external_pyjhora_panchavargiya_score*、references/tajika_panchavargiya_rules.json(git blobe8c15ac3与上游一致)及其加载器。本仓原有的三个 PyJHora 查询函数引用了未定义的名字(无调用方,所以没暴露),一并由移植修好。 - 没有移植:上游
_resolve_external_pyjhora_python的差异(多了.workbuddy路径候选,AGENTS §9 不得把镜像当运行主仓)、上游saham_daynight的昼夜判定修改、上游_calc_native_panchavargiya_bala(规则 JSON 的消费者,不在授权范围;年主选法本身也不用它)。规则 JSON 已入库并有加载,但目前没有消费者——列入下轮问题。 - 本地差异两处(都写在代码与 BUG 记录里):
- Muntha:上游 Muntha 主候选 = 年盘上升 + 年数;本仓 Muntha = 本命上升 + 已满年数(问 3 维持)。加关键字参数
muntha_sign_idx,生产调用方传入;不传与上游一致。 - Panchavargiya 引擎:上游把年盘 JD 交给 PyJHora,本机有 PyJHora 时进程内调用,且不设岁差(全局状态),同一输入跨进程得分不同(实测 9 盘里 9 盘候选分数不同、1 盘年主不同);生产与 CI 没有 PyJHora。产品路径因此一律用
native_proxy,标注「Panchavargiya 为本地近似计算」;JYOTISH_YEAR_LORD_PYJHORA_REFERENCE=1恢复上游查询,仅研究用。
- Muntha:上游 Muntha 主候选 = 年盘上升 + 年数;本仓 Muntha = 本命上升 + 已满年数(问 3 维持)。加关键字参数
- 两个生产者(
solar_return_full_report、cmd_tajika)共用tajika_year_lord.select_annual_year_lord;cmd_tajika现在自己算一次太阳返照盘。冲突门照常比较(测试三年同盘两侧一致)。 - 输出:
candidates(上游原样)、candidate_list(来源、星、星座、吉 / 凶相位照年盘上升、Panchavargiya 分数、engine、是否当选)、selection_basis、selection_basis_text(中)/_en、muntha_basis、source。卡片varshesha_basis与报告两处「Selection basis」显示这句话;英文版靠pl9_reader_english_terms.REGEX_EN五条模板。 - 年运里 Mudda Dasha 与 Tri-Pataka 从「年主」起排(原逻辑),所以随新年主变化——卡片 golden 的 Mudda 分段因此变了(3 张盘里 3 张
varshesha_basis变、1 张年主变)。 - 上游
tests/test_tajika.py没有 Panchadhikari 用例;上游tests/test_cli_smoke.py的两条年主用例依赖私有本地盘(domi_birth_args,没有时 skip),未移植。改为tests/test_tajika_panchadhikari_year_lord.py(合成经度覆盖四个分支)。
9 位公开名人 2026 年年盘:本仓 vs 上游 c7117f92
同输入(同一张太阳返照盘、上游签名、不传 muntha_sign_idx、无 PyJHora)调用两边的 calc_panchadhikari_year_lord:9/9 逐项相同(上游函数在上游 scripts/ + references/ 抽出的独立目录里运行)。产品路径与上游的差别只来自 Muntha 起点:
| 名人 | 旧年主(Muntha 主) | 上游年主(选法) | 本仓年主(选法) | 本仓 Muntha / 上游 Muntha |
|---|---|---|---|---|
| 乔布斯 | 太阳 | 金星(凶相位最强) | 金星(凶相位最强) | 狮子 / 天秤 |
| 奥巴马 | 水星 | 水星(唯一吉相位) | 水星(唯一吉相位) | 双子 / 水瓶 |
| 泰勒 | 水星 | 水星(吉相位最强) | 水星(吉相位最强) | 处女 / 天秤 |
| 梦露 | 火星 | 水星(吉相位最强) | 月亮(吉相位最强) | 天蝎 / 双子 |
| 嘉兰 | 土星 | 火星(唯一吉相位) | 火星(唯一吉相位) | 水瓶 / 狮子 |
| 皮雅芙 | 土星 | 火星(唯一吉相位) | 火星(唯一吉相位) | 水瓶 / 处女 |
| 卡罗 | 月亮 | 土星(吉相位最强) | 土星(吉相位最强) | 巨蟹 / 射手 |
| 小布什 | 木星 | 月亮(凶相位最强) | 月亮(凶相位最强) | 双鱼 / 狮子 |
| 齐达内 | 火星 | 太阳(唯一吉相位) | 火星(唯一凶相位) | 天蝎 / 狮子 |
年主相对旧口径变了 6/9;本仓与上游不同 2/9(梦露、齐达内),都是 Muntha 起点不同造成的。
T3(BUG-1215,未接)
- 新
scripts/narayana_rath.py(不改冻结的narayana_dasha.py,复用其中 Table 10/11/13/14、select_narayana_seed_sign、年数与双主星函数)。年数用jaimini_odd_footed_dignity_v2(账本upadesa_1125_1126_odd_even_count、upadesa_1127_fixed_sign_exception、upadesa_bphs_exalt_debil_adjustment),双主星jaimini_dual_lord_source_v1(upadesa_dual_lord_strength_chain,账本标 partial)。计都在起运宫时大运把 Table 10 方向反过来(账本只给了子运表 Table 14);子运从大运星座起 12 等分,土星在该宫用 Table 11、计都用 Table 14。第二周期 12 减首周期年数。 - 输出:
profile: sanjay_rath、seed_sign、seed_basis、direction、dual_lord_rule、mahadasha(含年数)、source、status(平局为parameter_sensitive,alternatives列两种起法)。 - 移植(原样,blob 与上游一致):
references/oracle/sanjay_rath_narayana_book_ledger_2026_08_28.json、docs/research/sanjay_rath_narayana_book_ledger_2026_08_28.md、references/oracle/chara_narayana_book_golden_cases_2026_08_28.json。注意:任务书说三张 Rath 样表在chara_narayana_book_golden_cases里,实际该文件是 K.N. Rao / Goel 的 Chara、Narayana 样表;Rath 的 Table 15 / 17 / 18 在规则账本 JSON 的golden_cases里。两份都已移植。 - 样表盘出生资料(公开资料,fixture 注明出处):Sri Aurobindo 1872-08-15 05:00 LMT 加尔各答;书中「标准盘」1963-08-07 21:15 IST Sambalpur;Indira Gandhi 1917-11-19 23:11 IST Allahabad。Lahiri。
| 样表 | 原书起运宫 | 本仓选出 | 顺序(给定原书起运宫) | 年数(给定原书起运宫) |
|---|---|---|---|---|
| Table 15 | 巨蟹 | 巨蟹 ✓ | 12/12 | 12/12 |
| Table 17 | 双鱼 | 处女 ✗ | 12/12 | 12/12 |
| Table 18 | 巨蟹 | 平局(巨蟹 / 摩羯) | 12/12(土星在巨蟹 → Table 11) | 12/12 |
- 差距分析与两种可能的修法见
docs/research/narayana_rath_rectification_trial_2026_10_03.md。这需要占星师给口径,不能自己拟合。 tests/test_narayana_rath_book_tables.py把现状钉住(含「没有任何脚本导入narayana_rath」),口径确定后同步改测试。
T4(BUG-1215)
- 新
scripts/narayana_legacy_label.py,在消费层(咨询modules.narayana_dasha、全量解读 Step 4.13、cmd_narayana_dasha)加profile: legacy_reference_only、algorithm_note(「旧算法(从上升起、一律顺行),待替换为 Sanjay Rath 版」及英文)、algorithm_label(「旧算法(从上升起、一律顺行)」)。narayana_dasha.py在冻结身份里,不动(ERR-115 做法)。 - 用户可见处:咨询数据卡
timing.narayana.algorithm(原样抄短标签);参考版报告「Narayana Dasha 交叉时间轴」段和 dasha 家族表 p89 加「算法:…」行(英文版有对照);CLI 文本输出。读者版(reader_main)不显示 Narayana,星盘页不显示 Narayana(只有审计面板一行静态技法名),前端个人报告的「Narayana 大运」证据行读的键与引擎实际输出不符、对真实数据不出现——这三处未改。 - 卡片字数:全文标签让乔布斯婚恋卡到 12,028(上限 12,000)。卡片改抄引擎给的短标签,Narayana 子运 / 次子运行去掉
years(可由起止年龄算出);最大卡 11,979(基线 11,983)。 - K.N. Rao:全仓用户可见文案没有挨着 Narayana 的「K.N. Rao / kn_rao」;唯一相关处是
narayana-dasha命令行没有使用方的--variant-profile(选项里有kn_rao),已删。report_builder.py的「Parashari Jyotish | KN Rao School」不涉及 Narayana,未动。
改动的既有断言(原值 / 新值 / 原因)
| 文件 / 测试 | 原值 | 新值 | 原因 |
|---|---|---|---|
tests/test_pancha_mahapurusha_main_detector.py::test_d9_debilitation_still_cancels_when_the_caller_gives_d9 |
给 D9 落陷 → is_valid False、cancelled;不给不查 |
改名 test_d9_debilitation_only_weakens:formed、weakened、原因「D9 落陷,兑现减弱」;不给也由经度推出 |
问 1(BUG-1213) |
同文件 test_a_rejected_yoga_does_not_come_back_by_another_path |
被拒样例 = 上升巨蟹木星入旺但 D9 落陷 | 被拒样例 = 双鱼上升、木星巨蟹第 9 宫(D1 不成立) | D9 落陷不再拒绝格局 |
同文件 test_reduced_yoga_reaches_the_card_with_its_reasons |
土星摩羯 10° | 土星摩羯 2°,断言不变 | 摩羯 10° 的 D9 是白羊(落陷),新规则会多一条减弱;本用例只测凶星照 |
tests/test_year_lord_basis_label.py 三条 |
「暂用 Muntha 主星;占星师口径为 Panchavargiya,待接入」;年主 == Muntha 主星 | 选法依据一句话(中 / 英、无中文残留);年主与 Muntha 主星都在候选里,Muntha 用本命起点 | BUG-1214 |
tests/test_report_reader_main.py::test_real_annual_producers_agree_without_identical_metadata |
左有 year_lord_sign、右没有 |
两侧年主、候选、选法一致 | 两个生产者同一选法 |
同文件 test_reader_annual_cells_use_real_distinct_years_and_keep_return_dates |
「Muntha 所在星座的守护星(当前本地口径)」(开工基线即失败:BUG-1212 改了该文案而本条未跟改) | 每个年度都有含「年盘上升」的选法依据 | BUG-1214 |
同文件 test_reader_annual_conflict_keeps_both_real_producer_values |
「太阳返照:火星;Tajika:金星(两者不同)」 | 「太阳返照:火星;Tajika:月亮(两者不同)」并断言两年年主 | 次年年主按新选法 |
frontend/tests/consult-evidence-card-20260927.test.ts |
— | 新增一条:timing.narayana.algorithm 为短标签 |
BUG-1215(新增,不改旧断言) |
测试
| 项 | 结果 |
|---|---|
| 新增 Python 测试 | test_tajika_panchadhikari_year_lord.py(15)、test_narayana_rath_book_tables.py(10)、test_narayana_legacy_label.py(4),T1 新增 3 条 |
| 定向回归(五大人格、格局合并、年运包、Muntha、读者版中英、英文版、太阳返照时区、Tajika、CLI 冒烟、咨询原生层、冻结完整性 / 新鲜度) | 全过;唯一失败 test_report_english_dictionary.py::test_every_han_string_has_an_english_sibling 开工基线同样失败(第一批给 mahapurusha_* 规则加的 reference_only_reason 没有英文对照),不在本单范围,未改 |
tests/run_all.py |
102/102 |
run_quality_gate.py --profile quick --skip-frontend-runtime(系统 python3) |
Quality gate passed,exit 0:1047 passed、1 skipped |
隐私 tests/test_repo_privacy_markers.py |
通过(记录提交后复跑) |
tsc --noEmit |
0 错 |
npm run lint |
0 error(126 warnings,与开工同数) |
npm test(Node 22.14) |
开工基线 4929 项 / fail 24 / cancelled 0;收尾 4929 项 / fail 24 / cancelled 0,失败清单与基线逐条相同(24 条均为 DB / Docker / 部署类)。确认门 rectification-confirmation-gate.test.ts 通过(本单未重新冻结,读取路径无需改)。中途一次多出 1 条(卡片 12,000 字预算),已在 693467bf 修复 |
生时校正评测(v5 77 例)
- 命令:
python3 scripts/research/holdout_v5_baseline.py --dataset v5 --out-dir <dir> --json-out <dir>/summary.json,PYTHONHASHSEED=0、JYOTISH_API_CHART_CACHE_TTL_SECONDS=0;改前52b3061f、改后921b336b(T1–T4 全部引擎改动之后;之后的693467bf只改前端、标签模块与 golden),各在一次性工作树。 - 本单无试算开关(T5 未做),「开关关闭时逐项相同」即改前改后逐项相同:
| 指标(v5 77 例) | ±10 | ±30 | ±60 |
|---|---|---|---|
| 先验头名 前 / 后 | 0.1818 / 0.1818 | 0.0909 / 0.0909 | 0.0779 / 0.0779 |
| 六题回放头名 前 / 后 | 0.6364 / 0.6364 | 0.4935 / 0.4935 | 0.3117 / 0.3117 |
| 线上区间回放头名 前 / 后 | 0.6623 / 0.6623 | 0.5584 / 0.5584 | 0.4026 / 0.4026 |
| 覆盖(回放)前 / 后 | 0.987 / 0.987 | 0.987 / 0.987 | 0.987 / 0.987 |
| 中位宽度(回放)前 / 后 | 13 / 13 | 33 / 33 | 65 / 65 |
| futile_collect 真值在区间(truth 方向)前 / 后 | 76 / 76 | 75 / 75 | 76 / 76 |
三段输出文件(sweep、cluster_width、合并 summary 含 futile_collect)去掉耗时与路径字段后 逐项相同(IDENTICAL ×3)。红线(任一档降 > 1pt)未触发。
- 冻结身份:本单改动的文件都不在
sealed_holdout_rerun.PRODUCTION_FILES与 datasetfrozen_scoring.files里,test_rectification_validation_integrity_gate/test_sealed_holdout_contract_freshness通过,无需按 ERR-110 重新冻结,rectification-confirmation-gate.test.ts的冻结记录路径不用改。ALGORITHM_VERSION仍为rectification-v5-matrix-scoring-10,不涉及 BUG-621。
名人生平回测
卡片字段变了(年运依据与 Mudda 分段、Narayana 标签、子运去 years)。本机无模型 key,未跑,写入 BLOCKED.md。
其他观察(不在本单范围,未改)
- 生产里
_resolve_external_pyjhora_python每张年盘会起一次子进程探测 PyJHora(python与python3路径不同时);产品路径现在不调用它,无影响。 - 上游
saham_daynight的昼夜判定已改为 Hindu rising 与同一民用日窗口,本仓未同步;9 盘年主比对没受影响,Sahams 的昼夜可能受影响,建议另开同步单。 - 第一批遗留:
test_report_english_dictionary基线即失败(见上)。
下轮问占星师
- Narayana 起运宫第二级(「木星、水星或宫主」那一级):是只数相位,还是同宫也算?木星既是木星又是该宫主时算一次还是两次?——原书 Table 17(双鱼起)只有「同宫也算、按身份各算一次」才对得上。
- Narayana 起运宫后续各级:前几级都打平时(Table 18 Indira:巨蟹有土星、摩羯有月亮,入旺、星座性质、宫主奇偶、大运年数都相同),下一级是「含 Atmakaraka 的宫」还是「宫主为 Atmakaraka 的宫」?原书选巨蟹(土星是 AK、在巨蟹)。各级的完整次序请给书页。
- 计都在起运宫时大运的顺序:账本只给了子运的 Table 14;大运是否同样把 Table 10 方向倒过来?土星、计都同在起运宫时谁优先?
- Narayana 子运起点:从大运星座本身起(Table 13),还是从大运宫主所在星座起(原书 Table 25 的例子)?
- Tajika Panchavargiya 的算法:年主比强弱用哪一套——上游现在用的是 D1/D2/D3/D9/D12 庙旺分(本地近似),还是规则 JSON 对应的 Tajika 五分法(Graha / Uchcha / Hudda / Drekkana / Navamsha,按 Tajika 友敌关系)?若是后者,我们照上游把它接上。
- Muntha 主候选:五类候选里的 Muntha 用「本命上升 + 已满年数」(我们)还是「年盘上升 + 年数」(上游)?9 盘里有 2 盘因此年主不同。
- Mudda Dasha 的起点:现在从年主起排(年主一变,全年月份分段都变)。经典是否从年主起,还是从出生月宿推算?
Claude 验收(2026-10-03)
- 快速门(
--skip-frontend-runtime,系统 python3)通过。T1、T2、T3 的定向测试 29 条全部通过。 tests/test_report_english_dictionary.py:第一批在yoga_rules.json新加的 23 条reference_only_reason只有中文写法的题号(甲5 / 乙14 / 甲7),缺英文对照,这条测试因此失败。快速门不包含它,所以第一批验收没发现。补修dda966e6,给每条加了reference_only_reason_en。yoga_rules.json不在校正冻结身份里,冻结新鲜度测试通过。- 前端:
tsc0 错;lint 0 error / 126 warning;npm test4929 项,fail 24,失败名单与第一批补修后的基线逐条相同(DB / Docker / 部署类),确认门测试通过。 - 校正打分文件(
active_rectification_event_engine、rectification/、narayana_dasha.py等)没有改动;v5 逐项相同(执行方三段对比)。 consultation-workflow.ts只在 timing 白名单里加了algorithmlabel,没有改提示词。- Rath 版:三张原书样表中只有 Table 15 起运宫对上,按红线 2 不接入任何用户可见面,T5 不做。原书起运宫给定时,顺序与年数 36 行全对,差距只在「命宫与第 7 宫谁强」的判定。已列为下轮问占星师的第 1、2 题。