fix(report): project ordinary reports onto public prose only

This commit is contained in:
jesse-ux
2026-09-22 12:13:53 +08:00
parent 337d820076
commit dd4141a030
17 changed files with 1401 additions and 48 deletions
+16
View File
@@ -13231,3 +13231,19 @@
- 相关记录:BUG-936
- 复发自:无
- 修复版本:未发布(本分支未推送)
## BUG-999 | 普通报告导出仍带出内部技法与工作流字段
- 状态:resolved(本地候选,未部署)
- 首次发现:2026-09-22
- 最近更新:2026-09-22
- 影响面:咨询 Markdown 导出、个人报告阅读、普通 Markdown 下载、`GET /api/reports/:id` 与报告列表摘要。聊天消息行不在本次回归里。
- 用户现象:聊天里已经不显示内部证据徽章,但导出的报告和已存 Markdown 仍可能出现 `technique_truth`、`workflow_route`、`workflow_status`、`precise_timing`、`missing_layers`,以及评分、内部地址、密钥样式字段、模型调试和 job/attempt/provider 元数据。
- 触发条件:从咨询会话复制或导出报告;打开或下载一份已经写好的个人长报告,包括命中旧缓存 Markdown 的情况。
- 根因:聊天层按 BUG-011 隐藏了这些字段,报告阅读、导出和 API 没有同一套普通用户 allowlist。普通下载还把 `/professional-reference` 当成正文来源。可见性不能靠接口名字判断。
- 修复:新增 `frontend/src/lib/report-public-projection.ts`。文档类型显式区分聊天导出、个人报告详情、普通 Markdown 下载和专业参考。普通输出只保留正文、结论、行动建议、自然语言限制、图盘围栏和安全的引擎 SVG。内部限制改写成白话,不写出内部键。阅读 API、详情分类、普通下载和列表摘要都走这层投影。专业参考响应标明 `documentKind: professional_reference`;本轮没有单独专业权限,所以它的正文同样 fail-safe 到普通投影。普通下载改为读 `GET /api/reports/:id`,不再请求专业参考。
- 验证:`frontend/tests/report-public-projection.test.ts` 覆盖字段在与不在、旧缓存、专业参考种类、图盘围栏、HTML/script/iframe/object/embed/img、危险 URL,以及普通输出不含内部 URL、密钥和模型字段。`consultation-report-export`、`personal-report-longform-md`、报告归属与 ready 检查的测试名保留。`tsc --noEmit` 通过,`npm run lint` 0 error。没有登录态,浏览器导出未验收,见 `docs/testing/report-public-content-20260922.md`。
- 防复发:普通报告的公开字段以 allowlist 为准,不能只靠删除若干字符串。缓存命中和已存 Markdown 必须再过投影。专业参考不得再被普通下载当作 fallback。不得放宽 Markdown 的 XSS、危险 URL、HTML 和 `jyotish-chart` 围栏合同。
- 相关记录:BUG-011、BUG-058、BUG-188
- 复发自:无
- 修复版本:本分支 `fix(report): project ordinary reports onto public prose only`(未推送,未部署)