Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LutgzyJqNhPpZy1nFsJtN3
12 KiB
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/staging856bc850b - 个人报告走完整数据版:
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. 硬红线
- 不改引擎数值(大运、宫主、落宫、尊贵、功能吉凶的判定);只改呈现。
- 摘要卡的数据由 Python 生成结构化围栏(与
jyotish-chart同一模式),前端只解析和渲染;前端不自算大运或宫主。 - 只做一个新组件;不写第二套 Markdown 渲染、不加 spinner / 骨架(AGENTS.md §6)。
- 旧报告(正文里没有新围栏)必须照旧显示,不崩、不空白。
- 名字只在报告阅读页(本人登录可见)显示;不得把名字加进
frontend/src/lib/report-public-projection.ts的公开投影,也不写进任何测试 / 文档 / 提交里的真实姓名(测试用虚构名)。 - 不改数据库结构与迁移;不碰
frontend/src/app/(app)/page.tsx;scripts/jyotish_api_server.py不增长。 - 改既有断言按 §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.py173–174、197 行附近)。 - 不升级依赖,不顺手修别的 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 --noEmit0 错、npm run lint0 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。