diff --git a/crates/tinytools-agent/src/parse/grammar/tagged.rs b/crates/tinytools-agent/src/parse/grammar/tagged.rs
index 4f01ad6..8fe09ef 100644
--- a/crates/tinytools-agent/src/parse/grammar/tagged.rs
+++ b/crates/tinytools-agent/src/parse/grammar/tagged.rs
@@ -9,7 +9,13 @@
//! templates);
//! * sentinel pipes leaked into the markers, in any position:
//! `<|tool_call>…`, `<|tool_call|>…<|tool_call|>`,
-//! `…`;
+//! `…`, including the fullwidth `|` those templates
+//! actually emit;
+//! * a `DeepSeek` DSML marker on the tag itself,
+//! `<|DSML|tool_call>…|DSML|tool_call>` — the same marker
+//! [`super::invoke_xml`] already accepts on ``, which this family
+//! used to miss, so a `deepseek` turn that chose the tag form over the
+//! invoke form parsed as prose and the call was silently dropped;
//! * a `call:` prefix before the body;
//! * a fenced block instead of a tag, ```` ```tool_call … ``` ````, sometimes
//! closed by a stray ``;
@@ -39,11 +45,17 @@ use crate::types::{CallSource, ParseOptions, ParsedToolCall};
pub(crate) struct Tagged;
/// Any tag-family marker: ``, ``, ``, with
-/// pipes, a slash, or whitespace leaked in, and an optional attribute list.
-/// `` (plural, a JSON key) and `` do not match:
-/// the name must end at a pipe, slash, whitespace, or `>`.
-static TAG_RE: LazyLock