Files
Jyotisha/docs/tasks/PROGRESS-astrologer-rulings-batch1-20261003.md
T
Jesse_ChenandClaude Opus 5.5 e7eeb4045a
Independent Staging Quality Gate / validate (push) Successful in 17m28s
Independent Staging Quality Gate / publish (push) Successful in 3m51s
docs(tasks): batch-1 acceptance notes
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 15:24:31 +08:00

18 KiB
Raw Blame History

PROGRESS:占星师口径第一批落地(低风险批)— 2026-10-03

  • 任务书:docs/tasks/TASK-astrologer-rulings-batch1-20261003.md;依据:docs/research/astrologer_rulings_2026_10_03.md。
  • 执行方:Claude 子代理(产品负责人要求直接执行)。分支 codex/astrologer-rulings-batch1-20261003,工作树 .worktrees/astrologer-rulings-batch1-20261003,基线 origin/staging = 60d065a8。未推送。
  • BUG 编号:开工时最大号 BUG-1203;本单 BUG-1204~1212。

环境

项 实际
Python 本机无 .venv,全部用系统 python3(3.13.5);PyJHora 4.8.7 已装(只在一个对照测试里 importorskip)
Node /exec-daemon/node v22.14.0(软链到 scratchpad 的 PATH 目录);frontend/node_modules 软链到同 lockfile 的 .worktrees/consult-career-yoga-functional-20261002/frontend/node_modules,未重装依赖
磁盘 开工 45G 可用,跑评测前 44–45G
预检 pre_work_check.py exit 0(remote verified,focused 5 目标全过)
模型 key 无(环境变量里没有任何模型凭据)→ 名人生平回测未跑,见「环境缺口」
next build 未跑:node_modules 是工作树外软链,Turbopack 拒绝(记忆中的已知限制);本单不改页面/路由,首屏 gzip 未测 → 环境缺口

提交与任务对应

任务 提交 BUG
T6 8 星制 Karaka 排位 0cf2249e BUG-1204
T8 落陷取消改条件清单 df21e591 BUG-1205
T2 Kemadruma 主检测器 6916bbae BUG-1206(关联 BUG-1187 遗漏)
T1 五大人格主检测器 de793901、b1185c63(全量解读传逆行标记) BUG-1207
T3 Shadbala 达标在前 5fdf2f74(卡片行精简在 0d6af77c) BUG-1208
T7 八分法净化接入展示 ea78804b BUG-1209
T4 Bhava Bala 正式三分量 6feb1a4a BUG-1210
T5 罗计不设本宫、固定主星(单独提交) b0329ef0 BUG-1211
T9 年主标注 eb00b0f7 BUG-1212
golden 重采(证据卡、名人回测) 0d6af77c —
研究记录重新冻结(ERR-110) 9392f060 —
T10 记录(BUG 历史、CHANGELOG、本文件、任务索引、BLOCKED) 最后一个提交(docs) —

