Research: chat-template tags in text the model reads; tips I15 and T33; an open decision

M5a task 04 stopped twice on the chat-template tags the check refuses.
The first time, the model read them in a file and took them for its own
template. The second time, it spelled them out in its own reasoning.

Measured on straylight: the think and tool-call tags are one token
whatever the tokenizer's flag. Inside any chat message, the turn
markers become control tokens, so a tool result can forge a system
turn.

Adds the rule to AGENTS.md, and proposes neutralizing the tags in
loopd as an open decision.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-25 16:41:44 -07:00
committed by kyle
co-authored by Claude Opus 5.5
parent 6f093fcd8e
commit fb0aa2e576
4 changed files with 141 additions and 0 deletions
+4
View File
@@ -73,6 +73,10 @@ These come from defects found in review. The evidence is in `docs/implementer-le
the state a crash leaves behind, not only the states you write on purpose.
- When two programs must agree about a set of things (which files are a log, which names are ids),
one of them deciding alone is a bug. Write the case that walks both.
- Never write the model's chat-template tags out whole (the think and tool-call tags, the
angle-bar turn markers), in code, comments, commands or your log. Build them from pieces
(`concat!("<", "think")`) and name them in words: text holding them becomes your own control
tokens when you read it.
## The gate