a `</think>` reply still names a conversation: the control-token title guard misses the think family
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 3/5
- Tempo estimado
- 1-2 dias
- Facilidade para iniciantes
- 86/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Stack de tecnologia
- go
- Domínio
- cli, documentation, testing
Direção de pesquisa
Start with titleHasControlTokens, cleanTitle, and healedTitle in internal/session/title.go, then read the existing cases in internal/session/title_test.go. Run the deterministic unit tests and the tmux e2e naming path in internal/e2e. Done means think tags are rejected without rejecting ordinary angle-bracket titles, stored invalid titles fall back to the prompt label, and the manual page and change entry describe the behavior.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
What happened
2026-09-21, PR #1071 at 78ddda475 (on dev@49b4a58fb), codeaf against a throwaway home with deepseek/deepseek-v4-pro-0813 through OpenRouter. The naming call for a new conversation came back as a provider control token and it became the conversation's title on the tab, on Home and in the Sessions tab:
<|DSML|notice>
The fix commit on that PR added titleHasControlTokens in internal/session/title.go, which now rejects that family (<|, <|, [im_start], [im_end]) and repairs a stored one through healedTitle. It does not reject </think> or <think>, which contain neither marker. Those are the tokens this project has actually been bitten by before (the reasoning-tag loops behind #308 and the reply guard), from the same providers, so a naming reply of </think> or </think> fix the login bug will still be drawn as a title on every surface.
Replication
Deterministic (no model).
titleHasControlTokens("</think>") returns false today, and cleanTitle("</think> fix the login bug") returns a title that starts with the tag. A table case beside the existing control-token cases in internal/session/title_test.go shows it without a model. Through the real door: the tmux e2e suite's stub model (internal/e2e) answering the naming request with </think> names the conversation </think> on the tab row.
Field (real models).
Any conversation named by a DeepSeek or Qwen model on a day the provider leaks its reasoning close tag; it fires on the naming call, not on the reply, so it costs one short call. No control run needed: the deterministic case is the evidence.
Where
titleHasControlTokens in internal/session/title.go, and its two callers cleanTitle and healedTitle in the same file.
The fix
The guard also rejects <think> and </think> (case-insensitive, with or without surrounding text), on the same terms as the <| family: the reply is unusable, the conversation keeps its prompt label until naming produces a clean phrase, and a stored title carrying one is repaired on the next read. Legitimate titles that merely contain angle brackets (compare <div> and <span> rendering, fix the <T> generic bound) keep passing.
Acceptance
- e2e: through the naming road with a stub model whose title reply is
</think> fix the login bug: the tab row and the Home row show the prompt label, and the captured frame contains no</think>. - e2e: control: a stub reply of
compare <div> and <span> renderingis drawn verbatim on the tab row. - Unit:
titleHasControlTokensis true for</think>,<think>,<|im_start|>and<|DSML|notice>, false for<div>;healedTitleof a stored</think>returns the empty title so the caller falls back to the prompt label. - The manual page that covers conversation names says a reply that is a provider control token is not used as a name, and the change entry's
invalidatesnames what people believed before.
- Linguagem predominante
- Go
- Estrelas
- 115
- Forks
- 14
- Merge médio
- 9h 44min
- PRs com merge (30d)
- 766
Preparar o ambiente
Ainda não verificamos os arquivos de configuração deste projeto. Comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de Agent-Field/CodeAF
-
area:chat bug sev:papercut
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 86/100
Agent-Field/CodeAF#1592 ·
Mantenedores costumam responder em até 1 dia
-
area:headless bug sev:critical
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
Agent-Field/CodeAF#1566 · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
area:chat feature
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
Agent-Field/CodeAF#1510 ·
Mantenedores costumam responder em até 1 dia
-
area:tests bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Agent-Field/CodeAF#1489 ·
Mantenedores costumam responder em até 1 dia
-
area:chat bug good first issue sev:papercut
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Agent-Field/CodeAF#1470 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de Agent-Field/CodeAF
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
gruntwork-io/boilerplate#329 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
prime-radiant-inc/evener#3291 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
Netcracker/qubership-apihub-backend#582 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 86/100
Mantenedores costumam responder em até 1 dia