关键实现说明(与任务书的出入)

  1. 主检测器的接法:新建 scripts/main_yoga_detectors.py,把五大人格(pancha_mahapurusha.py)、Kemadruma(yoga_expansion.detect_kemadruma)、落陷取消(yogas_doshas.calc_nicha_bhanga_raj_yoga)转成规则引擎同形的行(中英双份),由 YogaEngine.detect 追加。yoga_rules.json 的同名规则加 reference_only: true + reference_only_reason(保留来源与逻辑,不求值),共 23 条:mahapurusha_*×10、moolatrikona_*×5、hamsa_trikona、bvr_maalavya_yoga(任务书未列,同名 BVR 重复规则,同样不做破格)、kemadruma_yoga、kemadruma_variant、neechabhanga_*×4。这样报告(modules.yoga)、卡片(chart.yogas + 规则引擎 → 筛选 → traditional_yogas)读到的是同一个结论。
  2. T1 D9 落陷:定稿未提,保留「D9 落陷判不成立」。代码事实:主检测器只在调用方传 navamsa_sign 时检查,产品路径(_detect_yogas、规则引擎、报告)都不传,所以这一条现在实际上不生效;本单未启用(启用即改变结论,等占星师答复)。
  3. T1 凶星照:用仓内 Parashari 整宫 drishti(aspects.calc_house_aspects 同规则):太阳 7、火星 4/7/8、土星 3/7/10;罗计不照(与 consultation_native_layers.DRISHTI_RULE 一致)。
  4. T1 报告与卡片燃烧口径:九盘核对时发现嘉兰的报告写「燃烧 14° 以内」、卡片写 12°——报告路径 cmd_yoga 的行星串不带逆行标记。de793901 让 cmd_yoga 生日路径带经度与逆行,b1185c63 让全量解读的 varga 重跑在行星串第 5 段带 R。
  5. T2 BUG-1187 遗漏:yoga_rules.json 两套 Kemadruma 里 kemadruma_variant 确实仍计罗计;另外 yoga_engine._detect_solar_lunar_yogas(算法版月前/月后/月双夹、日前/日后/日双夹)仍把太阳、月亮、罗计算作邻星——泰勒盘「计都在月亮第 12 宫」出 Anapha 与 Kemadruma 同盘即来自这里。已改为只数五星,BUG 历史按「复发自 BUG-1187(遗漏面)」记录。divisional_yoga 分盘版按不存在的 house 字段比相邻(永远判孤月),改为按星座相邻。
  6. T3:shadbala.py 在冻结身份里,展示字段放在新 scripts/shadbala_display.py(ERR-115 的做法)。卡片每星只留 rupas / minimum_check / level:引擎另三个字段语义重复,全部带上会让乔布斯 general / career 卡超过 12,000 字预算(12,166 / 12,250),精简后回到预算内。
  7. T4:shadbala.calc_bhava_bala 改名 calc_local_bhava_score 并移出 calc_shadbala 返回值(原 bhava_bala 键就是报告表的来源);全量解读改用 bhava_bala.bhava_bala_from_chart(宫主 Shadbala Virupa + Bhava Dig + Bhava Drishti,等宫,同 /api/bhava_bala)。本地评分的其他使用者:无(remedies、健康叙述只读 Shadbala Rupa)。bhava_bala.py 自带的 60/50/40… 分档不是经典口径,报告不显示。
  8. T7:ashtakavarga.py 删去 calc_sodhita_av(无人再用)。新链路 scripts/ashtakavarga_shodhana.py 用仓内既有两函数;占星宫只数七星(PyJHora 把罗计和上升标记也算占星,且只在每颗星自己的两宫上做单宫主净化——两点列入下轮问题)。经典例题:PVR 书 Exercise 22 / Chart 7 的 BAV(PyJHora 自带)做三方净化逐行对照,并与 PyJHora _trikona_sodhana 一致;单宫主净化逐条规则测。报告 SAV 表、宫位表、BAV 表,卡片 sav_by_house(sav_sodhita 在前、sav_score 原始,另带 sav_columns 说明),个人报告 savScores(score 净化后、rawScore 原始,schema 新增可选字段),事实表都已两列并列。过运(慢星过运 sav、双重过运、gochara)仍是原始点数,相关测试未改。
  9. T5:只删罗计「本宫」判定;jyotish_engine 本来就没有罗计庙旺表,未新增。yoga_engine 默认固定主星,_stronger_co_lord 只在 dynamic_co_lords=True 时用(目前无调用方);narayana_dasha 不动。
  10. T9:Muntha 主路径是 solar_return._muntha_from_natal_ascendant(本命上升, 已满年数),测试锁定;muntha.py(含 calc_muntha_from_sun_sign)没有任何脚本导入。
  11. density 夹具:report-density-fictional-engine.json 是 09-23 冻结快照、无采集脚本。只把 worksheets.strengths_and_scores.ashtakavarga 这一叶用真实引擎按夹具自带输入重采(scripts/research/refresh_density_fixture_ashtakavarga.py);bav、sav 与旧值相同,其余叶逐字节不变(脚本核对)。

