From 358a41fe52cdae503cf12df23b8b06e3d29ab431 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Tue, 13 Oct 2026 13:12:55 +0800 Subject: [PATCH] docs(tasks): report translation gaps brief (agent loop, issue #53) Co-Authored-By: Claude (agent loop) Claude-Session: https://claude.ai/code/session_01SKLQ768nneCz8kp5QwHfhf --- docs/tasks/README.md | 1 + .../TASK-report-translation-gaps-20261013.md | 132 ++++++++++++++++++ .../report-translation-gaps-20261013.md | 14 ++ 3 files changed, 147 insertions(+) create mode 100644 docs/tasks/TASK-report-translation-gaps-20261013.md create mode 100644 docs/testing/report-translation-gaps-20261013.md diff --git a/docs/tasks/README.md b/docs/tasks/README.md index e3bcf87b..44e21796 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -210,6 +210,7 @@ | 任务书 | 进度 | 主题 | 状态 | 落点 | | --- | --- | --- | --- | --- | +| `TASK-report-translation-gaps-20261013.md` | — | **个人报告中英混杂、正文图盘空白、上升行、同位列(agent 循环 issue #53)**:中文完整数据版靠短词替换英文,正文残留 218 处英文词与 14 处中英粘连,卫生检查只有黑名单(BUG-1312);完整数据版图盘节只有空标题、无围栏,BUG-1203 的回归(BUG-1313);报告本命表无上升行(BUG-1314);D9 同位列「—」读如没数据,改「是/否」(BUG-1315)。分盘核对段随 T1 自动消失。执行方 Grok | 待领取 | `codex/report-translation-gaps-20261013` | | `TASK-report-full-data-edition-20261007.md` | `PROGRESS-report-full-data-edition-20261007.md` | **报告改为完整数据版、删除阅读版**:网站阅读版中文 7.6 万字符 vs 上游 `pl9_ai_density` 97 万;移植原始数据附录 / 清理器 / 时间补充,中英文;我方报告口径(BUG-1199~1229)全部保持;旧报告仍可打开;排在 sync6 之后 | 已验收(Claude 补修 BUG-1282 后合入 staging) | `codex/report-full-data-edition-20261007`(未推 staging) | | `TASK-report-full-data-fix-20261008.md` | `PROGRESS-report-full-data-fix-20261008.md` | **完整数据版补齐**(同分支继续):解释段、年运字段、开篇重点、英文汉字清零。Patyayini 不新算。生成按钮文案不改。等验收后再合入 staging | 已验收(Claude 补修 BUG-1282 后合入 staging) | `codex/report-full-data-edition-20261007`(未合入 staging) | | `TASK-report-full-data-fix2-20261008.md` | `PROGRESS-report-full-data-fix2-20261008.md` | **完整数据版第二轮**(同分支续):年运章投影已有字段,大运解释补「可能」段落,瑜伽作用不再断言寿命,术语不进标识符,罗睺/计都不写「守护第未列出宫」。章动单不在本分支 | 已验收(Claude 补修 BUG-1282 后合入 staging) | `codex/report-full-data-edition-20261007`(未合入) | diff --git a/docs/tasks/TASK-report-translation-gaps-20261013.md b/docs/tasks/TASK-report-translation-gaps-20261013.md new file mode 100644 index 00000000..8d6b6f3c --- /dev/null +++ b/docs/tasks/TASK-report-translation-gaps-20261013.md @@ -0,0 +1,132 @@ +# TASK · 个人报告中英混杂、正文图盘空白、上升行与同位列(issue #53) + +- 日期:2026-10-13 +- 来源:Gitea issue #53(agent 循环试点),产品负责人截图(截图时间 2026-10-01,早于 10-03 的 BUG-1199~1203 修复与 10-07 完整数据版切换) +- 执行方:**Grok(Windows + Docker)**,分支 `codex/report-translation-gaps-20261013`,只推这个分支 +- 验收:Claude(Linux) +- BUG 编号:BUG-1312 ~ BUG-1315(开工时核对 `docs/BUG_HISTORY.md` 最大号;本任务书写作时最大号为 BUG-1310,BUG-1311 已预留给 issue #52) + +## 1. 基线 + +- 基线 commit:`origin/staging` `941b06c19` +- 个人报告生成走完整数据版:`frontend/src/lib/personal-report-longform-generate.ts` 请求体 `edition: "full_data"`,Python 侧 `scripts/pl9_full_data_export.py::render_full_data_markdown` → `scripts/pl9_reader_export.py::render_pl9_parity_markdown`。 +- 复现方法(虚构盘,不涉及真实资料): + +```bash +PYTHONPATH=.:scripts python - <<'EOF' +import copy +from scripts.pl9_reader_export import _pl9_export_markdown_for_edition +from tests.test_report_english_edition import CASES, _packet +p = _packet(CASES["day"]) +open("/tmp/r53_zh.md", "w").write(_pl9_export_markdown_for_edition(copy.deepcopy(p), "full_data")) +EOF +``` + +## 2. 事故实证(逐条对照截图,基于 `941b06c19` 当前代码重跑) + +| # | 用户说的 | 截图时(10-01) | 当前代码(941b06c19) | 结论 | +| --- | --- | --- | --- | --- | +| 1 | 翻译不全、中英混乱 | 「入旺(入旺)」「落陷取消 (Neecha Bhanga)」、目录大量英文 | 「入旺(入旺)」型重复已消失;目录标题已中文化;但正文(附录之前)仍有 **218 处**英文功能词/状态词(`listed` 92、`background` 10、`Custom condition met` 10、`native` 8、`of/in/the/by` 等),**14 处**汉字与英文单词粘连(如「木星Jupiterexalted在巨蟹座」「A 第hemmed in by malefics」「Raja瑜伽 (Mutual 相位)」「宫主 of 星座 occupied in navamsa…」) | **仍存在** → BUG-1312 | +| 2 | 「本命与分盘北印度图盘」没显示图 | 只有一列盘名 | 完整数据版该节仍是 19 个空的 `#####` 小标题,**0 个** `jyotish-chart` 围栏;同一函数的 reader_main 版有 22 个围栏 | **仍存在** → BUG-1313 | +| 3 | 画框列没数据(Kranti、BAV/承接、Full with 上升) | 整列「-」 | Kranti 列已删(表名「赤纬 / 速度」);Ashtakavarga 表已拆成 Sodhita SAV / Raw SAV / 上升 BAV / 合计,逐宫有数 | **已修**(BUG-1199 / 1200,`ae18952e`,10-03 部署);旧报告按当时正文打开,需重新生成 | +| 4 | 「分盘核对……不单独增加结论的确定性」可收起或并入前面的分盘部分 | 页面末尾「分盘核对」+ 提示句 + 全部分盘 | 提示句已挪到正文图盘标题下;但因第 2 条正文没有围栏,`ReportCalculationCharts` 仍在末尾把全部分盘画成「分盘核对」 | **随第 2 条一并解决**(见决策 D1) | +| 5 | 本命盘上升的星宿、宿主、pada、状态没数据 | — | 星盘页:BUG-1201 已让上升行有星宿 / 宿主 / pada(10-03 部署)。报告:「本命盘行星原始位置」表**根本没有上升行** | 星盘页已修待真机;报告 → BUG-1314 | +| 6 | D9 的庙旺和同位没数据 | — | 庙旺:BUG-1202 已全档(10-03 部署,旧缓存整列隐藏)。同位:`chart-vedic-tab.tsx::VargaRow` 非同位显示「—」,大多数行星都不是同位,整列几乎全是「—」,读起来像没算 | 庙旺已修待真机;同位 → BUG-1315(见决策 D2) | + +## 3. 根因 + +- **BUG-1312(中英混杂)**:中文完整数据版不是独立写中文,而是对上游英文文本做短词替换(`scripts/pl9_full_data_export.py::_sanitize_pl9_ai_density_markdown`),替换不到的词原样留下,替换到一半的词与英文粘在一起;另有若干字段值本身是英文枚举,中文版直接印出: + - `pl9_reader_export.py::render_pl9_parity_markdown` 宫主表最后一列写死 `'active' / 'background'`; + - 大运边界状态 `listed`(`pl9_interpretation_packs.py`、`pl9_full_data_export.py` 里 `partial_verified → listed`); + - `rashi_dasha_report.py` 的 `native`; + - `yoga_engine.py` 把「自定义条件满足」译成 `Custom condition met` 后中文版沿用; + - 瑜伽 `formation` 文本(如 hemmed in by malefics、occupied in navamsa)未进中文术语表。 + - 为何没拦住:中文版卫生检查 `_pl9_markdown_hygiene_receipt` 只有一张固定黑名单,没有像英文版「汉字数 = 0」那样的通用残留门(英文版 BUG-1272 有)。 +- **BUG-1313(正文图盘空白)**:`render_pl9_parity_markdown` 只给每张盘写 `##### p{页} · {盘名}` 空标题,从不写图盘围栏;reader_main 版的围栏来自 `jyotish_engine.py` 的 `_render_south_chart`,完整数据版没走这条。10-07 个人报告改用完整数据版后,BUG-1203「新报告正文画全分盘、末尾整段消失」的前提失效——**这是 BUG-1203 的回归**(当时的测试只用 reader_main golden)。 +- **BUG-1314(报告无上升行)**:「本命盘行星原始位置」表只遍历九曜,`core_chart.ascendant` 已带 `nakshatra / nakshatra_pada / nakshatra_lord`(BUG-1201 的 `_nakshatra_fields`)但报告没用。 +- **BUG-1315(同位列像没数据)**:BUG-1099 规定 D9 才显示同位列、不支持时整列隐藏;列内「—」表示「不是同位」,与「没数据」同形。 + +## 4. 决策记录 + +- 产品负责人在 issue #53 授权修复上述缺口。 +- **D1(第 4 条:收起还是并入)**:推荐「并入」——图盘画进正文「本命与分盘北印度图盘」一节,提示句已在该节标题下,末尾「分盘核对」按 BUG-1203 既有去重规则自动消失,不新增折叠控件。若产品选「收起」,改为末尾段落默认折叠(`
`),其余不变。**待产品确认;未确认前按推荐执行。** +- **D2(第 6 条同位列措辞)**:推荐非同位写「否」、同位写「是」(D9 表头仍为「同位」);备选保持「—」只加表头注释。**待产品确认;未确认前按推荐执行。** +- 不推翻 BUG-1099 的能力声明规则(非 D9 不显示同位列、旧缓存保守隐藏)。 +- 不推翻 BUG-1203:同一张盘页面只画一次,页面与导出共用 `fencedReportChartIds`。 +- 上升行「状态」列写「不适用」(沿用 BUG-1099「上升标不适用」口径),不自造上升庙旺。 + +## 5. 硬红线 + +1. 不改 `scripts/jyotish_api_server.py` 的类方法数与 `__new__` 伪造点(§6);不改数据库结构与迁移。 +2. 不改 `scripts/ashtakavarga.py` 及 `scripts/research/sealed_holdout_rerun.py::PRODUCTION_FILES` 内任何文件。 +3. 图盘只用 `scripts/report_chart_block.py::build_chart_block` 生成围栏,不写第二套画盘逻辑;页面不另写第二套去重。 +4. 不改引擎数值(行星位置、星宿、分盘、庙旺判定);只改报告呈现与中文用词。 +5. 英文版不得退化:`tests/test_report_english_edition.py` 汉字数 = 0 的断言保持;中英二级标题数保持一致。 +6. 不得在测试、文档、提交里写入任何真实用户出生资料;只用 `tests/test_report_english_edition.py::CASES` 的虚构盘或公开名人盘。 +7. 改既有断言按 AGENTS.md §7.3 写「原值 / 新值 / 原因」三栏;先 grep `frontend/tests/`、`tests/` 里 `分盘核对`、`本命与分盘北印度图盘`、`##### p`、`同位`、`supportsVargottama` 的按文本断言(已知:`frontend/tests/report-calculation-charts.test.tsx`、`frontend/tests/chart-varga-table.test.tsx`、`frontend/tests/chart-page-hook.test.ts`、`tests/test_chart_page_vedic_tables_contract.py`、`tests/test_report_chart_blank_columns.py`)。 +8. 不顺手升级依赖、不顺手修任务书外的 warning;年度图盘(「年度北印度图盘」文字表)不在本单范围。 + +## 6. 任务分解 + +### T1 · 正文画出本命与分盘图盘(BUG-1313,含决策 D1) + +- 在 `pl9_reader_export.py::render_pl9_parity_markdown` 的「本命与分盘北印度图盘」节,每个有数据的盘写 `##### 盘名` + `build_chart_block(...)` 围栏(D1 用 `core_chart`,月亮盘 id `MOON` 以月亮星座为参考上升,分盘用 `varga_full[Dn_*]` 及其 `Ascendant`)。逆行标记取本命 `retrograde`,与 `jyotish_engine.py::_render_south_chart` 一致。 +- 同一 id 只画一次:删掉与「D9 九分盘」重复的「Navamsha」;没有可画 id 的「Bhava (Sripati)」不再输出空标题(其数据已在「月亮盘 / Sripati 宫位精确表」)。 +- 中英两版都要有;英文版标题走 `pl9_reader_english_terms.py`。 +- 验收: + - 新测试(建议放 `tests/test_report_chart_blank_columns.py` 或新文件):虚构日盘完整数据版中英两版,该节内围栏数 = 有数据的盘数,id 不重复,每个围栏能被 `report_chart_block.FENCE_RE` 解析且 `layout == "north"`;该节内不存在「后面紧跟另一个标题」的空 `#####` 标题。 + - 前端:用新生成的完整数据版正文做 golden,`fencedReportChartIds` 覆盖 `calculationCharts` 全部 id → `ReportCalculationCharts` 渲染为空(即末尾「分盘核对」消失)。golden 由真实引擎输出生成,`sourceCommand` 写明。 + - 导出:`frontend` 既有导出测试全绿;若冻结哈希因正文变化而变,按三栏说明更新。 + +### T2 · 中文版英文残留清理与残留门(BUG-1312) + +- 把第 3 节列出的英文枚举在中文版里换成中文:`active/background` → 「当前运行 / 背景」;`listed` → 「已列出」;`native` → 「本命」;`Custom condition met / custom condition satisfied` → 「满足自定义条件」;瑜伽 `formation` 常见句补进中文术语表(`pl9_language_terms` 或现有 glossary,别新建第三份)。粘连问题从替换顺序上修(整句/长词先于短词),不靠事后删字。 +- 新增中文版残留门:在 `_pl9_markdown_hygiene_receipt(language="zh")` 加一项——正文(`## 结构化资料附录` 之前)汉字与 ≥3 个拉丁字母直接粘连数 = 0,且英文功能词(of/in/the/and/by/from/with/listed/background/native/condition/met/satisfied/occupied)出现数 = 0;允许括号内的梵文专名(星宿、瑜伽、Dasha 名)与表头里的技术缩写(SAV、BAV、KP、D1–D60 等),允许清单写在代码里并注明理由。 +- 验收: + - 虚构日盘 / 夜盘 + 一张公开名人盘(爱因斯坦或乔布斯,按 BUG-1272 用过的公开资料)中文完整数据版:粘连 0、功能词 0(当前基线:粘连 14、功能词 218)。 + - 故意注入「木星Jupiterexalted」的单测,残留门报 fail。 + - `tests/test_report_english_edition.py`、`tests/test_reader_appendix_language.py`、`tests/test_reader_appendix_shared_rules.py`、`tests/test_report_reader_main.py` 全绿。 + +### T3 · 报告本命表加上升行(BUG-1314) + +- 「本命盘行星原始位置」表首行加「上升」:星座、度数、黄经、宫位 1、星宿(同九曜的「中文(梵文)」格式)、pada;R/C、速度写「-」;「行星主星与状态」表上升行尊贵状态写「不适用」,星宿主取 `nakshatra_lord`。中英两版。 +- 验收:新测试断言上升行星宿 / pada / 星宿主与 `scripts/jyotish_engine.py::_nakshatra_fields(asc_lon)` 一致(虚构日盘);`tests/test_report_chart_blank_columns.py` 既有用例全绿。 + +### T4 · D9 同位列措辞(BUG-1315,含决策 D2) + +- `frontend/src/components/chart-page/chart-vedic-tab.tsx` 的 `VargaRow` / `VargaAscendantRow`:同位「是」、非同位「否」;列仍只在 `supportsVargottama` 时出现。同步 `frontend/DESIGN.md`(星盘页分盘表一节)。 +- 验收:`frontend/tests/chart-varga-table.test.tsx` 改断言(三栏说明);新增「非同位行显示『否』」与「非 D9 无同位列」两条;`tsc --noEmit` 0 错、`npm run lint` 0 error、`next build` 后 `/` 仍 Static、首屏 gzip ±2%。 + +### T5 · 记录 + +- `docs/BUG_HISTORY.md` 新增 BUG-1312~1315;BUG-1313 写「复发自 BUG-1203(完整数据版切换后正文无围栏)」,并说明当时只用 reader_main golden 测,没拦住。 +- `docs/tasks/PROGRESS-report-translation-gaps-20261013.md`、`CHANGELOG.md`(用户可感知:报告正文出图、中文更干净、上升行、同位列)。 +- 真机清单 `docs/testing/report-translation-gaps-20261013.md`。 + +## 7. 让步顺序 + +时间不够时按此顺序保留:T1 → T3 → T4 → T2。T2 若只能部分完成,残留门先以「当前计数不得上升」落地,计数写进进度记录,剩余条目写 `BLOCKED.md`,不得把门放宽成只测黑名单。 + +## 8. 验收命令分工 + +| 谁 | 命令 | +| --- | --- | +| Grok 自跑(工作树 `.venv`) | `python -m pytest tests/test_report_chart_blank_columns.py tests/test_report_english_edition.py tests/test_reader_appendix_language.py tests/test_reader_appendix_shared_rules.py tests/test_report_reader_main.py tests/test_chart_page_vedic_tables_contract.py -q`;前端 `tsc --noEmit`、`npm run lint`、改到的前端测试单文件(`node --test`,看 fail 与 cancelled 都为 0)。按 `TASK-agent-loop-pilot-20261013.md`「T1 结果与定稿分工」,前端全量 `npm test` 与 Python 快速门**不跑**,以 Claude 为准 | +| Claude 验收 | 同上全部重跑 + 全量 `pytest`(引擎相邻改动,见 feedback-full-suite 规则)与基线逐条比对;逐行审 diff(越界文件、断言弱化、隐私);重生成虚构盘中文报告核对粘连 / 功能词计数 | +| 不需要 | `test:db`(不动数据库访问层) | + +## 9. 开工前置命令 + +```bash +git fetch origin --prune +git worktree add -b codex/report-translation-gaps-20261013 .worktrees/report-translation-gaps-20261013 origin/staging +cd .worktrees/report-translation-gaps-20261013 +git log -1 --format=%h # 应为 941b06c19 或其后代 +grep -n "^## BUG-" docs/BUG_HISTORY.md | tail -3 # 核对最大号,BUG-1311 已预留 +grep -rln "分盘核对\|本命与分盘北印度图盘\|##### p\|同位\|supportsVargottama" frontend/tests tests +``` + +## 10. 环境缺口(预告) + +- 旧报告按生成时保存的正文打开,修复只对**新生成**的报告生效;真机验收要重新生成一份。 +- 无登录态时浏览器级验收留给 `docs/testing/report-translation-gaps-20261013.md`。 diff --git a/docs/testing/report-translation-gaps-20261013.md b/docs/testing/report-translation-gaps-20261013.md new file mode 100644 index 00000000..d8e2e0cf --- /dev/null +++ b/docs/testing/report-translation-gaps-20261013.md @@ -0,0 +1,14 @@ +# 真机清单 · 报告图盘、中文清理、上升行、同位列(issue #53) + +前提:staging 已部署本单提交。**旧报告不会变**,先在「我的报告」重新生成一份。 + +1. 打开新报告,中文。目录点「本命与分盘北印度图盘」:每个盘名下面有一张北印度方形图盘,不再只是一列盘名;D9 只出现一次。 +2. 拉到报告最末:不再出现「分盘核对」一节和第二遍图盘。 +3. 「本命盘行星原始位置」表第一行是「上升」,星宿、pada 有值;下面「行星主星与状态」表上升行的尊贵状态写「不适用」。 +4. 随手翻「宫主落宫解释」「瑜伽」「大运」几节:看不到 listed、background、native、Custom condition met 之类英文,也没有「木星Jupiter…」这种中英粘在一起的字。星宿、瑜伽的梵文名放在括号里是正常的。 +5. 切到 English:图盘同样出现在正文;英文里没有汉字。 +6. 导出 PDF:图盘各出现一次,不重复。 +7. 星盘页 → D9 表:「庙旺」列每行有字;「同位」列每行写「是」或「否」,不再整列横杠。切到 D10 等其它分盘:没有「同位」列。 +8. 星盘页 D1 表上升行:星宿、宿主、pada 有值,状态写「不适用」或横杠。 + +有任何一步不符,截图并写明是第几步。