DeepSeek Harness Web 界面渲染异常:折叠吞内容、整屏空白、着色与公式、路径转义
DeepSeek Harness(DSH)的 Web 界面有一类故障很特别:它不报错、不崩溃,只是内容不对**——你说过的话不见了、整屏突然空白、页面卡死、颜色不对、金额变成公式、图片预览 404。** 本批讨论里这一族有九条,可以按「藏内容 → 空白 → 着色与公式 → 路径转义」四段来理:整轮折叠把工具调用前的正文与最终结论一起藏起来(折叠判定漏了「回答部分」这一维);滚动折叠让整个视口变空白(折叠时滚动位置没动、高度一次性预留在底部,0.2.1-alpha.3 已修);槽位错误边界把插件渲染异常变成一块无提示的空白(且图标改名让第三方更容易踩中);着色侧有 Go 语法的指数回溯(同步正则引擎会把主线程卡死)和 diff 主题缺变量(增删行同色);公式侧单个美元符号吞掉金额、多行公式块吞掉后续正文;路径侧Windows 反斜杠被 Markdown 转义吃掉,导致生成图片的预览 404(#9616、#9341、#9684、#9080、#9267、#9480、#9184、#9619、#8806)。
DSH插件 折叠把内容藏了:正文与最终结论被当成「过程材料」
一句话结论:折叠判定只看「是不是过程成员」,忘了把「回答部分」排除在外,于是工具调用前的正文和最终结论会跟着过程一起被收起——而切换视图模式、点开折叠控件都能立刻验证这一点。 两处症状分属同一条判定(#9616、#9341)。
DSH插件 判据:用「展开就看得到」验证
- 工具调用前的正文被吞:已完成回合里,模型在调用工具前说的那段话默认不可见,点开折叠控件才有(#9616)。
- 最终结论被折进思考区:流式输出完成后,最终回答被收进「思考/过程」区,用户容易误以为本轮没回答(#9341)。
- 共同判据:切到不折叠的视图(详细/逐条)后内容全部可见 → 说明是折叠判定问题,而不是内容没生成(#9616)。
DSH插件 两处的机制差异
| 症状 | 机制 | 来源 |
|---|---|---|
| 工具调用前的正文被吞 | 切分阶段已把它识别成回答部分,但折叠侧仍视其为过程材料;唯一豁免只给最终回答那一步 | #9616 |
| 最终结论被折进思考区 | 「是否隐藏过程」只取一个维度,没有把「回答内容」排除;流式场景下节点起始序号必然小于最终消息序号,于是回答恒被判为过程成员 | #9341 |
DSH插件 三条处置
- 用户侧规避(立即可用):切到不折叠的视图模式,或点开「已完成,用时 N 秒」那个折叠控件(#9341)。
- 修法方向一(正文那条):在折叠判定里补一条「回答部分不参与折叠」,覆盖工具调用前的正文(#9616)。
- 修法方向二(结论那条):让「过程成员」与「回答内容」两个判定互斥,并补一条「首片段序号小于最终事件序号」的回归用例——因为这个组合在测试里没被覆盖(#9341)。
- 验证:改完后重跑一个「先说话 → 调工具 → 再给结论」的回合,预期默认视图中三段内容都不丢(#9616)。
DSH插件 整屏空白:滚动折叠与槽位错误边界
一句话结论:这一组的「整屏空白」都不是数据丢失——一种来自滚动折叠路径(数据在、底栏计数正常、刷新即恢复),另一种来自槽位错误边界只渲染空容器(插件渲染抛错就整块空白)。 两者都能从「数据到底在不在」入手区分。
DSH插件 滚动折叠让整个视口空白(0.2.1-alpha.3 已修)
一句话结论:走通用折叠路径时滚动位置没有随内容移动、而被收起的高度一次性预留在底部;当被折叠区域正好在读者上方时,正文就被顶出视口——看起来像「整屏空白」,但数据其实都在(底栏计数正常),刷新即恢复。 触发条件比想象的窄(#9684):
- 判据:整屏空白 + 底栏计数正常 + 刷新后恢复;与换模型无关(#9684)。
- 易触发场景(讨论中列出四类):本机发送无回显(在另一个标签页发送)、右侧栏子会话、排队消息、以及父消息唤醒多个子回合后的人类发送(#9684)。
- 处置:升级到 0.2.1-alpha.3 即修复(社区核对四条修复提交只在 alpha.3 及以后包含,并附了覆盖四类场景的端到端用例);若不升级,规避是刷新页面或关掉「下一条消息时收起」这类设置(#9684)。
DSH插件 设置页整块空白:错误边界只渲染空容器
一句话结论:SlotErrorBoundary 命中后只渲染一个空的容器,所以插件渲染异常会变成「整块空白且无任何提示」;而插件图标在某个版本里改了名(去掉尺寸后缀),第三方写死旧名取到未定义、直接触发渲染错误——于是缺陷被放大成「插件的设置页全白」。(#9080)
DSH插件 着色与公式:卡死、没颜色、吞正文
一句话结论:这一组「内容不对」都出在渲染的着色与公式层——Go 语法指数回溯把主线程卡死、diff 主题缺变量导致增删行同色、单个美元符号把金额当公式、多行公式块把后续正文一起吞掉。 判据都能用「换语言标签 / 换解析选项 / 换写法」快速验证。
DSH插件 Go 代码块导致滚动卡死(灾难性回溯)
一句话结论:Go 语法的着色规则里存在 ((X?)Y?)+ 这类指数回溯的表达式,而客户端走的是同步正则引擎**(不是 WASM 版),在 V8 上会回溯到卡住主线程——触发条件很具体,所以「有的 Go 块卡、有的不卡」。** 症状是滚动时页面卡死、反复提示无响应(#9267)。 这里要区分两类「卡」:本条这种与代码块语言或内容相关的「渲染卡死」,和与连接反复重建、主线程常驻高占用相关的「性能卡顿」是两回事,后者可对照 DeepSeek Harness dsh web 性能排查:每 12 秒断连重连与主线程常驻 1 核。
- 判据:卡死与「滚动到某个代码块」强相关;关掉语法着色(见下)即恢复(#9267)。
- 触发条件(讨论中修正过):需要该行位于
struct {体内、有缩进、且行内没有},同时含特定模式;量级参考是 n=10 时约 70 秒(#9267)。 - 规避(最简单):把代码块的语言标签从
go改成别的标识(或留空),让着色器退回纯文本,不再加载 Go 语法(#9267)。 - 长期方向:把语法里的量词改成有界形式,或对语法包打补丁(讨论中提到可用依赖补丁机制)(#9267)。
DSH插件 diff 代码块没有颜色
一句话结论:主题只定义了常用的一批 token 变量,缺少带增删语义的那三个变量(增/删/变更);变量解析为空就回落到前景色,于是增删行看起来同色。 这也解释了它为什么长期没被发现——只有带增删语义的语法才会发出这三个变量(#9480)。
- 判据:其他语言着色正常,只有
diff/patch代码块无色(#9480)。 - 修法:在根选择器与暗色块里各补上这三个变量,并注意明暗两套梯度(#9480)。
- 排查顺序:先排除「没渲染 Markdown」「着色管线不认 diff」,再定位到主题变量(#9480)。
DSH插件 单个 $ 吞掉金额
一句话结论:分段数学解析默认把单个美元符号也当作行内公式分隔符(singleDollarTextMath 默认为真),而货币写法恰好是合法数学语法,于是金额之间的文字被当公式排版——出错时也不会触发兜底,因为它是合法表达式。(#9184)
- 判据:正文出现类似
$3,641 … $200/mo的内容时,中间文字被排成公式(#9184)。 - 修法(三种,任选):注册数学扩展时显式关闭「单美元符号数学」;或改用其他公式分隔符约定;或在写作侧用转义/行内代码包住金额(#9184)。
- 兜底:报告者提供了客户端可读性插件作为兜底(#9184)。
- 回归用例:补一条含货币符号的正文用例,避免以后改回默认(#9184)。
DSH插件 多行 $$ 公式块吞掉后续正文
一句话结论:解析扩展的注册顺序让上游数学扩展优先于本包的兼容层,而兼容层的同类规则是单行模式;再加上上游把开首行存进节点元数据、渲染端只读节点正文,且行尾的 $$ 不算闭合——于是开首行内容丢失、后续正文/表格被一路吞进公式节点,最后以红色错误原文打印。(#9619)
- 判据:多行
$$a=b⏎c=d$$这种写法下,开首行内容消失、后面若干段落变成红色数学源码(#9619)。 - 规避(立刻可用):让
$$独占一行,或改用\[ … \]写法(#9619)。 - 修法:两处须同时改——调整扩展注册顺序 + 把同类规则改多行模式;讨论中指出该形态在现有回归断言里没有覆盖,建议先补失败用例再改(#9619)。
DSH插件 路径被 Markdown 转义吃掉:生成图片预览 404
一句话结论:Agent 用未转义的 Windows 反斜杠原生路径引用附件时,Markdown 会把 \. 当成转义吃掉一级路径分隔符**——注意尖括号并不能阻止反斜杠转义——路径因此损坏,预览请求 404。** 判据是「换成正斜杠或百分号编码立刻 200」(#8806)。
- 确认判据:同一张图,用反斜杠路径引用时 404、用正斜杠或编码后 200;服务端与鉴权均正常(讨论中做过桌面壳链路对照)(#8806)。
- 规避一:引用附件时改用正斜杠路径(#8806)。
- 规避二:用回环静态服务预览(讨论中提到用一行命令起一个本地静态服务即可绕开该链路)(#8806)。
- 长期方向:不要让模型手写路径,而用具结构化标识(如附件 id)由宿主解析渲染——信息在写入侧就已经丢了,后端正则修不回来(#8806)。
DSH插件 排查注意事项
这一族全部是「渲染层」问题,所以第一条纪律是:先确认数据在不在(底栏计数、轨迹视图、不折叠视图),再判定是渲染问题。 九条要点:
- 「切视图/展开就可见」= 折叠判定问题,不是内容丢失(#9616)。
- 整屏空白先刷新再判断:数据在、计数正常,就是滚动折叠那条(#9684)。
- 整屏空白那条已经修了:升到 0.2.1-alpha.3 即可(#9684)。
- 设置页空白先看控制台:有
slot entry crashed才往错误边界那条想(#9080)。 - 卡死与代码块语言相关:换掉语言标签是最快的验证手段(#9267)。
- 「只有 diff 没颜色」是主题变量缺口,不是渲染管线坏了(#9480)。
- 金额被当公式别怀疑内容:这是解析器默认值问题(#9184)。
$$独占一行能规避多行公式那条,记住它比记住原因更实用(#9619)。- 修复状态如实:滚动折叠那条已在 0.2.1-alpha.3 修复;其余八条在讨论所指版本里都未修(或只有社区插件兜底),且都属客户端/核心侧改动,用户侧只能靠「换视图、刷新、改标签、独占行、换斜杠」这类规避。
界面出问题时,很容易先怀疑插件把渲染搞坏了——尤其设置页整块空白那种。若想把插件这一层先排掉,与其在各处手敲命令,不如用 DSH Plugin Hub 这类可视化插件市场:已安装列表、装卸历史与系统日志集中在一个面板里,先确认「装了哪些、最近动过哪些」。

来源:Discussion #9616、Discussion #9341、Discussion #9684、Discussion #9080、Discussion #9267、Discussion #9480、Discussion #9184、Discussion #9619、Discussion #8806。
常见问题
DeepSeek Harness 里开场白被折叠吞掉,是因为折叠侧没有把「工具调用前的正文」排除在过程材料之外。切分阶段已经把这段正文识别成回答部分,但折叠判定仍然把它当成过程内容,于是它随整轮一起被收起,而这个判定只给最终回答那一步留了豁免。规避是切到不折叠的详细/逐条视图;修法是在折叠判定里补上「回答部分不参与折叠」这个条件。
DeepSeek Harness 把最终结论折进思考区,是因为判断「是否属于过程材料」时只取了一个维度,没有把「回答内容」排除,而流式场景下节点起始序号必然小于最终消息序号,于是回答被一并隐藏。规避是点开「已完成,用时 N 秒」那个控件;修法是让两个判定互斥,并补一条「首片段序号小于最终事件序号」的回归用例。
DeepSeek Harness 里整屏空白是滚动折叠路径的缺陷:走通用折叠时滚动位置没有随内容移动,而被收起的高度被一次性预留在底部,当被折叠区域在读者上方时,正文就被顶出了视口,看起来整屏空白。它在 0.2.1-alpha.3 已修(多条修复提交只在 alpha.3 及以后包含),如果还在旧版本上,规避是刷新页面或关闭「下一条消息时收起」这类设置。
DeepSeek Harness 里页面卡死,是因为 Go 语法的着色规则里存在指数级回溯的表达式,而客户端走的是同步正则引擎(没有使用 WASM 版引擎),在 V8 上就会回溯。触发条件比较具体:需要缩进、位于结构体花括号内、且行内没有闭合花括号。规避是把代码块的语言标签从 go 改成别的标识,让着色器退回纯文本;长期方向是把量词改成有界形式,或对语法包打补丁。
DeepSeek Harness 里金额被当成公式,是因为分段数学解析默认把单个美元符号也当作公式分隔符,而货币写法恰好是合法的数学语法,所以金额之间的文字会被当成公式内容。规避是让解析器关闭「单美元符号数学」选项,或在写作时用转义/代码块包住金额;报告者还提供了客户端侧的兜底插件。
相关术语
- 整轮折叠(turn fold)
- 整轮折叠是 DeepSeek Harness 客户端把一次已完成回合里的过程材料收起的展示机制,折叠判定按「是否属于过程成员」来决定哪些内容被收起。判定漏掉回答部分时,正文会随过程一起被隐藏。— https://github.com/deepseek-ai/deepseek-harness/discussions/9616
- SlotErrorBoundary
- SlotErrorBoundary 是 DeepSeek Harness 客户端里包住插槽贡献内容的错误边界,用于在某个插件渲染抛错时隔离故障。它当前在命中后只渲染一个空的容器,因此故障会表现为「整块区域空白且无提示」。— https://github.com/deepseek-ai/deepseek-harness/discussions/9080
- 灾难性回溯
- 灾难性回溯是正则引擎在存在嵌套量词的表达式上尝试指数级组合导致耗时爆炸的现象。它在同步正则引擎上会直接阻塞主线程,因此表现为页面卡死而不是报错。— https://github.com/deepseek-ai/deepseek-harness/discussions/9267
- 单美元符号数学
- 单美元符号数学是数学扩展的一项默认开启的行为:把单个美元符号也视作行内公式的分隔符。它会让包含货币金额的正文被误判为公式,需要显式关闭才能避免。— https://github.com/deepseek-ai/deepseek-harness/discussions/9184
来源
- #9616 — 已完成轮次的过程折叠会吞掉「工具调用前的正文」· deepseek-ai(GitHub Discussions)
- #9341 — 流式回合完成后最终结论被错误折叠到思考区域· deepseek-ai(GitHub Discussions)
- #9684 — 0.2.1-alpha.2 会话突然整屏空白,需刷新页面恢复(滚动折叠缺陷)· deepseek-ai(GitHub Discussions)
- #9080 — 第三方插件设置页渲染抛错时整页空白:SlotErrorBoundary 只渲染空 div· deepseek-ai(GitHub Discussions)
- #9267 — dsh web 打开含 Go 代码块的会话滚动时因 Shiki Go 语法灾难性回溯正则卡死· deepseek-ai(GitHub Discussions)
- #9480 — ```diff 代码块没有颜色区分· deepseek-ai(GitHub Discussions)
- #9184 — 单个美元符号的分段数学解析吞掉正文里的金额· deepseek-ai(GitHub Discussions)
- #9619 — 多行 $$ 公式块丢失开首行内容,并把后续正文一路吞成数学源码· deepseek-ai(GitHub Discussions)
- #8806 — Windows generated-image preview fails when Markdown escapes the attachment path· deepseek-ai(GitHub Discussions)