diff --git a/BLOCKED.md b/BLOCKED.md index 14d40eab..d5f54adf 100644 --- a/BLOCKED.md +++ b/BLOCKED.md @@ -1,5 +1,11 @@ # BLOCKED +## TASK-astrologer-rulings-batch1:名人生平回测、`next build` / 首屏 gzip、真机待验(2026-10-03) + +- **名人生平回测**:卡片字段有变化(`traditional_yogas` 文字带「成立条件 / 部分减弱」、`shadbala` 每星改为 `rupas / minimum_check / level`、`sav_by_house` 加 `sav_sodhita`、年盘 `varshesha_basis`)。执行环境没有任何模型凭据,按 `docs/testing/consult-affliction-backtest-20261001.md` 的命令重跑一轮,核对严重冲突数不高于第七轮。替代证据:两份 golden 用真实引擎重采且二次重采逐字节相同;前端全量测试失败清单与开工基线逐条一致。 +- **`next build` / 首屏 gzip**:`frontend/node_modules` 为工作树外软链,Turbopack 拒绝;本单不改页面与路由(只改 `src/lib` 与 `src/mastra` 的数据整形),未测。 +- **真机**:报告新表(Shadbala 两列、Bhava Bala 三分量、SAV 净化/原始、年主选法行)与卡片读法需登录态浏览器查看。 + ## TASK-consult-affliction-reading:年运 / 时运单领域轮卡在 12,000 字符口径(BUG-1160/1161,2026-10-01,2026-10-02 解除) - ~~状态:blocked。年运、时运单领域轮加通用读法(733 字符)与年运清单(334)后最高 12,979 / 12,257,超过 `consult-condensed-checklist-20260927`「size」与 `consult-evidence-card-20260927`「model-visible size」的 12,000;`CONSULT_READING_BUDGET_BLOCKED = {annual, timing}` 让这两类轮次保持旧方法段。~~ diff --git a/CHANGELOG.md b/CHANGELOG.md index d2397cbb..cd675a71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # 印度占星 Skill 更新日志 +## 2026-10-03 — 占星师口径第一批:五大人格、孤月、落陷取消、行星力量、宫位力量、八分法、罗计本宫、年主标注 + +- 五大人格(Ruchaka、Bhadra、Hamsa、Malavya、Sasa)只按占星师定的一套判:只看上升起的角宫;逆行不再算破格;燃烧、与凶星同宫或被凶星照只写「部分减弱」并列原因,不再直接判失效。木星在 1/5/9 宫的「三方宫汉萨」这类非经典写法不再出现在卡片和报告上(BUG-1207)。 +- 孤月格(Kemadruma)只按一套判:月亮前后一宫没有火水木金土就成立,角宫有星或角宫只有罗睺计都都不解除;同一张盘不再同时出现「孤月」和「月亮旁边有星」(BUG-1206)。 +- 落陷取消不再叫「王者格(Neecha Bhanga Raja Yoga)」,只写「落陷取消」并列出成立的条件,报告里也不再归到「王权/事业」类(BUG-1205)。 +- 行星六力(Shadbala)先写是否达到 BPHS 最低要求,再写本站分档,分档后标「(网站分档)」(BUG-1208)。 +- 报告的「Bhava Bala 十二宫力量」改为正式三分量(宫主力 + 方向力 + 相位力),不再用「吉星 +2、凶星 −1.5」这种自定加减分(BUG-1210)。 +- 八分法(Ashtakavarga):报告和数据卡的主值改为三方净化 + 单宫主净化之后的数,原始数并列,两列都写明;以前标「BPHS标准」的那种扣分法已删除。过运评分仍用原始点数(BUG-1209)。 +- 罗睺、计都不再显示「入庙/本宫」;格局检测里天蝎宫主一律火星、水瓶宫主一律土星(BUG-1211)。 +- 8 星制 Chara Karaka 按 BPHS 改正排位(第 5 位父亲星、第 8 位配偶星);报告的 8 星制表会变(BUG-1204)。 +- 年运的年主旁注明「暂用 Muntha 主星;占星师口径为 Panchavargiya,待接入」(BUG-1212)。 +- 生时校正:v5 77 例评测与改前逐项相同,分数不变、算法版本不变;研究记录按规程重新冻结。名人生平回测因本机无模型凭据未跑(见 BLOCKED)。Skill 版本不变;不改数据库结构。新生成的报告和数据卡才有这些变化,旧报告内容不变。 + ## 2026-10-03 — 报告和星盘页不再出现「一整列横杠」;八分法宫位表的 SAV 数字改正 - 个人报告「赤纬与速度」表删掉一直为空的 Kranti 列(本站没有它的独立算法,赤纬列已是真实值)(BUG-1199)。 diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 06a826ff..d9544367 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -16206,3 +16206,138 @@ - 相关记录:BUG-607 / 616(报告图盘渲染)。 - 复发自:无 - 修复版本:`ae18952e`(staging) + +## BUG-1204 | 8 星制 Chara Karaka 排位把子女星、配偶星、父亲星放错位置 + +- 状态:resolved(分支 `codex/astrologer-rulings-batch1-20261003`,未推送;待验收) +- 首次发现 / 最近更新:2026-10-03 / 2026-10-03 +- 来源:占星师定稿 2026-10-03 的配套核对(对照原典的笔误,不需裁决);任务书 `TASK-astrologer-rulings-batch1-20261003` T6。 +- 影响面:`scripts/jaimini.py` `KARAKA_8`;下游报告 Jaimini Karaka 表(`pl9_reader_export`、`jyotish_engine` 参考版)。生时校正不读 Karaka(打分路径 grep 无引用)。 +- 现象:报告 8 星制表第 5 行写「子女星 PK」、第 7 行「配偶星 DK」、第 8 行(度数最低)「父亲星 PiK」。 +- 根因:`KARAKA_8` 第 5/7/8 位写成 PK/DK/PiK。BPHS 第 32 章 8 星制次序为 AK、AmK、BK、MK、PiK、PK、GK、DK。上游 yinduzhanxing 同样写错。 +- 修复:`0cf2249e` 按 BPHS 改表;7 星制不变;BUG-1194 的罗睺 30° 反转保留。 +- 验证:`tests/test_chara_karaka_8_bphs_order.py`(表次序;公开 AA 盘 Steve Jobs Raman/平均交点下 PiK=罗睺、PK=月亮、DK=火星;报告 8 星制行按 BPHS 次序)。 +- 防复发:同上测试锁表与真盘;已在 `docs/research/` 上游通知中记录上游同错。 +- 相关记录:BUG-1194、BUG-489。 +- 复发自:无 +- 修复版本:待发布 + +## BUG-1205 | 落陷取消自动叫「王者格」(Neecha Bhanga Raja Yoga),条件不列 + +- 状态:resolved(分支 `codex/astrologer-rulings-batch1-20261003`,未推送;待验收) +- 首次发现 / 最近更新:2026-10-03 / 2026-10-03 +- 来源:占星师定稿 2026-10-03 乙14;任务书 T8。 +- 影响面:`references/yoga_rules.json` 四条 `neechabhanga_*`;`consultation_native_layers.TRADITIONAL_YOGAS`;`frontend/src/lib/personal-report-generation.ts` 类别映射;报告瑜伽总表。 +- 现象:卡片 `traditional_yogas` 写「Neecha Bhanga Raja Yoga」;报告把落陷取消列在「王权/事业」类,组合条件只写「落陷取消格局」,看不出哪条成立。 +- 根因:数据驱动规则与咨询闭列表都把落陷取消命名为 Raja Yoga;唯一带条件清单的 `yogas_doshas.calc_nicha_bhanga_raj_yoga`(条件 A–F)没有接到用户可见面。 +- 修复:`df21e591`。新 `scripts/main_yoga_detectors.py` 以 `calc_nicha_bhanga_raj_yoga` 为唯一条件来源(新增结构化 `cancellation_conditions`),生成「落陷取消」行(中英),由 `YogaEngine.detect` 追加;四条 `neechabhanga_*` 标 `reference_only`(保留、改名、不再求值);卡片闭列表改为「落陷取消(Neecha Bhanga)」并附「成立条件:…」;报告类别「落陷取消」、归混合组;个人报告类别映射 `neecha_bhanga → special`。 +- 验证:`tests/test_neecha_bhanga_conditions.py`(规则 reference_only 且名称无 Raja;公开 AA 盘 Obama 条件与来源一致;卡片标签;报告混合组、全文无 Neecha Bhanga Raja;前端 `src/` grep 无)。 +- 防复发:同上测试对 `frontend/src` 与 `yoga_rules.json` 做 Raja 文案 grep。 +- 相关记录:BUG-1175、BUG-1159。 +- 复发自:无 +- 修复版本:待发布 + +## BUG-1206 | Kemadruma 四套实现;算法版月亮邻宫仍计罗计,同盘同时出 Kemadruma 与 Anapha + +- 状态:resolved(分支 `codex/astrologer-rulings-batch1-20261003`,未推送;待验收) +- 首次发现 / 最近更新:2026-10-03 / 2026-10-03 +- 来源:占星师定稿 2026-10-03 甲7;任务书 T2。 +- 影响面:`references/yoga_rules.json` `kemadruma_yoga`(角宫解除 ky2)、`kemadruma_variant`(邻宫计罗计);`scripts/yoga_engine.py` `_detect_solar_lunar_yogas`;`scripts/divisional_yoga.py`;卡片 `chart.yogas` 与报告瑜伽总表。 +- 现象:同一张盘卡片有 Kemadruma,报告却因角宫有星判解除;泰勒盘报告写「月后瑜伽(计都在月亮第 12 宫)」同时卡上有 Kemadruma;齐达内卡上同时出现 Kemadruma 与「Kemadruma (Empty Houses)」。 +- 根因:Kemadruma 由四处各写一套。BUG-1187 只把 JSON 规则改成「只数五星」,**遗漏**了 `yoga_engine._detect_solar_lunar_yogas` 这段算法版(它把太阳、罗计计入月亮/太阳邻宫),所以复发;BUG-1187 的测试只覆盖规则 ID(`bvr_*`、`kemadruma_yoga`),不覆盖算法版产出的 `Anapha Yoga` / `Sunapha Yoga` / `Durudhura Yoga` 名字,因此没拦住。分盘版按分盘里不存在的 `house` 字段比相邻,永远判「无邻星」,且把太阳算邻星。 +- 修复:`6916bbae`。主检测器为 `yoga_expansion.detect_kemadruma`(只数火水木金土、不启用角宫解除、角宫只有罗计也不解除),经 `main_yoga_detectors` 进规则引擎;两条 JSON 规则 `reference_only`;算法版太阳/月亮邻宫格局只数五星;分盘版改为按星座相邻、同一口径。 +- 验证:`tests/test_kemadruma_main_detector.py`(角宫只有罗计不解除;角宫有星不解除;计都单独在邻宫不出 Anapha;九位公开名人盘 Kemadruma 与 Sunapha/Anapha/Durudhura 不同盘共存;分盘同口径)。九盘报告与卡片一致(见进度记录)。 +- 防复发:同上测试按产出名字(不是规则 ID)断言。 +- 相关记录:BUG-1187(遗漏,关联原号)。 +- 复发自:BUG-1187(遗漏面:算法版邻宫格局) +- 修复版本:待发布 + +## BUG-1207 | 五大人格四套实现:燃烧从不检查、逆行判失效、被主检测器判掉的格局经规则引擎回到卡上 + +- 状态:resolved(分支 `codex/astrologer-rulings-batch1-20261003`,未推送;待验收) +- 首次发现 / 最近更新:2026-10-03 / 2026-10-03 +- 来源:占星师定稿 2026-10-03 甲5;任务书 T1。 +- 影响面:`scripts/pancha_mahapurusha.py`、`jyotish_api_server._detect_yogas`、`references/yoga_rules.json`(`mahapurusha_*`、`*_own`、`moolatrikona_*`、`hamsa_trikona`、`bvr_maalavya_yoga`)、`yogas_doshas.calc_pancha_mahapurusha_yoga`、`jyotish_engine.cmd_yoga`(行星行)、卡片 `traditional_yogas`、报告瑜伽总表。 +- 现象:泰勒盘木星在 9 宫巨蟹(三方宫,不在角宫)卡片仍写「Hamsa Yoga」(来自非经典的 `hamsa_trikona`);逆行就判失效;凶星同宫直接消灭格局;燃烧从不检查。 +- 根因:`_detect_yogas` 调主检测器时不传太阳度数,燃烧检查不执行;主检测器把逆行、同宫判 invalid;规则引擎与 `yogas_doshas` 的同名规则不做任何破格判断,按名字合并后谁先到算谁。 +- 修复:`de793901`。主检测器按定稿:只从命宫角宫算;逆行不破格;燃烧(共用燃烧表)、凶星同宫、凶星照(太阳 7、火星 4/7/8、土星 3/10/7;罗计不照)只记 `reduced`(部分减弱)并列原因;D9 落陷判不成立保留现状(只在调用方给 `navamsa_sign` 时检查,产品路径不给;定稿未提,列入下轮问题)。`_detect_yogas` 改用主检测器并取太阳经度;同名 JSON 规则与 `yogas_doshas` 旧聚合改 `reference_only`;规则引擎追加主检测器行;`cmd_yoga` 行星行补经度与逆行,使报告与卡片的燃烧判断一致;卡片标签附「部分减弱:…」。 +- 验证:`tests/test_pancha_mahapurusha_main_detector.py`(逆行不破格、燃烧 reduced、凶星照 reduced、罗计不照、被判掉的格局不经其他路径回来、九位公开名人引擎/卡片路径与主检测器一致、报告路径与 API 路径燃烧一致);`tests/test_pancha_mahapurusha_self_conjunction.py`、`tests/run_all.py` 断言按三栏更新。 +- 防复发:同上;`tests/test_combustion_orb_tables_agree.py` 继续锁燃烧表。 +- 相关记录:BUG-1180、BUG-1175、BUG-1195。 +- 复发自:无 +- 修复版本:待发布 + +## BUG-1208 | Shadbala 网站自定分档冒充强弱结论 + +- 状态:resolved(分支 `codex/astrologer-rulings-batch1-20261003`,未推送;待验收) +- 首次发现 / 最近更新:2026-10-03 / 2026-10-03 +- 来源:占星师定稿 2026-10-03 甲13;任务书 T3。 +- 影响面:`chart.shadbala`(卡片)、报告 Shadbala 表、证据快照排名、健康叙述。 +- 现象:卡片与报告只写「极强 / 强 / 充足 / 略弱 / 弱 / 极弱」,看不出这是本站按最低要求百分比(150/125/100/75/50)自定的档,也不先说是否达到 BPHS 最低要求。 +- 根因:`shadbala.calc_shadbala` 的 `strength_level` 原样进各面,没有来源标注。 +- 修复:`5fdf2f74`。`shadbala.py` 不动(冻结身份),新 `scripts/shadbala_display.py` 在展示层生成 `min_required`、`meets_minimum`、`minimum_check`(达到/未达到 BPHS 最低要求)、`level_source: site_band`、`level`「…(网站分档)」;报告表加「BPHS minimum」「Site band」两列(中英);卡片每星只留 `rupas` / `minimum_check` / `level`(`0d6af77c`,控制卡片体积)。 +- 验证:`tests/test_shadbala_minimum_first.py`;`frontend/tests/consult-evidence-card-v2-20260927.test.ts` 新增卡片断言。 +- 防复发:同上测试。 +- 相关记录:BUG-1189。 +- 复发自:无 +- 修复版本:待发布 + +## BUG-1209 | 八分法净化没接上,报告用的「Sodhita」其实是扣掉日火土贡献,还标「BPHS标准」 + +- 状态:resolved(分支 `codex/astrologer-rulings-batch1-20261003`,未推送;待验收) +- 首次发现 / 最近更新:2026-10-03 / 2026-10-03 +- 来源:占星师定稿 2026-10-03 乙8;任务书 T7。 +- 影响面:`scripts/ashtakavarga.py`(删 `calc_sodhita_av`)、新 `scripts/ashtakavarga_shodhana.py`、`/api/ashtakavarga`、全量解读、报告 SAV/BAV/宫位表、卡片 `sav_by_house` / `ashtakavarga`、个人报告 `savScores`、事实表。 +- 现象:报告、卡片、宫位表只有原始 SAV/BAV;报告参考版的「Sodhita」是从每行 BAV 扣掉太阳、火星、土星的贡献,却标「BPHS标准」。 +- 根因:标准的三方净化、单宫主净化函数(`calc_trikona_shodhana` / `calc_ekadhipatya_shodhana`)只有测试在调用;展示面一直读原始值。 +- 修复:`ea78804b`。逐行 BAV 三方净化 → 单宫主净化 → 净化后 SAV(七行之和),占星宫只数七星;删去旧函数;报告/卡片/个人报告/事实表主值用净化后、原始值并列且两列都有标签。过运打分仍用原始点数(决策记录)。 +- 验证:`tests/test_ashtakavarga_sodhita_chain.py`(PVR 书例 Chart 7 BAV 的三方净化逐行对照规则并与 PyJHora 4.8.7 一致;单宫主净化六条规则;真盘链路与宫位字段);`tests/test_report_chart_blank_columns.py` 三栏更新;`frontend/tests/report-fact-tables.test.ts`、`report-interpretive-facts.test.ts`。 +- 防复发:同上。`report-density-fictional-engine.json` 只重采该叶(`scripts/research/refresh_density_fixture_ashtakavarga.py`),其余叶逐字节不变。 +- 相关记录:BUG-1200、ERR-115。 +- 复发自:无 +- 修复版本:待发布 + +## BUG-1210 | 报告「Bhava Bala」表是自定加减分(吉星 +2、凶星 −1.5),正式三分量没接到用户面 + +- 状态:resolved(分支 `codex/astrologer-rulings-batch1-20261003`,未推送;待验收) +- 首次发现 / 最近更新:2026-10-03 / 2026-10-03 +- 来源:占星师定稿 2026-10-03 甲13;任务书 T4。 +- 影响面:`scripts/shadbala.py`(改名 `calc_local_bhava_score`,移出 `calc_shadbala` 结果)、`scripts/bhava_bala.py`(新 `bhava_bala_from_chart`)、全量解读 `modules.bhava_bala`、报告 p32 表、参考版表与财富/摘要行。 +- 现象:报告 Bhava Bala 表的分数来自无出处的本地加减分,列「关键因素」写「Jupiter in H5 (Benefic): +2」。 +- 根因:同名两套:`shadbala.calc_bhava_bala`(本地评分)驱动报告;正式三分量 `bhava_bala.calc_bhava_bala` 只接在 `/api/bhava_bala`。 +- 修复:`6feb1a4a`。报告改用正式三分量(Bhavadhipati = 宫主 Shadbala Virupa、Bhava Dig、Bhava Drishti;等宫),列 Total(Virupa / Rupa);本地评分改名、不再出现在任何结果里。其他使用者:无(补救、健康叙述只读 Shadbala Rupa)。 +- 验证:`tests/test_bhava_bala_formal.py`;`tests/test_report_longform_gaps2.py`、`tests/test_shadbala_complete.py` 按三栏更新。 +- 防复发:同上测试对报告全文 grep「(Benefic): +2」。 +- 相关记录:BUG-1208。 +- 复发自:无 +- 修复版本:待发布 + +## BUG-1211 | 罗睺本宫三处说法;瑜伽检测里天蝎/水瓶宫主取「较强者」 + +- 状态:resolved(分支 `codex/astrologer-rulings-batch1-20261003`,未推送;待验收) +- 首次发现 / 最近更新:2026-10-03 / 2026-10-03 +- 来源:占星师定稿 2026-10-03 甲12;任务书 T5。 +- 影响面:`jyotish_engine._get_dignity_level`(D1 状态列、Vimsopaka、`varga_dignity`)、`yoga_engine.YogaContext`(宫主、入庙判断)。 +- 现象:罗睺在处女显示「入庙(Own Sign)」;规则引擎里天蝎宫主有时是计都、水瓶宫主有时是罗睺,而宫主链、功能吉凶、前端固定取火星、土星。 +- 根因:引擎写罗睺处女/计都双鱼为本宫,瑜伽引擎沿用 PyJHora 动态共主,`narayana_dasha` 另写水瓶/天蝎。 +- 修复:`b0329ef0`(单独提交,便于回退)。删去罗计「本宫」判定(不新增罗计庙旺);瑜伽主路径默认固定传统主星,`_stronger_co_lord` 只在 `dynamic_co_lords=True`(Jaimini 变体)时用;`narayana_dasha` 不动。 +- 验证:`tests/test_node_own_sign_and_fixed_lords.py`。生时校正:v5 77 例与 reported-offset / sealed holdout 重放见进度记录。 +- 防复发:同上测试。 +- 相关记录:BUG-1158。 +- 复发自:无 +- 修复版本:待发布 + +## BUG-1212 | 年运年主没说明是暂用 Muntha 主星(占星师口径为 Panchavargiya) + +- 状态:resolved(只加标注;分支 `codex/astrologer-rulings-batch1-20261003`,未推送;待验收) +- 首次发现 / 最近更新:2026-10-03 / 2026-10-03 +- 来源:占星师定稿 2026-10-03 甲11;任务书 T9。 +- 影响面:咨询年运层 `annual_tajika`、卡片年运段、报告两处年运表。 +- 现象:卡片与报告只写年主(Varshesha),不说明选法;报告选法行写「Muntha 所在星座的守护星(当前本地口径)」。 +- 根因:Panchavargiya 选法的原生生产者仍 blocked,现行年主取 Muntha 主星,未在显示处标注。 +- 修复:`eb00b0f7`。年运层加 `varshesha_basis`「暂用 Muntha 主星;占星师口径为 Panchavargiya,待接入」,卡片与投影白名单带上;报告两处年运表都有「Selection basis」行(中英)。Muntha 维持「本命上升 + 已满年数」,`muntha.calc_muntha_from_sun_sign` 不在任何主路径。 +- 验证:`tests/test_year_lord_basis_label.py`。 +- 防复发:同上;Panchavargiya 接入另开单。 +- 相关记录:BUG-1028。 +- 复发自:无 +- 修复版本:待发布 diff --git a/docs/tasks/PROGRESS-astrologer-rulings-batch1-20261003.md b/docs/tasks/PROGRESS-astrologer-rulings-batch1-20261003.md new file mode 100644 index 00000000..e3e94690 --- /dev/null +++ b/docs/tasks/PROGRESS-astrologer-rulings-batch1-20261003.md @@ -0,0 +1,132 @@ +# 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