改动的既有断言(原值 / 新值 / 原因)

文件 / 测试 原值 新值 原因
tests/test_consultation_yoga_detection_merge.py::test_traditional_yogas_closed_list_only_and_fixed_label 闭列表名 Neecha Bhanga Raja Yoga 落陷取消(Neecha Bhanga) 乙14(BUG-1205)
tests/test_pancha_mahapurusha_self_conjunction.py::test_another_malefic_in_the_same_sign_still_cancels_and_is_named is_valid False,原因在 cancellations is_valid True、strength reduced,原因在 reductions 甲5:凶星同宫只减弱(BUG-1207)
同文件 test_benefic_yoga_planet_unchanged Hamsa is_valid False is_valid True、reduced 同上
tests/run_all.py t31 燃烧 → is_valid False 燃烧 → is_valid True、reduced(输入改为真实摩羯座经度 280/283) 甲5;原输入 degree=50 不在摩羯座
tests/run_all.py t32 逆行 → is_valid False 逆行 → is_valid True、full 甲5:逆行不破格
tests/run_all.py t54 求值规则 ≥ 400 求值 + reference_only ≥ 400(378 + 23) 23 条规则改 reference_only
tests/run_all.py t1 / t57 导入 calc_sodhita_av;每格 ≤ 8 导入 ashtakavarga_shodhana.sodhita_chain;每格 ≤ 原始 BAV BUG-1209 删除旧函数
tests/test_report_chart_blank_columns.py 两条(BUG-1200) 表头 House/Sign/SAV/Lagna BAV/SAV + Lagna,原始值在第 2–4 列 表头加 Sodhita SAV、原始列标 Raw,原始值在第 3–5 列,合计行多一格 乙8:净化值为主值
tests/test_shadbala_complete.py::TestBhavaBala 五条 调用 calc_bhava_bala 调用 calc_local_bhava_score(断言不变) 甲13 改名(BUG-1210)
tests/test_report_longform_gaps2.py 夹具行为本地评分形状;标题「Bhava Bala(本地三分量评分)」 夹具行为正式三分量;标题「Bhava Bala(三分量)」并断言整行 甲13
frontend/tests/report-fact-tables.test.ts(density golden) SAV 表 cells[1] = 原始;subtables[0] = 原始 BAV cells[1] = 净化后、cells[2] = 原始;subtables[0] = 净化后 BAV、[1] = 原始 BAV;列名断言 乙8
frontend/tests/consult-evidence-card-v2-20260927.test.ts career 10H 行键 sign/sav_score/level sign/sav_sodhita/sav_score/level,加 sav_columns 断言 乙8
同文件 annual 年盘键列表无 varshesha_basis 加 varshesha_basis 甲11(BUG-1212)
frontend/tests/consult-career-yoga-functional-20261002.test.ts Obama 名单含精确字符串 Sasa Yoga、Neecha Bhanga Raja Yoga Sasa Yoga… 前缀、落陷取消(Neecha Bhanga)(…成立条件:…),且全部不含 raja 乙14 / 甲5

测试

项 结果
新增 Python 测试 test_chara_karaka_8_bphs_order.py、test_neecha_bhanga_conditions.py、test_kemadruma_main_detector.py、test_pancha_mahapurusha_main_detector.py、test_shadbala_minimum_first.py、test_ashtakavarga_sodhita_chain.py、test_bhava_bala_formal.py、test_node_own_sign_and_fixed_lords.py、test_year_lord_basis_label.py,全部通过
定向回归(格局、报告读者版中英、density、CLI、API 安全、过运/双重过运、八分法、Shadbala、Jaimini、长报告) 全部通过;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(在重新冻结提交 9392f060 上跑;前端另跑)
隐私 tests/test_repo_privacy_markers.py 通过(含记录提交后复跑)
tsc --noEmit 0 错
npm run lint 0 error(126 warnings,与开工同数)
npm test(Node 22.14) 开工基线 4927 项 / fail 24 / cancelled 0;收尾 4929 项 / fail 24 / cancelled 0。失败清单与基线逐条相同(24 条全部是 DB / Docker / 部署类:admin code、billing、migration runner、Better Auth、staging env/backup、live staging sync 等)。中途一次(goldens 刚重采、卡片未改前)多出 5 条,已在 0d6af77c 修复:3 条三栏改断言、2 条卡片体积超 12,000(卡片 Shadbala 行精简后回到预算内)
golden 二次重采 证据卡、名人回测 golden 用 capture 脚本再跑一次,逐字节相同
validate_logic_v2.py(optional,信息) 见「其他观察」

