From 9a0d5e11f347e6f61091abd277185c858060b084 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Thu, 22 Oct 2026 08:05:18 +0800 Subject: [PATCH] docs(tasks): English han-leak fix brief (agent loop, issue #89 round 1) The branch edits scripts/jaimini.py, a frozen rectification scoring file; the sweep's jhora block does not reach the replay subprocesses, so the tests render a packet production never sees; missing English is blanked instead of exposed. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LutgzyJqNhPpZy1nFsJtN3 --- docs/tasks/README.md | 1 + ...SK-report-english-han-leak-fix-20261022.md | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 docs/tasks/TASK-report-english-han-leak-fix-20261022.md diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 08de283a..fdc11d17 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -522,3 +522,4 @@ | `TASK-chart-subject-table-fix-20261022.md` | `PROGRESS-chart-subject-table-fix-20261022.md` | **#86 第 1 次打回**:报告所有表被强制单行(打印跑出纸面);保存他人复制了档案页代码且已分叉;点编辑框内边距会丢修改 | 已合入 staging | `codex/chart-subject-table-20261021` | | `TASK-full-data-parity-3-20261022.md` | — | #93 完整数据版补齐(三):「独立年度方法参考」正式环境调 PyJHora(子进程隔离;装上后其余输出逐字节不变,7 个换路径开关钉死);输入默认用本地时间与正确年份(D6 待产品确认) | 待领取(等 #91 合入) | `codex/full-data-parity-3-20261022` | | `TASK-synastry-staging-fix-fix-20261022.md` | `PROGRESS-synastry-staging-fix-20261021.md` | **#85 第 1 次打回**(T7~T11 主体通过):新地址没登记进路由清单致快速门红;CHANGELOG 与 T11 矛盾;侧栏点亮测试是空断言 | 待领取 | `codex/synastry-staging-fix-20261021` | +| `TASK-report-english-han-leak-fix-20261022.md` | `PROGRESS-report-english-han-leak-20261021.md` | **#89 第 1 次打回**:改了冻结的校正打分文件 `jaimini.py`;测试的 PyJHora 屏蔽没传到子进程(测的不是生产那份报告,也是慢的原因);缺英文时留空藏住漏洞 | 待领取 | `codex/report-english-han-leak-20261021` | diff --git a/docs/tasks/TASK-report-english-han-leak-fix-20261022.md b/docs/tasks/TASK-report-english-han-leak-fix-20261022.md new file mode 100644 index 00000000..2b64ba48 --- /dev/null +++ b/docs/tasks/TASK-report-english-han-leak-fix-20261022.md @@ -0,0 +1,51 @@ +# 修复单:英文版漏译(issue #89,第 1 次打回,2026-10-22) + +- 被验提交:`ba1ffeb35`(分支 `codex/report-english-han-leak-20261021`) +- 原任务书:`TASK-report-english-han-leak-20261021.md` +- 执行方:Grok。同一分支继续,开工前 `git merge origin/staging`(不 rebase),只推这个分支。合并只会在 `CHANGELOG.md`、`docs/BUG_HISTORY.md`、`docs/tasks/README.md` 上冲突(都是追加,两边都留);`pl9_reader_export.py` 与 #86(速度 4 位)、#87(上升「/」)能自动合并,合并后两处都要在。 +- BUG 编号:本分支的 BUG-1410、1411 与 staging 上 #86 的 1410~1412 撞号。合并 staging 后改成当时最大号 +1 起(按现在是 1413、1414),CHANGELOG、PROGRESS 同步改。 + +## 验收结论(Claude 逐行审阅) + +做对了的:四张末尾词表一条没加;中文字段只新增 `*_en` 孪生字段,中文渲染分支不变;`_english_edition`、`acceptEnglishEdition`、`_retain_remaining_cjk_lines` 与前端都没动;Rath 新函数放在 `narayana_legacy_label.py`,`narayana_rath` 没被第二个文件导入;`yoga_rules.json` 只改了一条英文模板;测试只用虚构盘。 + +全量 pytest、快速门、前端判定这次**没跑**(下面 H1 已足以判未通过,H2 会让测试结果不可信),下一轮一并跑。 + +## H1 · 改了冻结的校正打分文件(必修,红线 4) + +`scripts/jaimini.py` 在 `references/rectification_sealed_holdout.v1.json` 的 `production_scoring_files` 里(三处),钉死 sha256 `6b88658da540…`。本分支给 `calc_chara_karaka_7`、`calc_chara_karaka_8` 加了 `KARAKA_DOMAINS_EN` / `domain_en`,哈希变成 `cb32081951d5…`,`tests/test_sealed_holdout_contract_freshness.py` 会红,也违反「不得碰冻结打分文件」(ERR-110 / ERR-115)。 + +修法:`scripts/jaimini.py` **逐字节恢复**成 `origin/staging` 版本(`git checkout origin/staging -- scripts/jaimini.py`)。Karaka 职责的英文改在渲染侧按 karaka 名查表(放在 `pl9_reader_export.py` 或一个新的非冻结模块,例如 `scripts/report_render/` 下)。 + +验收:`git diff origin/staging -- scripts/jaimini.py` 为空;`pytest tests/test_sealed_holdout_contract_freshness.py` 通过;开工前把本分支改动的文件清单与该 JSON 里所有 `scripts/*` 路径求交集,结果为空,写进 PROGRESS。 + +## H2 · 测试里的 PyJHora 屏蔽没传到子进程(必修,红线 5) + +`scripts/annual_pyjhora_replay.py` 的 `_run_isolated_tajaka_year_lord`、`_run_isolated_annual_replay` 每份报告都另起 `sys.executable -c …` 子进程(`timeout=30`)。`tests/report_english_fictional.py` 的 `block_jhora` 只改了本进程的 `builtins.__import__`,子进程不受影响:装了 PyJHora 的机器上子进程会真跑 PyJHora,返回生产上根本没有的年运数据(Claude 实测 1.4 秒拿到真实 `annual_chart`)。所以 200 张与 12 张两份测试渲染的不是生产那份报告——测出来汉字为 0 不能说明生产为 0。 + +这也是测试慢的原因:每张盘多起两个跑真 PyJHora 的子进程,Windows 上 4 进程并发时有的撞上 30 秒超时。 + +修法(二选一,推荐第一种): +1. 在 `render_english` / 进程池初始化里把这两个 `_run_isolated_*` 替换成直接返回「blocked」的桩,与生产无 PyJHora 时的返回形状一致; +2. 或用环境变量 + `sitecustomize` 让子进程同样屏蔽 `jhora`。 + +验收:加一条断言——测试渲染时这两个函数返回的是 blocked 形状,且整个测试过程中没有启动 PyJHora 子进程(例如给 `subprocess.run` 计数);在装了 PyJHora 的机器上 smoke 与 200 张重跑仍全过;PROGRESS 记下新的耗时(Windows 串行 / 进程池各一次)。smoke 已在 `CORE_PYTEST_TARGETS` 里,改完后若 Windows 上仍超过 90 秒,写明实测数字,由 Claude 在 Linux 上复测后决定。 + +## H3 · 缺英文时现在是「留空」,等于把漏洞藏起来(必修) + +`render_pl9_parity_markdown` 的瑜伽、Dosha、Sade Sati、Jaimini 表,以及 `_render_pl9_ai_density_raw_data_markdown_en` 的 `_english_plain`,遇到组合 / 作用 / 强度 / 摘要 / 职责里有汉字时直接输出空格。任务书 T2 写的是「两者都没有时不得回落到中文——让 200 张盘测试暴露出来」:留空既不回落中文,也让测试看不见缺的 `combination_en`。 + +修法:留空的地方改成写一个固定标记(例如 `[translation missing: <字段名>]`),并在 200 张与 smoke 测试里断言这个标记出现次数为 0;出现的就去生产者补英文孪生字段。若某处确实补不了,PROGRESS 列出字段、盘数和源头位置,交 Claude 判断。 + +## 顺手改(小) + +- `tests/test_narayana_legacy_label.py`:新的三栏说明覆盖掉了原来 BUG-1218 那一段,改成追加在下面,旧的保留。 +- `tests/report_english_fictional.py` 的 `chart_flags` 与已有 `_flags_from_packet` 重复,能复用就复用。 +- `yogas_doshas.calc_raj_yogas` 遍历 `set`,结果顺序随 `PYTHONHASHSEED` 变(改前就有)。不在本单修,但 BUG_HISTORY 新增一条 `investigating` 记下现象与位置,便于以后排序固定。 + +## 交回前必跑 + +- `pytest tests/test_sealed_holdout_contract_freshness.py tests/test_report_english_sweep_smoke.py tests/test_report_english_sweep.py tests/test_narayana_legacy_label.py tests/test_report_english_han_sources.py` 及原单列出的既有测试文件。 +- **Python 快速门** `python scripts/run_quality_gate.py --profile quick`(工作树 `.venv`),回报退出码与通过 / 失败数。 +- 中文逐字节对比(30 张,`PYTHONHASHSEED=0`,对照合并后的 `origin/staging`)。 +- 全量 pytest、前端英文判定由 Claude 验收时跑。