Skip to content

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

Open

Description

@ZeroPoint95

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 /task and 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.
  • /cost and /spend report 14 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.jsonl path.

Activity

  1. added
    bugSomething the code does that it should not
    area:chatThe v3 surface a person sits in front of (internal/tui3)
    area:sessionThe engine — turns, tasks, the toolbelt, checkpoints
    sev:seriousWrong or missing behaviour a person meets in ordinary use
    on Oct 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:chatThe v3 surface a person sits in front of (internal/tui3)area:sessionThe engine — turns, tasks, the toolbelt, checkpointsbugSomething the code does that it should notsev:seriousWrong or missing behaviour a person meets in ordinary use

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions