fix(server): retry automatic thread title generation - #8087
Conversation
Automatic thread titles are generated once, on the first turn, and the result is discarded on failure. The web and mobile clients seed the thread with a placeholder title truncated from the first user message before the turn starts, so a single failed generation leaves the thread permanently named after the raw prompt text. Server logs on a long-running instance show this failing regularly: over 14 days, 32 automatic title generations failed, two thirds with "Claude CLI request timed out." and the rest with transient CLI errors such as a failed OAuth refresh. Every one of those threads still carries the truncated first message as its title. Retry the generation twice with exponential backoff. The existing post-generation guard still applies, so a title the user renamed in the meantime is never overwritten.
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a narrow resilience fix to existing background thread-title generation, adding at most two delayed retries after provider failures and leaving other paths unchanged. The included test covers recovery from a transient timeout, with no schema, infrastructure, security, billing, or default-setting changes. You can add or adjust custom eligibility rules. Learn more. |
|
Note 🤖 GPT-5.6 Sol responding on behalf of Theo We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together. This addresses a real but low-impact failure where the first automatic title attempt can be lost. We do not have a current reproduction that justifies keeping this full retry patch in the active queue. If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed. |
Bil0000
left a comment
There was a problem hiding this comment.
Remove useless code comments
Dismissing prior approval to re-evaluate 1e2fdef
Dismissing prior approval to re-evaluate 0c94e6d
|
Ponytail finding fixed: the retry regression duplicated the existing title-generation integration test. The transient failure now lives in that test, and the one-use retry constants are inlined. Net: -44 lines. Verified with all 49 ProviderCommandReactor tests, server typecheck, lint, and format. |
What Changed
Automatic thread title generation now retries twice with exponential backoff before giving up.
maybeGenerateThreadTitleForFirstTurnwrapsgenerateThreadTitleinEffect.retry(2 retries, 2s exponential backoff).TextGenerationError, the second succeeds, and the thread ends up with the generated title.No behavior change on the success path, and no change to the prompts, the regeneration path, or any other text generation operation.
Why
Automatic titles are generated exactly once, on the first turn, and the result is dropped on failure. Before that turn starts, the web and mobile clients already seed the thread with a placeholder title truncated from the first user message. So a single failed generation leaves the thread permanently named after the raw prompt text (
"There are some spacing issues in the too..."), with only a server-sidelogWarningto show for it.This is not rare. On a long-running instance, server logs show 32 failed automatic title generations over 14 days:
Claude CLI request timed out.(the text generation CLI has a 180s ceiling, and a single title call measured 60–80s on a loaded machine, so contention pushes it over)Failed to authenticate: OAuth session expired and could not be refreshedEvery one of those threads still carries the truncated first message as its title in
projection_threads.Both failure classes are transient, so a bounded retry is the smallest fix that makes the title actually land. The existing guard after generation is unchanged: the generated title is still only applied when the thread title is still the default or still equals the client's
titleSeed, so a title the user renamed during the backoff is never overwritten.Known limitation: this does not make title generation faster, and a thread whose generation fails all three times still keeps the placeholder. Reducing the per-call latency and surfacing a persistent failure to the user are separate changes.
Checklist
Note
Retry thread title generation in
ProviderCommandReactorup to 2 timesWraps the
generateThreadTitlecall site inProviderCommandReactor.makewith a retry policy using exponential backoff (2s, then 4s). The title generation now retries up to 2 additional times on transient failures before giving up. The test in ProviderCommandReactor.test.ts is updated to verify a first-call failure is retried and the second call succeeds.Macroscope summarized 0c94e6d.