Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
18 KiB
18 KiB
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) | — |
关键实现说明(与任务书的出入)
- 主检测器的接法:新建
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)读到的是同一个结论。 - T1 D9 落陷:定稿未提,保留「D9 落陷判不成立」。代码事实:主检测器只在调用方传
navamsa_sign时检查,产品路径(_detect_yogas、规则引擎、报告)都不传,所以这一条现在实际上不生效;本单未启用(启用即改变结论,等占星师答复)。 - T1 凶星照:用仓内 Parashari 整宫 drishti(
aspects.calc_house_aspects同规则):太阳 7、火星 4/7/8、土星 3/7/10;罗计不照(与consultation_native_layers.DRISHTI_RULE一致)。 - T1 报告与卡片燃烧口径:九盘核对时发现嘉兰的报告写「燃烧 14° 以内」、卡片写 12°——报告路径
cmd_yoga的行星串不带逆行标记。de793901让cmd_yoga生日路径带经度与逆行,b1185c63让全量解读的 varga 重跑在行星串第 5 段带R。 - T2 BUG-1187 遗漏:
yoga_rules.json两套 Kemadruma 里kemadruma_variant确实仍计罗计;另外yoga_engine._detect_solar_lunar_yogas(算法版月前/月后/月双夹、日前/日后/日双夹)仍把太阳、月亮、罗计算作邻星——泰勒盘「计都在月亮第 12 宫」出 Anapha 与 Kemadruma 同盘即来自这里。已改为只数五星,BUG 历史按「复发自 BUG-1187(遗漏面)」记录。divisional_yoga分盘版按不存在的house字段比相邻(永远判孤月),改为按星座相邻。 - T3:
shadbala.py在冻结身份里,展示字段放在新scripts/shadbala_display.py(ERR-115 的做法)。卡片每星只留rupas/minimum_check/level:引擎另三个字段语义重复,全部带上会让乔布斯 general / career 卡超过 12,000 字预算(12,166 / 12,250),精简后回到预算内。 - 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… 分档不是经典口径,报告不显示。 - 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)仍是原始点数,相关测试未改。 - T5:只删罗计「本宫」判定;
jyotish_engine本来就没有罗计庙旺表,未新增。yoga_engine默认固定主星,_stronger_co_lord只在dynamic_co_lords=True时用(目前无调用方);narayana_dasha不动。 - T9:Muntha 主路径是
solar_return._muntha_from_natal_ascendant(本命上升, 已满年数),测试锁定;muntha.py(含calc_muntha_from_sun_sign)没有任何脚本导入。 - 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/staging60d065a8一次性工作树,改后在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,不在打分路径。
下轮问占星师
- D9 落陷是否破格(五大人格):现状是传了 D9 星座就判不成立,但产品路径都不传,所以现在等于不检查。按定稿精神「只降低强度」,还是「不成立」,还是「不看 D9」?
- 过运是否改用净化值:本单只改展示,过运打分(gochara、慢星过运 SAV)仍用原始点数。经典里过运看未净化点数,是否维持?
- Tajika 年主 Panchavargiya 的来源:五个职位(Muntha 主、出生/年盘上升主、Tri-Rashi 主、日/夜主星等)以哪本书、哪个版本为准?力量用 Harsha / Pancha-Vargiya Bala 的哪套算法?
- 单宫主净化细则:(a) 占星宫是否把罗睺、计都算作「有星」(我们只数七星;PyJHora 把罗计甚至上升标记都算);(b) 一宫有星、一宫空且两宫点数相等时,空宫清零还是保留(我们清零;PyJHora 保留为相同值);(c) 每行 BAV 都对五对星座做,还是只对该行星自己的两宫做(PyJHora 是后者)。
- 五大人格「被凶星照」:照的凶星是否包括太阳?罗睺、计都的照是否计入?
- Shodhya Pinda:是否改为在净化后的 BAV 上计算?
Claude 验收(2026-10-03)
- 快速门(
--profile quick --skip-frontend-runtime,系统 python3)通过;tsc --noEmit0 错;npm run lint0 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 为软链)、真机。