生时校正评测(v5 77 例)

  • 命令:python3 scripts/research/holdout_v5_baseline.py --dataset v5 --out-dir <dir>,PYTHONHASHSEED=0、JYOTISH_API_CHART_CACHE_TTL_SECONDS=0,改前在 origin/staging 60d065a8 一次性工作树,改后在 b0329ef0(T1–T8 与 T5 全部引擎改动之后)一次性工作树。
  • 结果:sweep / cluster_width / futile_collect 三段与合并文件,去掉耗时与路径后逐项相同。
指标(v5 77 例) ±10 ±30 ±60
先验头名 前 / 后 0.182 / 0.182 0.091 / 0.091 0.078 / 0.078
六题回放头名 前 / 后 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

红线(任一档降 > 1pt)未触发。

  • reported offset 900 例:0 例变化;sealed holdout 20 例逐条相同、metrics 相同(重新冻结提交 9392f060)。
  • 结论:校正分数不变,不升打分版本(ALGORITHM_VERSION 仍为 rectification-v5-matrix-scoring-10),无需做 BUG-621 历史 Case 打开验证。冻结身份里的 jaimini.py、ashtakavarga.py、shadbala.py 字节变了,按 ERR-110 以标签 astrologer_rulings_batch1_2026_10_03 重新冻结;upstream_sync5 记录转为 previous、逐字节保留。
  • 校正打分路径不读 Karaka、格局、罗计尊严与宫主共主(grep 打分文件与冻结清单确认),与「分数不变」一致。

九位名人:卡片与报告一致性(甲5 / 甲7 验收)

scripts/research/capture_consult_biography_backtest_golden.py 同一批 9 位公开 AA 名人,career 路由的卡片(chart.yogas + 筛选 + traditional_yogas)对照同盘报告瑜伽总表(scratchpad 工具,未入库):

名人 改前(卡片 / 报告) 改后(卡片 = 报告)
乔布斯 卡 Sunaphaa + Durudhura;报告「月双夹」(太阳算邻星) Sunapha 系,无 Durudhura
奥巴马 卡 Sasa、Neecha Bhanga Raja;报告两条「落陷取消格局」无条件 Sasa(部分减弱:受凶星照:太阳);落陷取消(木星,三条成立条件);两边一致
泰勒 卡 Hamsa(来自 1/5/9 的非经典规则)+ Kemadruma;报告「汉萨三方宫格局」+「月后瑜伽(计都)」——孤月与月后同盘 无 Hamsa;只有 Kemadruma,无 Anapha
嘉兰 卡 Bhadra;报告无 Bhadra(部分减弱:水星燃烧 12° 以内,受火、土照);报告同(b1185c63 之后)
齐达内 卡 Kemadruma + Kemadruma (Empty Houses);报告「空劫格局(空宫版)」 Kemadruma 一条 + 落陷取消(火星);两边一致
梦露、皮雅芙、卡罗、小布什 卡与报告 Sunapha/Anapha 一致 不变

名人生平回测

卡片字段有变化(traditional_yogas 文字、shadbala 行、sav_by_house、年盘 varshesha_basis)。本机无模型 key,未跑,写入 BLOCKED.md。基线取 docs/testing/consult-affliction-backtest-20261001.md 第七轮。需要有 key 的环境按 docs/testing/consult-affliction-backtest-20261001.md 的命令重跑一轮,核对「严重冲突数不增加」。

