DeepSeek Harness Markdown 渲染三类问题:按版本判定波浪线与反斜杠
「16~18 度」被渲染成「16 加一条划掉的 18」,Windows 路径链接点开却说文件不存在——这两个症状一个在行内文本,一个在链接目标,但都属于 Markdown 解析层的边界处理。 关键是它们修复的版本不同:一个 rc.3 就有了,一个要等 0.2.2-alpha.x(#10894、#11378)。
DeepSeek Harness 第一步:先报版本,再谈现象
同类渲染问题在不同版本上的结论完全相反,先确认版本能省掉一半排查。
- 打开「关于」或安装目录里的
package.json,记下完整版本号。 - rc.2 及更早:单波浪线被当删除线是当时代码的正常行为。
- rc.3:已加入
singleTilde: false,单个~应保持字面量。 - rc.3 / rc.4:Windows 路径链接仍会打开错误路径,这个修复只在 master 与 0.2.2-alpha.2。
- 版本对不上时,别急着说「修了也没用」,先确认你看到的到底是哪一类。
DSH插件 类型一:单个 ~ 被当成删除线
解析器现在显式关闭了单波浪线删除线,两个入口都传了同一个选项。
- 复现文本:
今天气温 16~18 度,我再游 1~3 圈。 - 现象:
16之后的18被加上删除线,1之后的3同理。 - 看修复位置:
ui-primitives的 Markdown 解析文件里定义了gfmOptions = { singleTilde: false }。 - 两个入口都传了这个对象:普通解析入口与带数学公式的解析入口。
- 注释里写的理由就是数字区间场景。
- 对照:在 rc.2 的同一文件里搜
singleTilde,一处都没有——说明这是 rc.3 才加的。
如果你在 rc.3 上仍能看到删除线,方向要换:检查是否有插件自己渲染消息体,或前端 bundle 还是旧缓存。
DeepSeek Harness 类型二:反斜杠路径被当成转义
CommonMark 会把 \_ 解释成 _,而 Windows 路径里的反斜杠正好踩在这个规则上。
- Agent 写入
G:\AI\_dsh_tools\_issue-body.md。 - 回复里出现链接:
[\_issue-body.md](G:\AI\_dsh_tools\_issue-body.md)。 - 解析后目标变成
G:\AI_dsh_tools_issue-body.md——\_的反斜杠被吃掉了。 - 客户端随后把
\换成/并拼路径,得到G:/AI/_dsh_tools_issue-body.md。 - 侧边栏打开这个不存在的路径,显示「文件不存在,可能已被移动或删除」。
- 对照实验:
Test-Path原路径为 True,被改写后的路径为 False。
DeepSeek插件 类型三:同一个文件的卡片却能打开
工具结果卡片用的是结构化路径,不走 Markdown 文本,所以它不受转义影响。
- 卡片读取的是工具调用里的
meta.path,是绝对路径,且做过绝对路径判断。 - 行内链接读取的是作者写的 Markdown 文本,要经过 CommonMark 转义。
- 于是同一文件出现「卡片能开、链接不能开」的割裂现象。
- 这也是最好的判别方法:如果你能用卡片打开、点链接不行,就是这一类。
- 社区另一条报告描述的是同一规则在别处的表现:链接解析只做
decodeURIComponent,不会还原被转义的反斜杠。
DeepSeek Harness 版本矩阵与今天的写法
两类问题的修复版本不同,写法规避与等待升级要分开安排。
| 问题 | 修复位置 | rc.3 | rc.4 | 0.2.2-alpha.x |
|---|---|---|---|---|
单 ~ 变删除线 | 解析器 singleTilde: false | 已修 | 已修 | 已修 |
| 反斜杠路径被吃 | c262a09fd0b | 未修 | 未修 | 已修 |
在修复到达之前,可以这样写:
- 路径用正斜杠:
G:/AI/_dsh_tools/_issue-body.md。 - 或者加
file://前缀,让目标被识别为地址而不是普通文本。 - 行内代码包住路径不会被转义,但那只保证显示正确,不一定可点击。
- 数字区间如果必须显示,可以用行内代码或反斜杠转义单个
~(在未修的版本上)。 - 报问题时附上原文与版本,避免被当成「新问题」重复排查。
DSH插件 三步自查:别把两类混成一类
看对象、看版本、看对照,三步就能定性。
- 看对象:问题是行内文本被加样式,还是链接目标被改写。前者是解析选项,后者是转义规则。
- 看版本:先确认 rc.2 / rc.3 / rc.4 / alpha 线,再对上面的矩阵。
- 看对照:同一个路径,工具结果卡片能否打开。能开说明结构化路径没问题,问题在手写链接。
- 三步都对上了,再决定是等升级还是改写法。
注意事项
- 别把渲染问题当成文件丢失。先核对路径是否被改写。
- 别只升级到 rc.4 就期待两类都好。反斜杠修复不在 rc 线。
- 别忽略插件的影响。第二个 Markdown 实例会让「已修」的问题继续出现。
- 记录原文。渲染问题最有力的证据是输入与输出的逐字对照。
- 优先用结构化路径。能用工具结果卡片打开时,别依赖手写链接。
如果你的问题是「代码块里的 ~ 也被处理」,那不属于这两类,因为代码块不走同一套解析路径。相关排查见 DeepSeek Harness 会话显示异常:标题不生成、只跑命令显示空白与删缓存丢会话。
常见问题
不正常,但取决于 DeepSeek Harness 的版本。rc.3 已在解析器里加入 singleTilde: false,单个 ~ 保持字面量;rc.2 及更早没有这个选项,所以那时看到删除线符合当时代码。
那说明 DeepSeek Harness 的渲染链上还有另一个 Markdown 实例,比如某个插件自己渲染消息体,或者前端 bundle 还是旧缓存。把出问题那条消息原文与版本一起提供,比较容易定位。
这是 DeepSeek Harness 链接转义的问题:CommonMark 把反斜杠当转义,\_ 变成 _,于是 G:\AI\_dsh_tools\_issue-body.md 变成 G:\AI_dsh_tools_issue-body.md,路径就错了。客户端只把反斜杠换成正斜杠,没有存在性校验。
DeepSeek Harness 的这个修复在提交 c262a09fd0b(PR #7098)里,位于 master(0.2.2-alpha.2),但不在 rc.4 里。也就是说 rc.3 与 rc.4 仍会打开错误路径。
在 DeepSeek Harness 里把反斜杠换成正斜杠,或者加 file:// 前缀。两种写法都能正常打开,社区实测有效。
相关术语
- singleTilde
- singleTilde 是 Markdown 删除线扩展的选项,控制单个波浪线是否也当定界符。设为 false 时只有成对 `~~` 才产生删除线。— https://github.com/deepseek-ai/deepseek-harness/discussions/10894
- CommonMark 反斜杠转义
- CommonMark 反斜杠转义是一条 CommonMark 规则:反斜杠后跟可转义字符时按字面量处理,因此 `\_` 会变成 `_`。Windows 路径中的反斜杠因此容易被误当转义符。— https://github.com/deepseek-ai/deepseek-harness/discussions/11378
- fileAddressFor
- fileAddressFor 是客户端把链接目标转换成可打开地址的函数,当前只做反斜杠替换与相对路径拼接,不做存在性校验也不做回退。— https://github.com/deepseek-ai/deepseek-harness/discussions/11378
- error.notFound
- 侧边栏文档预览打开失败时的空状态文案是 error.notFound,即「文件不存在,可能已被移动或删除」。它没有重试或替代路径。— https://github.com/deepseek-ai/deepseek-harness/discussions/11378
来源
- #10894 — Web UI 的 Markdown 把普通正文里的单个 ~ 当成删除线· deepseek-ai(GitHub Discussions)
- #11378 — Inline file links with Windows paths open wrong path· deepseek-ai(GitHub Discussions)
- #11076 — 同一转义规则:反斜杠被吃掉,点击报文件不存在· deepseek-ai(GitHub Discussions)