feat(report): birth-sky report cover bound to the report's birth fingerprint (F1–F3)

Product decision A (TASK-birth-sky-followup-20260928):
- every generation path writes subject.birthFingerprint (stored-row
  fingerprint, same function as the chart page's profileFingerprint);
  never into the evidence bundle the model reads
- GET /api/reports/:id compares on the server and returns only
  report.coverSubject (subject id or null); legacy reports never get one
- report page shows the night cover above the body, paper cover alone on
  the first printed A4 page; silent on any failure, no waiting state
- TS / JSON schema / Python contract accept the optional field
- BLOCKED T5 struck through; DESIGN §17, CHANGELOG, checklist, PROGRESS

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
Jesse_Chen
2026-09-28 21:47:44 +08:00
co-authored by Claude Opus 5.5
parent 14ef18ac24
commit a9a917d50c
27 changed files with 739 additions and 27 deletions
+9 -3
View File
@@ -27,12 +27,18 @@
## 报告封面
本期**未上线**(报告与出生资料没有可靠绑定,见 `BLOCKED.md`)。验收时确认:打开任何报告,正文最上方**没有**天空封面、也没有空白占位;打印 PDF 第一页仍是原来的报告封面。
~~本期**未上线**(报告与出生资料没有可靠绑定,见 `BLOCKED.md`)。验收时确认:打开任何报告,正文最上方**没有**天空封面、也没有空白占位;打印 PDF 第一页仍是原来的报告封面。~~ → 追加单(`TASK-birth-sky-followup-20260928`)已上线报告封面,原 11、12 条作废,改按下表。
| # | 设备 / 浏览器 | 操作 | 期望 | 结果 |
| --- | --- | --- | --- | --- |
| 11 | 桌面 Chrome | 打开「我的报告」任一份 | 没有天空封面,没有占位 | |
| 12 | 桌面 Chrome | 该报告「打印 → 存为 PDF」 | 第一页与上线前相同 | |
| ~~11~~ | ~~桌面 Chrome~~ | ~~打开「我的报告」任一份~~ | ~~没有天空封面,没有占位~~ | 作废 |
| ~~12~~ | ~~桌面 Chrome~~ | ~~该报告「打印 → 存为 PDF」~~ | ~~第一页与上线前相同~~ | 作废 |
| 18 | 桌面 Chrome | 部署后**新生成**一份报告,打开 | 正文最上方一张深色 3:4 天空封面,宽与正文一致,下面没有按钮;正文先出来,封面随后出现,其间没有占位或转圈 | |
| 19 | 桌面 Chrome | 该报告「打印 → 存为 PDF」 | 第一页只有一张浅色纸面版天空封面;正文从第二页开始 | |
| 20 | 桌面 Chrome | 打开部署**之前**生成的旧报告 | 没有封面,没有空白占位 | |
| 21 | 任一 | 新生成一份报告 → 设置里改自己的出生时间(或出生地)→ 回来打开那份报告 | 没有封面;改完后再新生成的报告有封面 | |
| 22 | 桌面 Chrome | 打开有封面的报告,DevTools → Network 看 `/api/reports/<id>` 的响应 | 响应里只有 `coverSubject`(`"self"` 或人物 id),没有 `birthFingerprint`、没有出生日期 / 时刻 / 经纬度 / 地名 | |
| 23 | 桌面 Chrome | 打开有封面的报告前,在 Request blocking 加一条 `*api/birth-sky*` | 报告正文照常显示,没有封面,也没有报错 | |
## 首次建盘揭幕