Repository navigation
titles: most title calls on the default model hit their deadline, so conversations keep their first message or a file path as their name #1762
Description
What happened
2026-10-05, dev@f81638787 (dev-20261005-f816387875e5), engine road, default model ~deepseek/deepseek-v4-flash-latest. Found in the v0.7.1 happy-path pass. Two lanes ran in separate homes on the same day.
Most title calls never finish. From each home's logs/calls.jsonl, tag: title:
home 1: 5 deepseek/deepseek-v4-flash-0731 200 decode stream: context deadline exceeded
4 ~deepseek/deepseek-v4-flash-latest 200 decode stream: context deadline exceeded
1 ~deepseek/deepseek-v4-flash-latest - Post "https://openrouter.ai/api/v1/chat/…
2 deepseek/deepseek-v4-flash-0731 200 (ok)
home 2: 8 deadline-exceeded, 1 post error, 1 ok
What a person sees:
- Conversations keep their whole first message as their name, title-cased in
/resume, e.g.Hi! My Favourite Colour Is Periwinkle. Reply with Thr…. The manual says the fallback is the first seven words. - A conversation started with a
/taskand no message has no name at all. Reopening it prints the raw store path as the resumed line:· resumed /…/.codeaf/v3/projects/<project>/<id>/transcript.jsonl. /costand/spendreport14 calls the host charged for and could not be priced. The cut title streams are the likely source; spend: a cut title call beside an interrupted turn can split /spend from Settings→Spending #1753 has the related spend split.
Every codeaf chat --once also records its title call as failed, because the process exits first. See the telemetry issue from the same pass.
Replication
Field (real models). OPENROUTER_API_KEY, a fresh CODEAF_HOME, then codeaf chat with three short exchanges. Then run codeaf logs --tag title, or count "tag":"title" lines with an error in logs/calls.jsonl. Cost is under $0.01.
Deterministic (no model). A stub provider that streams a title more slowly than titleAskWindow shows the fallback path. Today that is the whole first message for an ordinary chat, and the raw path for a task-only one.
Where
titleAskWindow (20 s) and titleWindow (2 min) in internal/session/title.go, and the model the title role resolves to (a reasoning-heavy flash model). The fallback title, and the resumed … line that prints a path when there is no title, are in internal/tui3.
The fix
Titles come back on the default model. That means a model for the title role that answers inside the window, or reasoning turned off for that one call. The fallback is the documented first seven words. A conversation with no title resumes as resumed · new conversation, or under the first task's title, never as a file path.
Acceptance
- e2e: on a fresh profile with the default model, a three-message chat has a title of at most 8 words within 60 s.
- e2e: reopening a task-only conversation draws no
transcript.jsonlpath.
Activity