Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HwMNZEzdzmrbPhuRNmZe3C
13 KiB
PROGRESS:#91 A 段第 2 次打回(F1~F4)
- 分支:
codex/full-data-parity-1-fix2-20261022,起点92b4e220(codex/full-data-parity-1-20261021顶端,已含最新origin/staging)。 - 执行:Claude 子代理,Linux,系统
python3(无.venv),PyJHora 已屏蔽(虚构盘助手block_jhora()/ 临时脚本sys.modules["jhora"] = None)。只用虚构盘。 - 状态:本地完成,未推送。前端未改。
- BUG:新增 BUG-1418(F3)、BUG-1419(F1 + F4)。开工时
origin/staging最大号 1415,本分支 1417,其他origin/codex/*分支都不超过 1415。
结论
| 项 | 做了什么 | 证据 |
|---|---|---|
| F1 | 11 节改读资料包里的嵌套记录,印多列表格。连带修了 6 节把小写键名或枚举印成格子的问题(Argala、出生历法、本命 Tithi、Tajika 候选、Goel 尊贵、瑜伽类别)。没有新的白名单节 | 0、1、9、3、17、42、77、150 号盘中英两版逐节检查:白名单 4 节外,每节都有非第一列真实值,整格键名为 0,英文无汉字 |
| F2 | 「每节有真实值」只认非第一列;一列表永远不过;只有「大运与小运交界检查」可以是一句话,其余节必须有表。新加「任何格子不得整格是键名」 | 拿修复前代码的 0 号盘输出套新规则:10 节不过,40 种键名格;第 11 节「关系口径」当时是一句固定话,由「必须有表」一条拦住 |
| F3 | 中文组合句改由中文源给出(见下)。没有恢复回译 | 0~19 号盘与 staging 逐格比:2164 行组合格,staging 有字而本分支「未判定」= 0(修前 174);英文版汉字 0 |
| F4 | 六章 ##,各节 ###,Narayana 两种口径 ####。前端未改 |
0 号盘:H1 只剩标题 1 个;## 中文 44、英文 44;英文 staging 38 + 6;中文 staging 37 + 7,多出的 1 个是本分支中文附录新增的「宫主逐宫解释」(与英文版同节,第 1 轮已有),不是六章 |
F1 各节数据来源
路径都在 build_professional_report_reference_packet 的输出里(顶层与 worksheets 下同名,渲染先读顶层)。
| 节 | 资料包位置 | 印出的列 |
|---|---|---|
| Jaimini 计算细节 | advanced_systems.jaimini.chara_karaka_7.karaka_table、chara_karaka_8.karaka_table_8 |
卡拉卡、七曜口径行星 / 度数、八曜口径行星 / 排序度数(effective_degree_in_sign)、罗睺倒数(rahu_reverse_applied)。上游 jaimini_calculation_detail_markdown 同样印七曜表 |
| KP 计算口径 | advanced_systems.kp.kp_profile(ayanamsa_display、requested_report_ayanamsa、house_system、cusp_source、timing_policy、status)、kp.house_basis、kp.house_occupancy_basis、kp.calculation_profile.node_mode、kp.ruling_planets |
项目 / 内容;另一表印七个 ruling planets |
| Tara 与 Chandra 矩阵 | advanced_systems.nakshatra_adv.tara_chandra_combined.<行星> |
星宿、Tara 序号(+1)、Tara(中文 tara_cn,英文取 tara_name 括号前)、Tara 吉凶、Chandra 位(rashi_from_moon +1)、Chandra、Chandra 吉凶、合并结果(combined_score 映射)。上游 nakshatra_combined_markdown 同列 |
| 上升 Vargottamamsa | strengths_and_scores.lagna_vargottamamsa(d1_sign、d9_sign、is_lagna_vargottamamsa) |
D1 上升星座、D9 上升星座、是否 Vargottamamsa |
| 上升主与七宫主行运 | timing_and_predictive_systems.transit_ll7l(lagna_lord、seventh_lord、reference_date、p5 / p8 / parivartana 的 hit 与 details) |
参考日、上升主、七宫主;检查项 / 是否成立 / 明细。明细句按引擎固定格式解析成中英文,解析不了的不印 |
| 八分法 Yoga Pinda | strengths_and_scores.ashtakavarga.yoga_pinda.planets、planet_weights、summary |
星座、所在星座点数、Rashi / Graha / Yoga Pinda、行星权重;最强 / 最弱行星、合计、平均。上游 ashtakavarga_yoga_pinda_markdown 同源 |
| 八分法加减 | strengths_and_scores.ashtakavarga.sodhita(raw_bav、trikona_bav、sodhita_bav、ekadhipatya_audit)、ashtakavarga.shodhya_pinda |
原始 BAV 合计、三方净化后、单宫主净化后、Rashi / Graha / Shodhya Pinda;单宫主净化改动的星座对(前 / 后) |
| 关系口径 | strengths_and_scores.planetary_friendship(method、source_planets、rows、status) |
保留原说明句;表印口径、计入星体、是否计入交点、行数、状态 |
| 多参考点行运 | timing_and_predictive_systems.transit_multi_reference(references、target_date、transit_analysis.<行星>.house_from_ref) |
参考点 / 星座 / 优先级;行星、星座、度数、从四个参考点起的宫 |
| 木土双重行运 PAC | timing_and_predictive_systems.double_transit_pac(d1 / d9 / cl 的 jupiter / saturn 目标、double_transit、stats、event_house) |
参考日、事件宫、D9 上升、月亮上升、命中数;层 / 行星 / 目标 / 相位。目标名按引擎固定格式解析(BUG-1060 / 1061 的命名),解析不了的不印 |
| 行星聚集 | timing_and_predictive_systems.planetary_congregation(natal.lagna、natal.house_7、transit.<宫>、hit) |
参考日、是否有聚集;本命上升宫、本命第七宫、各行运宫的行星 |
连带修的 6 节:Argala 读 advanced_systems.argala.houses.house_N(Argala / Virodhargala 数、有效 Argala 宫、net_result);出生历法读 birth_and_parameters.panchanga.raw(Tithi、星宿、Yoga、Karana、星期、星期主星、Hora 主星及吉凶);本命 Tithi 读同一处的 tithi;Tajika 候选补出名称、相位、剩余度数并映射入相 / 离相;Goel 尊贵的 friend / neutral / enemy 补映射;瑜伽类别改用中英类别表。
Tithi 主星:tithi_lord 只出现在 raw_module_usage_map,公开资料包没有。该节只列出生 Tithi(名称、半月、序号、月日黄经差),并在表下写「Tithi 主星模块没有进公开报告资料包」。没有在渲染层另推主星:报告只印资料包里有的东西,是否把 tithi_lord 接进资料包留给 B 段 / Claude 定。
_PACKET_GAPS 仍是原来 4 节(Navamsha 小运时长、五鸟活动、Rashi Tulya Navamsa、当前多系统收敛),没有新增。
顺带看到、未改:cmd_planetary_congregation 在 event_house = 7 时把 house_7 与 house_{event_house} 指到同一个列表,同一颗星会被追加两次(17 号盘「月亮、月亮、水星……」)。渲染层去重显示,引擎未动,留给 Claude 判断是否另立单。
F2 测试改动(三栏)
| 断言 | 原值 | 新值 | 原因 |
|---|---|---|---|
test_every_section_has_a_real_cell_except_the_four_public_gaps 的 _section_has_real_cell |
任一数据格(含第一列标签)不是「未判定」即算真实值;无表时任一行文字即算 | 只看非第一列;排除「未判定 / Not determined / — / - / 空」;无表时只认非标题的句子;另外除「大运与小运交界检查」外每节必须有表 | 第一列是标签,键名也落在第一列,旧判定让一列表和键名都过了(F1 的 11 节) |
test_parity_chapters_go_through_local_conventions 的英文探针 |
源字段 divorce,期望 relationship strain |
源字段 Divorce risk,期望 relationship strain risk |
单个小写词现在按内部键名处理、不印;探针改成读者会看到的短语,替换逻辑不变 |
标题定位(_chapter_text、_section_body、test_empty_packet…、test_three_fictional…) |
章 # 、节 ## 、Narayana ### |
章 ## 、节 ### 、Narayana #### ;章名用整行匹配计数 |
F4 标题降一级 |
新增测试:test_every_section_has_a_real_cell_outside_the_label_column_unit、test_no_table_cell_is_a_raw_packet_key(^[a-z][a-z0-9]*(_[a-z0-9]+)*$,0、1、9 号盘中英)、test_six_chapters_are_reader_chapters_and_sections_sit_below_them(只有一个 H1;## 数 = 去掉六章的同一份报告 + 6,且最后 6 个就是六章;### 数 = 69 节)、test_chinese_yoga_combinations_are_not_blanked,以及 tests/test_yoga_combination_chinese.py 三条。
grep 过 tests/ 与 frontend/tests/:六章标题与层级只有 tests/test_full_data_parity_chapters.py 引用。
F3 中文组合句来源
| 来源 | 改法 | 是否影响检出 |
|---|---|---|
yoga_engine._eval_semantic_condition 的 note(166 条) |
success() 返回 BiText(中文, 原 note);中文在新文件 references/yoga_semantic_notes_zh.json |
一对一映射,去重键的相等关系不变;combination_en 仍是原 note |
无 note 的条件(planet_in_house、planet_in_lagna,原来印类型键) |
每种类型一句固定中文,英文孪生仍是类型键 | 同类型仍合并成一条 |
只写英文 combo_template 的自定义规则(PyJHora aligned source logic,2 条规则) |
同一张表查中文,英文孪生保留原句 | 无 |
yogas_doshas.calc_raj_yogas / calc_dhana_yogas |
每行加 combination_zh(宫主、落宫、行星中文名),原 combination 不改 |
无 |
appendix_language.chinese_combination |
先取干净的 combination_zh |
— |
没改:哪些瑜伽成立、强度、类别、评分,references/yoga_rules.json,scripts/jyotish_api_server.py。
检出不变的核对:0~19 号盘,staging 与本分支各取 detected_yogas、yogas、王者 / 财富行的(规则、名称、强度、类别、英文组合句)共 2250 行,集合完全相同。两张盘(1、17)里王者 / 财富行先后顺序不同:calc_raj_yogas 遍历 set(dual_lords、BENEFICS),字符串 set 的顺序随进程的哈希种子变(未单独复测 staging 两次)。没有改。
比对方法:git worktree add --detach .worktrees/fix2-91-base origin/staging,两边各渲染 0~19 号盘中文,按表头含「组合条件」的表逐行比(同名同序)。完成后已删除该工作树。
| staging | 修前 | 修后 | |
|---|---|---|---|
| 组合格总数(0~19 号盘) | 2164 | 2164 | 2164 |
| staging 有字、本分支「未判定」 | — | 174 | 0 |
| 「组合:未判定」(解释页) | 0 | — | 0 |
| 含英文词的组合格(不计 PyJHora、Mandi 等专名) | 650 | — | 24 |
剩下 24 格是规则中文模板本身带的专名,例如「行星集中在特定宫位(Yupa 拴马柱)」「PyJHora aligned Bheri瑜伽: …」。
体积(0 号虚构盘,字符数)
| staging | 修前(92b4e220) |
修后 | |
|---|---|---|---|
| 中文 | 430,566 | 517,991 | 522,047 |
| 英文 | — | 993,608 | 1,000,010 |
中文 ## 个数 |
37 | 107 | 44 |
英文 ## 个数 |
38 | 107 | 44 |
测试
解释器:系统 python3。PyJHora 屏蔽。
| 命令 | 退出码 | 用时 |
|---|---|---|
python3 -m pytest tests/test_full_data_parity_chapters.py tests/test_full_data_parity_appendix.py tests/test_report_english_sweep_smoke.py tests/test_report_english_edition.py tests/test_report_full_data_fix.py tests/test_python_hygiene_budget.py tests/test_api_server_growth_contract.py tests/test_repo_privacy_markers.py tests/test_yoga_combination_chinese.py -q |
0(120 项) | 183 秒 |
python3 -m pytest tests/test_report_english_sweep.py -q(200 张虚构盘) |
0 | 550 秒 |
瑜伽、阅读页、解释源、完整数据相关的其余 27 个测试文件(tests/ 下文件名含 yoga / report_reader / full_data / pl9 / interpretation / professional_report / full_reading_module,去掉上面已跑的) |
0(118 项) | 56 秒 |
python3 scripts/run_quality_gate.py --profile quick |
1 | 271 秒 |
快速门:py_compile、JSON 校验、四个审计脚本、pytest(209.8 秒)都通过;停在 npm test,原因是这个工作树没有 frontend/node_modules(tsx 找不到)。本单没改前端,这一步是环境缺口,不是通过。
隐私标记测试在本文与 BUG 记录提交后又跑了一次:退出码 0。
第一轮必跑列表里 test_report_full_data_fix.py::test_yoga_effect_does_not_assert_lifespan 红过一次:新瑜伽类别表把 ayur 印成 Longevity,撞上 BUG-1210 不把寿命当断语的约束。改成「体质 / Constitution」后通过(提交 1dd620388)。
偏离
- 没有推送,没有改前端、
scripts/jyotish_api_server.py、references/yoga_rules.json、冻结打分文件。 - F1 范围比 11 节多了 6 节:新测试「格子不得是键名」会抓到它们,不修就过不了 F2。
- 中文报告
##是 staging + 7,不是 + 6;多的「宫主逐宫解释」来自本分支第 1 轮的中文附录,与英文版同节。测试按「同一份报告去掉六章」计数,英文正好 staging + 6。 references/yoga_semantic_notes_zh.json是新文件(任务允许加中文模板 / 字段)。