DeepSeek Harness Markdown: strikethrough and backslash
"16~18 degrees" renders as "16" followed by a struck-through "18", and a Windows path link opens only to say the file does not exist — one symptom is in inline text, the other in a link target, but both are edge handling in the Markdown parsing layer. The key is that they were fixed in different versions: one landed in rc.3, the other waits for 0.2.2-alpha.x (#10894, #11378).
DeepSeek Harness: Step 1: report the version before the symptom
Similar rendering issues produce opposite conclusions on different versions, and confirming the version first saves half the investigation.
- Open "About" or read
package.jsonin the install directory and note the full version. - rc.2 and earlier: a single tilde becoming strikethrough was normal behavior for that code.
- rc.3:
singleTilde: falsewas added, so a single~should stay literal. - rc.3 / rc.4: Windows path links still open the wrong path; that fix is only in master and 0.2.2-alpha.2.
- When the version does not match, do not jump to "the fix did not work" — first confirm which class you are seeing.
DSH plugin: Type 1: a single ~ becomes strikethrough
The parser explicitly disables single-tilde strikethrough now, and both entry points pass the same option.
- Reproduction text:
Today is 16~18 degrees, and I will swim 1~3 laps. - Symptom:
18after16gets strikethrough, and3after1does too. - Where the fix lives: the Markdown parsing file in
ui-primitivesdefinesgfmOptions = { singleTilde: false }. - Both entry points pass it: the plain parse entry and the parse entry with math support.
- The comment explains the reason: numeric ranges.
- Control: search for
singleTildein the same file on rc.2 and there is not one occurrence — this was added in rc.3.
If you still see strikethrough on rc.3, change direction: check whether a plugin renders message bodies itself, or whether the frontend bundle is still an old cache.
DeepSeek Harness: Type 2: backslash paths treated as escapes
CommonMark interprets \_ as _, and backslashes in Windows paths land exactly on that rule.
- The agent writes
G:\AI\_dsh_tools\_issue-body.md. - The reply contains a link:
[\_issue-body.md](G:\AI\_dsh_tools\_issue-body.md). - After parsing, the target becomes
G:\AI_dsh_tools_issue-body.md— the backslash in\_was eaten. - The client then replaces
\with/and joins the path, producingG:/AI/_dsh_tools_issue-body.md. - The sidebar opens that non-existent path and shows "file does not exist, it may have been moved or deleted".
- Control experiment:
Test-Pathreturns True for the original path and False for the rewritten one.
DSH Plugin: Type 3: the card for the same file still opens
Tool result cards use structured paths and never pass through Markdown text, so they are unaffected by escaping.
- The card reads
meta.pathfrom the tool call, an absolute path that already passed an absolute-path check. - The inline link reads the Markdown text the author wrote and must go through CommonMark escaping.
- So the same file shows the split behavior of "card opens, link does not".
- That is also the best discriminator: if the card opens the file and the link does not, you are in this class.
- Another community report describes the same rule elsewhere: link resolution only runs
decodeURIComponentand never restores escaped backslashes.
DeepSeek Harness: Version matrix and today's writing style
The two classes were fixed in different versions, so workarounds and waiting for upgrades have to be scheduled separately.
| Issue | Fix location | rc.3 | rc.4 | 0.2.2-alpha.x |
|---|---|---|---|---|
Single ~ becomes strikethrough | parser singleTilde: false | fixed | fixed | fixed |
| Backslash path eaten | c262a09fd0b | not fixed | not fixed | fixed |
Until the fix reaches you, write links like this:
- Use forward slashes in paths:
G:/AI/_dsh_tools/_issue-body.md. - Or add a
file://prefix so the target is recognized as an address rather than plain text. - Wrapping a path in inline code avoids escaping, but that only guarantees correct display, not clickability.
- If a numeric range must be shown, use inline code or escape the single
~with a backslash (on unpatched versions). - When reporting, attach the source text and version so it is not re-investigated as a "new issue".
DSH plugin: Three-step self-check: do not merge the two classes
Look at the object, the version, and the control — three steps settle it.
- Object: is the problem inline text gaining styling, or a link target being rewritten. The first is a parser option, the second an escaping rule.
- Version: confirm whether you are on rc.2 / rc.3 / rc.4 / alpha, then check the matrix.
- Control: for the same path, can the tool result card open it. If yes, structured paths are fine and the problem is the hand-written link.
- Once all three line up, decide whether to wait for an upgrade or change the writing style.
Cautions
Report the version with the symptom; the two fixes ship separately.
- Do not treat a rendering issue as a lost file. First check whether the path was rewritten.
- Do not expect upgrading to rc.4 to fix both. The backslash fix is not on the rc line.
- Do not ignore plugins. A second Markdown instance keeps an "already fixed" issue alive.
- Record the source text. The strongest evidence for rendering issues is a character-by-character comparison of input and output.
- Prefer structured paths. When a tool result card can open the file, do not rely on a hand-written link.
If your problem is "a ~ inside a code block also gets processed", that is neither class, because code blocks do not use the same parsing path.See DeepSeek Harness blank sessions and missing auto titles for the related case.
FAQ
It is not normal in DeepSeek Harness, but it depends on the version. rc.3 adds singleTilde: false to the parser so a single ~ stays literal; rc.2 and earlier lack that option, so strikethrough matched the code of that time.
Another Markdown instance exists in the DeepSeek Harness render chain if rc.3 still shows it, such as a plugin rendering message bodies itself, or a frontend bundle still cached from an older build. Providing the message source text along with the version makes it easier to locate.
The path link breaks because CommonMark treats a backslash as an escape in DeepSeek Harness rendering, so \_ becomes _, turning G:\AI\_dsh_tools\_issue-body.md into G:\AI_dsh_tools_issue-body.md and breaking the path. The client only swaps backslashes for forward slashes, with no existence check.
Commit c262a09fd0b (PR #7098) fixed it in the DeepSeek Harness markdown layer and landed in master (0.2.2-alpha.2), but not in rc.4. So rc.3 and rc.4 still open the wrong path.
Before the fix arrives in DeepSeek Harness, use forward slashes or add a file:// prefix; both forms open correctly, as the community verified.
Related Terms
- singleTilde
- singleTilde is an option of the Markdown strikethrough extension controlling whether a single tilde also acts as a delimiter. When false, only paired `~~` produces strikethrough.— https://github.com/deepseek-ai/deepseek-harness/discussions/10894
- CommonMark backslash escape
- CommonMark specifies that a backslash followed by an escapable character is treated literally, so `\_` becomes `_`. Backslashes in Windows paths are therefore easily mistaken for escapes.— https://github.com/deepseek-ai/deepseek-harness/discussions/11378
- fileAddressFor
- fileAddressFor is the client function that turns a link target into an openable address; it currently only replaces backslashes and joins relative paths, with no existence check or fallback.— https://github.com/deepseek-ai/deepseek-harness/discussions/11378
- error.notFound
- The empty-state copy is `error.notFound`: it is shown when the sidebar document preview fails to open, warning that the file does not exist and may have been moved or deleted. It offers no retry or alternative path.— https://github.com/deepseek-ai/deepseek-harness/discussions/11378
Sources
- #10894 — the Web UI Markdown treats a single ~ in ordinary text as strikethrough· deepseek-ai (GitHub Discussions)
- #11378 — Inline file links with Windows paths open wrong path· deepseek-ai (GitHub Discussions)
- #11076 — same escaping rule: backslashes are eaten, and clicking reports the file does not exist· deepseek-ai (GitHub Discussions)