feat(reports): generate personal reports by section
Independent Staging Quality Gate / validate (push) Has been cancelled
Independent Staging Quality Gate / publish (push) Has been cancelled

This commit is contained in:
Jesse_Chen
2026-08-30 22:59:17 +08:00
parent 1d1c1d3d24
commit 0ae3e2d796
17 changed files with 1173 additions and 111 deletions
+16
View File
@@ -6910,3 +6910,19 @@
- 相关记录:BUG-405、BUG-407、BUG-432、BUG-440、BUG-441、BUG-442、BUG-449
- 复发自:BUG-432(出题层/决策层/可见承载再次分裂)、BUG-440(覆盖不足状态再次空转)、BUG-441/BUG-449(口述焦点可见性与服务端兜底边界未覆盖本路径)
- 修复版本:`fix(rectification): prevent collect focus dead-end after choice answers`Skill 保持 `10.0.13`
## BUG-451 | 个人报告整份调用失败掩盖单章失败与截断边界
- 状态:mitigated
- 首次发现:2026-08-30
- 最近更新:2026-08-30
- 影响面:个人报告 worker、`createPersonalReportAgent``/reports/[reportId]``personal_report_jobs`
- 用户现象:一次模型输出承载整份报告;任一主题写坏或最终 JSON 解析失败,整份报告显示 `report_schema_invalid`,用户看不到已成功生成的主题。生成日志也无法区分模型停止、输出截断和校验失败。
- 触发条件:完整报告包含多个 write 主题,单次 writer 输出超过 provider 默认预算或任一主题未通过绑定/最终 schema 校验。
- 根因:报告 writer 只做整份报告的一次结构化调用加一次修复重试,没有章节级持久化、重试预算或 `finishReason`/token telemetry`report_document` 也没有可安全表达半成品的中间语义。
- 修复:先上线并采集 `finishReason``inputTokens``outputTokens`;随后改为串行 plan → section → summary → assemble。每章按 `evidenceRefs` 过滤 bundle 并独立落库/重试,耗尽后生成明确 blocked disclosure;摘要最后只接收章节标题与 `claimStatus`;仅最终 assemble 写 `report_document`,并把 job progress phase/percent 返给等待页。
- 验证:任务 0 真实 staging 观测为 1 次报告失败、`finishReason=length` 占比 0%、`outputTokens` p50/p95 为 3069/3069,失败归因为 report-level parse 而非截断;分章节单元测试、续做/blocked 测试、真实 Docker 数据库 RLS/权限测试均通过;TypeScript、ESLint0 error)通过。
- 防复发:模型调用必须记录 allowlist 指标字段且不得记录 prompt、模型原文或用户资料;章节中间结果只能写 `personal_report_sections`;章节生成保持串行;摘要不得接收正文全文;blocked 章节必须显式渲染,不能静默丢失;最终成品仍须通过服务端 canonical parse。
- 相关记录:BUG-352
- 复发自:无
- 修复版本:待 staging 部署;本地提交待生成