其他观察(不在本单范围,未改)

  • validate_logic_v2.py(与 PyJHora 的格局对照基准,门禁里是 optional,本单不入库其输出):precision 0.951 → 0.928、recall 0.741 → 0.733。原因是本单按定稿有意与 PyJHora 分开(PyJHora 的 Kemadruma / 月亮邻宫计罗计、天蝎水瓶取较强共主),与 BUG-1187 决策 3 同向。
  • 报告 Shadbala 表 Total 列是 Virupa、Required 列是 Rupa(单位不同),本单未动。
  • ashtakavarga.calc_ashtakavarga 的 Shodhya / Yoga Pinda 用的仍是原始 BAV(BPHS 的 Shodhya Pinda 应在净化之后算),记为下一批。
  • bhava_bala.py 的 Bhava Dig Bala 表数值在 10–30 Virupa(BPHS 通常 0–60),来自 jyotishganit 移植,未核原典。
  • v5 改后评测所在的一次性工作树在评测进行中被切到 0d6af77c(本会话误操作);与 b0329ef0 的差异只在 consultation_native_layers.py、pl9_reader_export.py、pl9_reader_english_terms.py,不在打分路径。

下轮问占星师

  1. D9 落陷是否破格(五大人格):现状是传了 D9 星座就判不成立,但产品路径都不传,所以现在等于不检查。按定稿精神「只降低强度」,还是「不成立」,还是「不看 D9」?
  2. 过运是否改用净化值:本单只改展示,过运打分(gochara、慢星过运 SAV)仍用原始点数。经典里过运看未净化点数,是否维持?
  3. Tajika 年主 Panchavargiya 的来源:五个职位(Muntha 主、出生/年盘上升主、Tri-Rashi 主、日/夜主星等)以哪本书、哪个版本为准?力量用 Harsha / Pancha-Vargiya Bala 的哪套算法?
  4. 单宫主净化细则:(a) 占星宫是否把罗睺、计都算作「有星」(我们只数七星;PyJHora 把罗计甚至上升标记都算);(b) 一宫有星、一宫空且两宫点数相等时,空宫清零还是保留(我们清零;PyJHora 保留为相同值);(c) 每行 BAV 都对五对星座做,还是只对该行星自己的两宫做(PyJHora 是后者)。
  5. 五大人格「被凶星照」:照的凶星是否包括太阳?罗睺、计都的照是否计入?
  6. Shodhya Pinda:是否改为在净化后的 BAV 上计算?

Claude 验收(2026-10-03)

  • 快速门(--profile quick --skip-frontend-runtime,系统 python3)通过;tsc --noEmit 0 错;npm run lint 0 error / 126 warning。
  • npm test(Node 22.14):4929 项,失败 25 → 补修后 24。多出的一条是 rectification-confirmation-gate.test.ts「sealed holdout aggregates match the v3 report」:研究记录已经重新冻结,但测试仍读 sync5 的冻结文件(sync5 那轮也漏过同一处)。补修 14d5c761 把两处读取改到 sealed_holdout_rerun_astrologer_rulings_batch1_2026_10_03.json,三栏写在测试注释里。其余 24 条都是 DB / Docker / 部署类。
  • v5 77 例:在分支 HEAD 独立重跑 sweep 段,±10 / ±30 / ±60 的回放头名为 0.6364 / 0.4935 / 0.3117,先验头名为 0.1818 / 0.0909 / 0.0779,和改动前逐项相同。
  • 九盘抽查:TAY、ZID 两盘只成立 Kemadruma,Sunaphaa / Anaphaa / Duradhara 全部 hit=false,矛盾消除;咨询 golden 里没有「Neecha Bhanga Raja」字样;KARAKA_8 已是 BPHS 次序。
  • 环境缺口不变:名人生平回测(无模型 key)、next build / gzip(node_modules 为软链)、真机。