Files
Jyotisha/docs/tasks/TASK-report-focus-card-20261013.md
T

12 KiB
Raw Blame History

TASK · 个人报告开篇「重点」页做成摘要卡(issue #55)

  • 日期:2026-10-13
  • 来源:Gitea issue #55(agent 循环试点),产品负责人截图:报告第 1/39 章「重点」只有一行粗体标题、一行「重点:当前主运 MD …」、一个「## 重点」大标题和四句数据句,「一点 UI 设计都没有」
  • 执行方:Grok(Windows + Docker),分支 codex/report-focus-card-20261013,只推这个分支
  • 验收:Claude(Linux)
  • BUG 编号:BUG-1316(开工时核对 docs/BUG_HISTORY.md 最大号;写作时最大号为 BUG-1315)

1. 基线

  • 基线 commit:origin/staging 856bc850b
  • 个人报告走完整数据版:frontend/src/lib/personal-report-longform-generate.ts 请求体 edition: "full_data" → scripts/pl9_full_data_export.py::render_full_data_markdown → scripts/pl9_reader_export.py::render_pl9_parity_markdown。
  • 复现(虚构盘):
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
print(_pl9_export_markdown_for_edition(copy.deepcopy(_packet(CASES["day"])), "full_data")[:1200])
EOF

2. 事故实证(856bc850b)

虚构日盘中文完整数据版开头,与产品截图结构一致:

# 印度占星星盘报告
重点:当前主运 MD 北交点,子运 AD 木星,次子运 PD 木星。
## 重点
- 事业第10宫主 土星 落在第9宫,尊贵为入庙,功能吉凶为功能吉星。
- 财富第2宫主 … / 婚恋第7宫主 …
- 这段时间可能突出这些宫主所守护的主题,不是确定会发生的事。
## 出生资料与图盘 …
# 问题 位置
1 「重点」三次:目录第 1 章、「重点:…」一行、## 重点 scripts/pl9_interpretation_packs.py::opening_focus_block 写死该行;scripts/pl9_full_data_export.py::_sanitize_pl9_ai_density_markdown 在首行没有「摘要:/结论:/重点:」时会注入一段固定的「摘要… / ## 重点 1.2.3.」清单,_insert_opening_focus 也按这一行去重,所以这一行是为了躲开注入才存在的
2 报告标题与正文一样大 frontend/src/components/personal-report/personal-report-markdown-view.tsx::markdownComponents 无 h1 映射;frontend/src/app/globals.css 中 .personal-report-md-article h1 只设字体(注释仍写「像 .personal-report-cover h1」,封面已于 09-29 去掉)
3 行话与车轱辘话:MD / AD / PD 无起止日期;「功能吉凶为功能吉星」;「宫主 火星 落在」多空格 opening_focus_block::lord_line,_role 已返回「功能吉星」又被拼在「功能吉凶为」后
4 无版式:四句纯文本列表 同上;阅读器把首个 ## 之前的内容当 lead,与 ## 重点 同在第 0 章卡片里

3. 根因

10-08 TASK-report-full-data-fix-20261008 T3 按上游加了「开篇重点:当前三级大运 + 三宫宫主」,验收只要求内容存在,没有任何呈现规定;frontend/DESIGN.md「Personal report reader」也没有开篇或标题的条目。09-29 去掉报告封面后,标题只剩字体,没人回头补。不是回归,是从未设计。 docs/BUG_HISTORY.md 检索「重点:」「opening_focus」「当前主运 MD」无记录。

4. 决策记录

  • 产品负责人 2026-10-13 在 issue #55 选 A:做成设计过的摘要卡(备选 B 改写两三句、C 删页均未选)。
  • 标题下写名字和生成日期;保留末尾提醒句「这段时间可能突出这些主题,不是确定会发生的事」。
  • 问题 1~4 一并修。
  • 不推翻任何既有红线;不恢复 09-29 去掉的报告封面(只给标题本身样式)。

5. 硬红线

  1. 不改引擎数值(大运、宫主、落宫、尊贵、功能吉凶的判定);只改呈现。
  2. 摘要卡的数据由 Python 生成结构化围栏(与 jyotish-chart 同一模式),前端只解析和渲染;前端不自算大运或宫主。
  3. 只做一个新组件;不写第二套 Markdown 渲染、不加 spinner / 骨架(AGENTS.md §6)。
  4. 旧报告(正文里没有新围栏)必须照旧显示,不崩、不空白。
  5. 名字只在报告阅读页(本人登录可见)显示;不得把名字加进 frontend/src/lib/report-public-projection.ts 的公开投影,也不写进任何测试 / 文档 / 提交里的真实姓名(测试用虚构名)。
  6. 不改数据库结构与迁移;不碰 frontend/src/app/(app)/page.tsx;scripts/jyotish_api_server.py 不增长。
  7. 改既有断言按 §7.3 写「原值 / 新值 / 原因」三栏;开工先 grep:grep -rn "重点:\|## 重点\|Focus: current\|opening_focus\|personal-report-md-lead\|personal-report-md-article h1" tests frontend/tests(已知:tests/test_report_full_data_fix.py 173–174、197 行附近)。
  8. 不升级依赖,不顺手修别的 warning。

6. 任务分解

T1 · 引擎输出结构化「重点」围栏(Python)

  • opening_focus_block 改为输出:

    ## 重点
    ```jyotish-focus
    {"version":1,"periods":[{"level":"md","lord":"Rahu","start":"YYYY-MM-DD","end":"YYYY-MM-DD"},…ad,pd],
     "domains":[{"key":"career","house":10,"lord":"Saturn","placed":9,"dignity":"…","role":"…"},…wealth/2,relationship/7],
     "caveat":"这段时间可能突出这些宫主所守护的主题,不是确定会发生的事。"}
    ```
    

    起止日期取当前 MD / AD / PD 行自带的 start / end(_timing(packet)["dasha"],见同文件英文分支已在用 current_ad.get('start'));拿不到的写 null,不编。dignity / role 用现有 _dignity / _role 的公开词(中文版中文、英文版英文)。

  • 删掉「重点:当前主运 MD …」那一行(中英两版)。

  • _sanitize_pl9_ai_density_markdown 的「开篇摘要」判断与 _insert_opening_focus 的去重,改为识别 ## 重点(英文 ## Focus)及其下的 jyotish-focus 围栏,不得因删掉那一行而重新注入固定清单。

  • 围栏格式写一个 Python 构造函数(建议放 scripts/report_chart_block.py 旁新建 scripts/report_focus_block.py,或同文件),附 FOCUS_FENCE_RE。

  • 中文残留门(BUG-1312 的 _zh_body_residue)对围栏的处理与 jyotish-chart 一致:结构化负载不计入正文。

  • 验收:

    • 新测试:虚构日盘中英两版,## 重点 下恰有一个可解析的 jyotish-focus 围栏;periods 三级 lord 与 _current_lords 一致、日期与大运表一致;domains 三行宫号 10 / 2 / 7;全文不再出现「重点:当前主运」与 MD / AD / PD (中文版);不出现固定清单「先核对出生资料、图盘」。
    • tests/test_report_full_data_fix.py 相关断言按三栏改。
    • tests/test_report_chart_blank_columns.py、tests/test_report_english_edition.py、tests/test_reader_appendix_language.py、tests/test_report_reader_main.py 全绿。

T2 · 阅读页摘要卡组件(前端)

  • frontend/src/lib/ 新增解析器(参照 report-chart-block.ts::parseReportChartBlock),personal-report-markdown-view.tsx 的 pre 分支识别 jyotish-focus 渲染新组件 ReportFocusCard(放 frontend/src/components/personal-report/)。
  • 版式(写进 DESIGN.md,用现有 token,不新增颜色):
    • 第一行「现在走的大运」:主运 · 子运 · 次子运,各写行星中文名 + 起止(YYYY.MM – YYYY.MM),三者横排,窄屏换行;中文不出现 MD / AD / PD。
    • 下面三行:事业 / 财富 / 婚恋。每行左侧领域名,右侧「第 N 宫主 · 行星 · 落第 M 宫」+ 两个小标签(尊贵、功能吉凶),标签沿用站内已有的 pill / badge 样式。
    • 最后一行提醒句,弱化字色、小一号。
    • 手机宽度不横向滚动;深浅色都可读。
  • 解析失败:显示一句「重点数据无效」(英文 "Focus data is invalid"),与图盘无效同口径,不崩。
  • 导出与公开投影:frontend/src/lib/report-export-blocks.ts 把该围栏转成可读文字(参照 chartBlockText),导出文件里不得出现原始 JSON;report-public-projection.ts 对该围栏的处理与 jyotish-chart 一致(按其现有可见性规则),不新增名字字段。
  • 验收:新测试——用 T1 真实引擎输出生成的 golden(frontend/tests/fixtures/,fixtureProvenance 写明命令,虚构盘),渲染出三级大运与三行领域、无 MD、有提醒句;坏 JSON 渲染失败句;导出文本无 {"version";旧正文(无围栏)快照不变。

T3 · 标题样式 + 名字与日期(前端)

  • markdownComponents 增加 h1 映射与样式:显示字体、明显大于 h2、上下留白;去掉 globals.css 里指向已删封面的过时注释。
  • 标题下一行小字:{名字} · 生成于 YYYY-MM-DD。名字取报告文档 subject.displayName(personal-report-generation.ts 已写入),日期取 createdAt;若阅读页当前拿不到 displayName,从报告读取接口带出(仅本人可见的接口,不改表结构)。没有名字时只写日期;标题本身已含名字(引擎 _pl9_public_report_title 在有名字时会写「X的印度占星星盘报告」)时不重复名字。
  • 英文版:{name} · Generated YYYY-MM-DD。
  • 验收:前端测试覆盖「有名字」「无名字」「标题已含名字」三种;tsc --noEmit 0 错、npm run lint 0 error。

T4 · 记录

  • frontend/DESIGN.md「Personal report reader」加「开篇重点卡」与「报告标题」两条(版式、token、旧报告兼容、导出口径)。
  • docs/BUG_HISTORY.md 新增 BUG-1316(报告开篇「重点」页无设计:三重「重点」、标题无样式、MD/AD/PD 行话、数据句堆砌)。
  • docs/tasks/PROGRESS-report-focus-card-20261013.md、CHANGELOG.md。
  • 真机清单 docs/testing/report-focus-card-20261013.md(已随本任务书提供,可补充)。

7. 让步顺序

T1 → T2 → T3 → T4。T3 的「名字」若需要改报告读取接口且发现牵涉数据库或公开投影,先只做日期 + 标题样式,名字写进 BLOCKED.md 并在回报里说明,由 Claude 判断是否 @产品负责人。

8. 验收命令分工

谁 命令
Grok 自跑 python -m pytest tests/test_report_full_data_fix.py tests/test_report_chart_blank_columns.py tests/test_report_english_edition.py tests/test_reader_appendix_language.py tests/test_report_reader_main.py -q;前端 tsc --noEmit、npm run lint、改到 / 新增的前端测试单文件(看 fail 与 cancelled 都为 0)。前端全量 npm test、Python 快速门、整站构建不跑,以 Claude 为准
Claude 验收 上述全部 + 全量 pytest 与基线逐条比对 + 前端全量 npm test + next build(/ 仍 Static,首屏 gzip ±2%)+ 重生成虚构盘中英报告核对围栏
不需要 test:db(不动数据库访问层;若 T3 改了报告读取接口的查询,则需要并按 windows-known-failures.txt 比对)

9. 开工前置命令

git fetch origin --prune
git worktree add -b codex/report-focus-card-20261013 .worktrees/report-focus-card-20261013 origin/staging
cd .worktrees/report-focus-card-20261013
git log -1 --format=%h   # 应为 856bc850b 或其后代
grep -n "^## BUG-" docs/BUG_HISTORY.md | tail -3   # 核对最大号
grep -rn "重点:\|## 重点\|Focus: current\|opening_focus\|personal-report-md-lead\|personal-report-md-article h1" tests frontend/tests

10. 环境缺口(预告)

  • 只对新生成的报告生效;旧报告照旧显示。
  • 浏览器级观感留给 docs/testing/report-focus-card-20261013.md。