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
+11 -10
View File
@@ -1,17 +1,18 @@
# BLOCKED
## TASK-birth-sky-cover T5:报告封面没有可靠的出生资料绑定(2026-09-28)
## ~~TASK-birth-sky-cover T5:报告封面没有可靠的出生资料绑定(2026-09-28)~~ → 已解除:产品 2026-09-28 选 A
- 任务书要求「只有报告生成时的出生资料与现在一致时才显示封面」。逐项查过,报告侧**没有任何出生资料指纹**:
- `personal_reports` 表列(`20260806010000_personal_reports.sql` 及其后 `add column`):`chart_profile_id`、`request_fingerprint`、`calculation_hash`、`evidence_hash` 等,没有出生资料快照或 `profileFingerprint`。
- `request_fingerprint` 只哈希 `reportType / presentationMode / depth / themes / sessionId / chartProfileId`(`personal-report-route-core.ts` `computeRequestFingerprint`),不含出生资料。
- `calculation_hash`:普通报告取引擎 `result_hash`(含计算结果,不是出生资料指纹,且 BUG-693/694 记过哈希含墙钟);长报告取 markdown 全文的 sha256(`personal-report-longform-cover.ts`)。两者都不能和当前 `profileFingerprint` 比。
- 报告文档 `subject` 只有 `displayName / birthTimeStatus / birthPlaceLabel`;`personal_report_jobs`、`personal_report_sections`、`personal_report_longform_appendices` 也没有出生资料。
- 仓库里 `result_binding` 只出现在 Python 的 `calculation_profile_contract.py` / `full_report_quality_gate.py`,不进报告行。
- 按任务书:本单**不显示**报告封面,不拿当前资料冒充当时资料;`reportView` 未改、报告页未改、打印样式未改,旧报告不补算不补写库。
- 解除需要一个产品决定(二选一,都不改表结构):① 生成报告时把当时的 `profileFingerprint`(`resolveServerOwnedChartBirth(...).fingerprint`)写进报告文档(如 `subject.birthFingerprint`,v2 schema 加可选字段),只对新报告生效,旧报告永远无封面;② 接受「当前资料」作为封面依据并在封面上说明——与任务书红线冲突,需产品推翻。
- `draw.ts` 的 `paper` palette 已实现并有单测(打印用),解除后报告封面可直接复用。
- ~~任务书要求「只有报告生成时的出生资料与现在一致时才显示封面」。逐项查过,报告侧**没有任何出生资料指纹**:~~
- ~~`personal_reports` 表列(`20260806010000_personal_reports.sql` 及其后 `add column`):`chart_profile_id`、`request_fingerprint`、`calculation_hash`、`evidence_hash` 等,没有出生资料快照或 `profileFingerprint`。~~
- ~~`request_fingerprint` 只哈希 `reportType / presentationMode / depth / themes / sessionId / chartProfileId`(`personal-report-route-core.ts` `computeRequestFingerprint`),不含出生资料。~~
- ~~`calculation_hash`:普通报告取引擎 `result_hash`(含计算结果,不是出生资料指纹,且 BUG-693/694 记过哈希含墙钟);长报告取 markdown 全文的 sha256(`personal-report-longform-cover.ts`)。两者都不能和当前 `profileFingerprint` 比。~~
- ~~报告文档 `subject` 只有 `displayName / birthTimeStatus / birthPlaceLabel`;`personal_report_jobs`、`personal_report_sections`、`personal_report_longform_appendices` 也没有出生资料。~~
- ~~仓库里 `result_binding` 只出现在 Python 的 `calculation_profile_contract.py` / `full_report_quality_gate.py`,不进报告行。~~
- ~~按任务书:本单**不显示**报告封面,不拿当前资料冒充当时资料;`reportView` 未改、报告页未改、打印样式未改,旧报告不补算不补写库。~~
- ~~解除需要一个产品决定(二选一,都不改表结构):① 生成报告时把当时的 `profileFingerprint`(`resolveServerOwnedChartBirth(...).fingerprint`)写进报告文档(如 `subject.birthFingerprint`,v2 schema 加可选字段),只对新报告生效,旧报告永远无封面;② 接受「当前资料」作为封面依据并在封面上说明——与任务书红线冲突,需产品推翻。~~
- ~~`draw.ts` 的 `paper` palette 已实现并有单测(打印用),解除后报告封面可直接复用。~~
- 同单其余环境缺口:无登录态与真机(星盘页按钮、保存 / 分享、首次揭幕按 `docs/testing/birth-sky-cover-checklist.md` 走);无 Docker(24 条 DB / 部署套件失败与基线逐条同名)。未推送、未部署。
- **已解除(2026-09-28,TASK-birth-sky-followup-20260928 F1–F3)**:产品选方案 A。新生成的报告在 `subject.birthFingerprint` 写入生成时的出生资料指纹(与星盘页 `profileFingerprint` 同一算法、同取存储行);`GET /api/reports/:id` 在服务端比对当前指纹,只下发 `coverSubject`(人物 id 或 null),不下发指纹与出生资料。旧报告没有该字段,永远不显示封面,不补算不回填;不改表结构。
## TASK-site-button-contrast(BUG-1079):真机、登录态与两条待决发现(2026-09-28)