Hacktoberfest 2026:維護者為十月標記出來的 issue,仍然開放、適合新手。 瀏覽 Hacktoberfest issue

a `</think>` reply still names a conversation: the control-token title guard misses the think family

未關閉
#1,337 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

還沒有人認領這個 Issue。

評估

難度
3/5
預估耗時
1-2 天
新手友好度
86/100
Issue 類型
缺陷
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
go

研究方向

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.

由索引模型根據 Issue 內容生成。

描述

area:session bug sev:papercut

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> rendering is drawn verbatim on the tab row.
  • Unit: titleHasControlTokens is true for </think>, <think>, <|im_start|> and <|DSML|notice>, false for <div>; healedTitle of 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 invalidates names what people believed before.
主要語言
Go
星號
115
分支
14
平均合併
13 小時 23 分鐘
30 天內合併 PR
205

環境準備

我們還沒有檢查這個專案的環境設定檔。先看它的 README,通用步驟見我們的新手貢獻指南。

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

Agent-Field/CodeAF 的其他 Issue

查看 Agent-Field/CodeAF 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。