Repository navigation
Mirror each harness's own session title, including renames - #1230
Conversation
A coded 404 means the session isn't visible yet and must not be treated as route-missing, or a visible-session post would silently fall back to the older route instead of surfacing as refused. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Cursor's meta.json updatedAtMs moves with ordinary conversation activity on a live install, not just renames, so CursorChatTitle never reports a change time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pure tracker/detector live in Cli.Core (not Cli) since WatchState does — Cli.Core cannot reference a type from the Cli assembly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Retries a coded session_not_found for ~60s so a title beats the projection lag instead of racing it, falling back to set-title on an older server. OpenCode's cancellation-recovery contract had to defer this call's OperationCanceledException the same way it already defers one from a descendant, or the terminal session-end re-close never ran. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The plugin, not the server, owns the placeholder filter: an untitled session's title must never masquerade as a rename downstream. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The periodic pump raced ImportHarnessTitle.PostAsync's per-attempt CancellationTokenSource, built from the same FakeTimeProvider it advanced blind of any in-flight request. A single big jump per attempt raced the opposite way: it could land before that attempt's Task.Delay timer even existed, stranding the test for a full backoff it would never see advanced again. Small nudges after each observed request close both windows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
EventSessionDeleted carries properties.info, not properties.sessionID like the events this handler otherwise reads; without the fallback the generic sid guard dropped every session.deleted before memory/coldStarts/lastTitle cleanup ran, leaking one entry per session. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SendWithRetryAsync's per-attempt CancellationTokenSource shares whatever TimeProvider it's handed, so a single clock driving the retry backoff in a test could still race that timeout under a sustained stall. The internal overload lets tests hand backoff a FakeTimeProvider and HTTP the real one; production still passes one provider for both, so its own behaviour is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The harness's own title (rename or auto) is pushed whenever it changes, independent of the server's title, since it is authoritative for what the harness itself calls the session; the generated fallback still converges only while the server is silent and no native title exists. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A rename back to an earlier value is a switch, not a re-append — timing it by first occurrence let a later revert lose to an intervening value. Refused pushes stop retrying; Failed/SessionNotFound keep retrying. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ClaudeNativeTitle's own static cache grew unbounded across a long-lived daemon, keyed by lifetime-total sessions. It is stateless again; the skip-when-unchanged memo now lives in AgentTitleState, dropped with the agent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The per-conversation conversations/<id>.db has no conversation_summaries table, so every read there failed silently. Connections are unpooled so no handle outlives a read and blocks Antigravity replacing its own file on Windows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…itles Only 400, 403 and 422 settle a value; 401, 408, 429 and server faults are Failed, so the daemon and watcher retry them. An older server stores set-title verbatim, so the fallback clamps to 120. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ceholders OpenCode's placeholder title carries milliseconds, so it is matched by prefix as the server and plugin match it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The IDE keys composerData:<id> in globalStorage/state.vscdb by the same id as the agent transcript. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…alues The post runs inline in the watch loop, so it gets half the heartbeat threshold; an unsettled value is re-sent at most every 30s rather than on every drain. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The watcher sends the same rename uncapped, so a daemon cap would make one rename reach the server as two values; only the local display is capped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Also reads Kiro's own files without denying it write access. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cquisition The server normalises whitespace before its 200 clamp, so a client-side cut made one long rename arrive as two values; only a 4096 safety cap remains. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Summary by QodoMirror harness session titles and renames across CLI and daemon
AI Description
Diagram
High-Level Assessment
Files changed (54)
|
A failed post may still have committed, so a return to the acknowledged value is re-sent; OpenCode title lines carry a time only when OpenCode supplied one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Code Review by Qodo
1.
|
…udget Import has no later tick, so it opts into status retries; the watcher and daemon retry on their own cadence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compatibility fix in 40bcb61. On a server without That happened in two ways. A Claude
/agentic_review follows. |
|
/agentic_review |
An inconclusive probe may never be retried before a short session ends, so only a server known to have harness titles lets an inline title stop LLM titling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Code review by qodo was updated up to the latest commit 40bcb61 |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Qodo re-review (at c686683): open findings, addressed on
Also in this push, from our own review: 1bc3769. When a poll takes up a store read left over from an earlier poll, it now reads the store again while its budget allows. The shutdown poll therefore cannot settle for a stale value. The blocked-read tests now order their steps with signals instead of timing. |
|
/agentic_review |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
/agentic_review |
Thanks for the update. Based on the current Qodo findings state:
The stale-read and shutdown-poll changes are covered by the added synchronization-focused tests. No dismissal or implementation action was requested here. |
|
Code review by qodo was updated up to the latest commit 5ec2a22 |
…ords Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
/agentic_review |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Code review by qodo was updated up to the latest commit a184ba6 |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
/agentic_review |
|
Code review by qodo was updated up to the latest commit 92fa60f |
…cing Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
/agentic_review |
|
Code review by qodo was updated up to the latest commit 71b8ca4 |
Closes #1229 — AI-3335
What & why
Capacitor should show the title each harness itself shows, including operator renames, with generated titles only as a backstop. The CLI now reads each harness's own title store (Codex
session_index.jsonl, Copilotworkspace.yaml, Cursor chat/composer records, Kiro{id}.json, Antigravityconversation_summaries.db), posts changes to the server's newPOST /hooks/harness-titlewith arename/autokind and a change time, forwards OpenCode title changes into the watched transcript, imports titles through the same route, pushes hosted Claude renames from the daemon, and stops LLM titling once a harness title is known.Where to look
/hooks/set-title. A codedsession_not_foundis retried (import waits up to ~60 s for projection).Verification
HarnessTitleClientTests19/19,WatchCommandTests+WatchHarnessTitleTests94/94,TitleResolveLoopTests+AgentOrchestratorNativeTitleTests34/34,ClaudeNativeTitleTests15/15, import integration classes 19/19.dotnet publish -c Releasefor kcap and kcap-daemon: no IL2xxx/IL3xxx warnings.🤖 Generated with Claude Code