Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
11 KiB
TASK · 报告正文换成上游读者版 + KP / Muntha 计算缺陷 + 投影截断(2026-09-24)
基线
- 本仓
origin/staging = 9c9b66d6。上游https://github.com/732642856/yinduzhanxing.git,本机检出/workspace/yinduzhanxing@19195f6e;读者版引入提交f3b5196f(2026-09-09「fix: add clean high-density PL9 reader export」)。 - 分支
codex/report-reader-main-20260924。引擎 / 上游同步类任务:开工前必须按 AGENTS §9 读docs/research/pre_work_error_ledger.md并跑python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45;不得把.workbuddy镜像当主仓。 - 串行:
TASK-report-chapter-export-fix-20260924.md(BUG-1020)先合,本单后合(两者都会动报告 golden 与导出锁)。与TASK-report-reader-actions-20260924.md文件不交叉。
事故实证
产品 09-24 真机报告正文出现大量非人读内容,例如:「结论等级规则 - executed / partial_verified…」「Sudarshana Chakra(三参考点原始结构)…PL9 第 8 页的三层图格尚未逐格对照…不输出 producer 自带的复合评分」「本节仅披露 PL9 图盘提取…OCR 候选」「Domi 受控样本的 16 个星座行已在 PL9 第 42 页 fixture 中匹配」「…所有行保持」(半句)、「KP Lord / Sub 原始表(本地计算) blocked / kp_lord_sub_unavailable KP producer failed: 'types.SimpleNamespace' object has no attribute 'year'」、报告身份块(full-report://…、pl9_personal_long_report.v2、hash、质量检查: blocked、Chart Identity: birth=user_provided…)、英文「This reference export combines…」、年度章「annual_tajika_pack」「kp_monthly_report_packet」「Muntha 当前优先候选指向conflict between vs Capricorn」、「Patyayini Dasha 外部回放(PyJHora/JHora) blocked / annual_replay_unavailable year=2027」。
三层根因(origin/staging 实证):
- 用错格式:正文 =
scripts/professional_report_reference.py→render_pl9_markdown(scripts/jyotish_engine.py),这是上游的专业参考 / 审计版。上游另有读者版reader_main:_render_pl9_user_markdown(上游scripts/jyotish_engine.py:11722,docstring "user-facing … without parity/audit scaffolding")、_pl9_export_markdown_for_edition(:13099)、render_pl9_parity_markdown(:13148);上游审计docs/research/pl9_reader_main_information_coverage_audit_2026_09_09.md声明读者版不含blocked/parameter_sensitive/PyJHora/producer/schema/source_path。本仓引擎这四个符号 0 命中(最后一次引擎同步f2241463在 09-03,早于f3b5196f)。cfcd369d(09-06)把参考版设为正文,而TASK-report-longform-parity-20260905当初只批准它作附录。 - 本仓自加的泄漏:
_render_finished_reading_navigation(「结论等级规则」,bab07187引入,上游无);_professional_report_reference_boundary_notice的英文段(3b09bbbe);_kp_lord_sub_section/_year_replay_subblocks走_blocked_planned_section打印原始error/reason(cfcd369d,上游在空结果时返回[])。 - 投影是短黑名单且有破坏性:
frontend/src/lib/report-public-projection.tsINTERNAL_HEADINGS/INTERNAL_KEY_TOKEN/ORDINARY_OUTPUT_LEAK_PATTERNS不认识 PL9 词汇;projectProseLine在parameter_sensitive处截断句子(产生「…所有行保持」和孤立的「-」),tableIsInternal删整表而保留其标题和说明段。personal-report-density-retry.test.ts` 把这份泄漏输出的 sha256 锁成 golden。
两个真实计算缺陷:
- KP 永远失败:
scripts/jyotish_api_server.py_compute_full_reading_for_thematic用type('Args', (), {...})()构造参数(字段在类上、实例__dict__为空);jyotish_engine.pycmd_kp执行SimpleNamespace(**vars(args))只拷到ayanamsa,随后读.year抛错。同型写法还在transit_args = SimpleNamespace(**vars(args))(double_transit_pac / transit_ll7l / planetary_congregation),网页路径同样会失败。上游有同样潜伏缺陷,只是空结果时不输出。 - Muntha / Year Lord 恒错:
scripts/solar_return.py读sr.get('birth_asc_sign_idx'),本仓calc_solar_return_chart返回字典从不设置该键(上游在 solar_return.py:501 设置;f2241463合并时漏掉这半)。结果 Muntha 恒为blocked,Year Lord 回退muntha_sign_idx=0→ 恒为火星 / 白羊座;annual_tajika_pack.py_field_with_conflict_gate用整字典比较,blocked 与正常值必判冲突,_field_brief生成「conflict between vs X」,引擎_humanize_reader_summary_line的冲突正则因空组匹配失败,落到simple_match渲染成「当前优先候选指向conflict between vs X」。这是年运结论的正确性缺陷,不只是文案。
决策记录(产品 2026-09-24)
- D1 新报告正文改用上游读者版
reader_main:从上游f3b5196f..19195f6e同步_render_pl9_user_markdown、_pl9_export_markdown_for_edition、render_pl9_parity_markdown及其依赖;professional_report_reference.py增加edition参数,网页生成链(frontend/src/lib/personal-report-longform-generate.ts)请求edition: "reader_main"。专业参考版不再作为正文,也不再提供用户入口(原始附录入口已由TASK-report-reader-actions删除)。 - D2 旧报告不回填:已生成的报告保持原正文(投影修复后会比现在干净);用户可重新生成。不写迁移、不批量重算。
- D3 删除本仓自加的三处:「结论等级规则」块、英文 boundary 段、
_blocked_planned_section打印原始 error/reason 的做法(改为:数据不可用的节整节不输出,与上游一致)。这些即使在参考版里也删。 - D4 修两个计算缺陷:KP / transit 的 args 拷贝改为不依赖
vars()(显式读取所需字段,或_compute_full_reading_for_thematic改用真SimpleNamespace);补回birth_asc_sign_idx;_field_with_conflict_gate在一方status == "blocked"时不判冲突、取另一方;比较只比关键字段(星座 / 主星),不比整字典。 - D5 投影修正:
projectProseLine遇内部 token 删整行而不是截断;tableIsInternal删表时连同紧邻的表头说明段一起删;新增 PL9 词汇防线(blocked、executed、partial_verified、missing_in_local、producer、parity、PL9 第 N 页、full-report://、pl9_*、*_unavailable、*_pack/*_packet标识符、Python 异常形态object has no attribute、Traceback、整段英文),用于ordinaryOutputLeaks检测(读者版输出必须 0 命中)。 - D6 Skill / 报告版本:报告版本号从
pl9_personal_long_report.v2升 v3(读者版);Skill 是否 bump 由执行方按 CHANGELOG 规则判断并写明。
硬红线
- 许可证边界:上游代码按既有同步方式整段引入并注明来源提交,不改动上游算法口径(除 D4 两个缺陷,且须在 BUG 记录说明上游同样存在)。
- 不改 Ayanamsa / Node / 宫制 / 大运口径与置信度边界(AGENTS §8.4)。
- 读者版 golden 必须由真实引擎生成(AGENTS §7.4),用明确虚构生日;旧
report-density-fictional-reader.json保留给旧报告回归,新增 reader_main fixture。 ordinaryOutputLeaks(读者版正文) = [],且 D5 新增的每一类词汇在读者版 golden 中 0 命中;该断言不得弱化。- 旧 golden sha 断言(
personal-report-density-retry.test.ts等)改动必须写三栏,说明"原 sha 锁的是泄漏输出"。 scripts/jyotish_api_server.py不得增长(test_api_server_growth_contract.py);新逻辑进独立模块。- 快速门
run_quality_gate.py --profile quick与相关 Python 定向测试必跑;不改 workflow / 并发 / 数据库结构。
任务分解
- T1 同步读者版(
scripts/jyotish_engine.py或新模块、scripts/professional_report_reference.py)。验收:Python 测试——同一虚构 packet,edition="reader_main"输出不含 D5 词汇、含上游审计文档列出的核心章节;edition缺省仍为参考版(后向兼容)。 - T2 生成链切换(
personal-report-longform-generate.ts、快照 schema 若需版本字段)。验收:professional-report-reference-route.test.ts断言请求体带edition: "reader_main";新报告版本 v3。 - T3 删自加泄漏(D3)。验收:参考版输出也不再含「结论等级规则」「This reference export」「producer failed」。
- T4 KP / transit args(D4 前半)。验收:Python 测试用
type('Args', (), {...})()形态的参数调用cmd_full_reading路径,KP 与三项 transit 结果非 blocked。 - T5 Muntha / Year Lord(D4 后半)。验收:虚构生日的太阳回归
birth_asc_sign_idx存在,Muntha 非 blocked,Year Lord 随年份变化(至少两年不同);annual_tajika_pack在一方 blocked 时无「conflict between」。 - T6 投影(D5)。验收:
report-public-projection.test.ts新增 PL9 词汇用例;「…所有行保持」类截断不再出现(整行删除);旧 fixture 投影后不再含孤立「- `」。 - T7 记录:
docs/BUG_HISTORY.mdBUG-1026 报告正文用了审计版 + 投影截断(关联 BUG-999、1003、1009;复发自 BUG-999——写明为何当时的测试只覆盖聊天键没拦住);BUG-1027 KP args 拷贝失败;BUG-1028 Muntha 缺birth_asc_sign_idx致 Year Lord 恒火星(关联f2241463同步漏合)。docs/research/pre_work_error_ledger.md追加"上游同步漏合"条目。CHANGELOG、PROGRESS、docs/testing/report-reader-main-20260924.md(生成一份新报告,逐章检查无英文 / 页码 / blocked / 异常原文;年度章 Muntha 与 Year Lord 每年不同;KP 节存在)。
让步顺序
- 上游读者版依赖过多、整段引入会让本仓引擎失控时,允许以新模块
scripts/pl9_reader_export.py引入并在引擎中薄注册。 - D5 的英文整段检测若误伤行星英文名 / 术语,允许改为"连续 ≥ 12 个英文单词的段落"判定。
- 不得让步:D1(正文换读者版)、D4(两个计算缺陷)、红线 3、红线 4。
开工前置命令
git fetch origin --prune
python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
git -C /workspace/yinduzhanxing fetch origin && git -C /workspace/yinduzhanxing log --oneline -1 origin/main
git worktree add -b codex/report-reader-main-20260924 .worktrees/report-reader-main-20260924 origin/staging
cd .worktrees/report-reader-main-20260924
.venv/bin/python scripts/run_quality_gate.py --profile quick # 记基线
cd frontend && ./node_modules/.bin/tsc --noEmit && npm test 2>&1 | tail -5
BUG 编号
本单 BUG-1026 / 1027 / 1028(1021–1025 已被同日其它单预留),开工时核对。