fix(web): diagnose personal-report schema failures and ISO list timestamps

Keep report_schema_invalid for the user, but record the inner check, retry plan bind once, and format self-hosted timestamptz so the report list no longer shows 时间未知.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-22 20:46:30 +08:00
parent 4b3d82d987
commit 9762063453
13 changed files with 341 additions and 72 deletions
+16
View File
@@ -5323,3 +5323,19 @@
- 复发自:BUG-348(收集后再区分;区分问句被方法轮询和出牌 defer 排到采用之后)
- 修复版本:9873ba42
## BUG-352 | 个人报告失败被压成 report_schema_invalid,列表把 Date 显示成时间未知
- 状态:resolved
- 首次发现:2026-08-22
- 最近更新:2026-08-22
- 影响面:个人报告中心 `/reports``GET /api/reports``generatePersonalReport`、自托管 `timestamptz` 投影、报告 writer 绑定
- 用户现象:生成完整报告后记录为「未完成」,右侧只显示 `report_schema_invalid`;卡片时间显示「时间未知」。出生时钟在创建时是可用的,失败发生在后台生成之后。
- 触发条件:自托管 PostgreSQL 上创建个人完整报告;writer 输出与 section plan 不完全一致,或生成中被中止;列表读取 `created_at`
- 根因:`generatePersonalReport` 把 writer JSON、plan 绑定、组装、终态 parse 和 abort 全部吞成同一个 `report_schema_invalid`,且不记录内层 token。evidenceRefs 还要求顺序全等。自托管 `queryValue()` 只把 `date` 收成字符串,`timestamptz` 仍是 `Date`,列表投影只接受 string,UI 便显示「时间未知」。
- 修复:schema 失败返回 allowlist `innerReason` 并打无 PII 日志;abort 向上抛出,不再伪装成 schema 失败。plan 绑定失败走现有那一次 repairevidenceRefs 改为集合相等。`queryValue``timestamptz`/`timestamp` 收成 ISO,列表投影同时接受 `Date`
- 验证:`frontend/tests/personal-report-generation-v2.test.ts``frontend/tests/personal-report-generation.test.ts``frontend/tests/personal-report-api.test.ts``frontend/tests/local-postgres-query-value.test.ts``frontend/tests/personal-report-worker.test.ts`
- 防复发:用户可见码可以仍是 `report_schema_invalid`,但生成结果和日志必须带 allowlist 内层 token。lease abort 不得再断言成 schema 失败。列表时间必须能从 `Date` 或 ISO 字符串格式化。不得把模型原文、出生资料或路径写进失败日志。
- 相关记录:BUG-154、BUG-188、BUG-217
- 复发自:无
- 修复版本:待提交