Files
ycode/docs/协作/B04-需求.md
T

52 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# B04:展开历史详情时图片地址闪现
日期:2026-10-21。状态:待开发。任务:YC-008,优先级 P1。
## 用户现象与定位
用户反馈 `hello`、`使用浏览器打开baidu.com,输入框中输入t…` 的详情似乎打不开,进一步明确为:展开时有大片文字一闪而过。
调查代码:`0fbc1616e5b6f262e75df5c7411562d3a5031096`。两条会话的保存数据可解析,正文可加载;隔离 Electron 使用当前 dev renderer,展开过程中没有捕获 renderer 异常。该结果是定向诊断,不是独立安装构建验收。
已确认根因在 `src/renderer/src/workbuddy/images/MarkdownImage.tsx`:
1. 第 32 行 `resolvedUrl` 首次渲染为 undefined。
2. 安全图片 URL 也要等第 35 行的 effect 才设置 resolvedUrl。
3. 第 62–69 行在此期间进入 fallback,空 alt 时显示 `src`。
4. 对浏览器截图,src 是完整的 data URI/Base64,于是首帧将其显示为大量文本,随后才换成图片。
5. `CompletedFold.tsx:192` 的展开分支会切换详情树,重新挂载图片,使该现象在展开时再次触发;不能仅检查首次打开会话。
## 已采集的帧证据
百度会话一次实际展开,requestAnimationFrame 采样:
| 时间 | 外层详情高度 | 图片 Markdown 块高度 | 块内文本字符数 | 图片节点 |
| --- | ---: | ---: | ---: | --- |
| 点击前 | 0px | 不适用 | 不适用 | 原树图片已就绪 |
| 点击后约 28ms | 5704px | 5468px | 18076 | 重挂载处尚无图片节点 |
| 点击后约 43ms | 636px | 400px | 1 | 图片就绪 |
另一轮采样同样出现 5704px → 636px。文字长度与约 18075 字符的截图 data URI 对应;未将真实会话内容、图片、用户配置或完整 URL 写入交接文件。
本机原始诊断产物保留在 dev 工作树 `.tmp/session-detail-review/`,其中 `native-SZ8eKi/report.json` 为上述帧数据,`native-vsZP6s/report.json` 为另一轮采样。表格和代码定位为可移交的脱敏证据;本机临时路径不是开发端唯一复现依据。
## 开发要求
- 安全且不需要宿主解析的图片地址,在第一次渲染即可使用;避免先进入地址文本占位再在 effect 中切换。
- 异步解析中的图片使用稳定、简短的占位状态。空 alt 的 data/blob 等地址不得将完整 URI 显示为文字。
- 失败态也不得显示完整 Base64。可以使用 alt 或简短的图片加载失败提示。
- src 改变时不能继续展示上一个 src 的图片;保留异步请求取消、过期结果隔离和已有 URL 安全校验。
- 详情展开导致的重挂载必须覆盖回归;是否进一步稳定详情 DOM 由开发端评估,但不能以更换折叠动画掩盖图片首帧问题。
- 不修改、清理或迁移用户历史消息来绕过问题。
## 验收标准
1. 使用合成的长 Base64 图片、空 alt,冷挂载首帧到稳定态均不显示 URI 文本。
2. 在已完成回复中放置图片,连续展开/收起、切换会话后再展开均无大片文字闪现。
3. 采集展开前后连续帧,图片区域不因完整地址占位瞬间增高数千像素;不能只提交动画结束截图。
4. 图片加载失败、宿主解析失败、无效地址均显示简短且稳定的失败态。
5. 快速切换 src、展开/收起时无旧图串入、过期请求覆盖或 renderer 异常。
6. 图片预览、下载、URL 安全策略和正常 Markdown 图片功能保持可用。
验收端本轮只读产品代码,未修改产品源码和正式用户数据,未重启用户窗口。本需求按用户授权提交至 Gitea 协作主线;开发端按 YC-008 实现后提交交付记录,由验收端复测连续帧。