# 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 实现后提交交付记录,由验收端复测连续帧。