feat: title each Decision evaluation row by what it judged - #2552
Conversation
A Recent evaluations row showed only a time, an answer, and an outcome, so ten rows of the same routing looked alike. Each gate, shared-bot routing, and repository routing summary now carries a one-line title that the daemon derives on read from the frozen input: a code-host subject as its session title reads (PR #42: Fix the parser), otherwise the current message's first line, capped at 80 characters. It goes with the input when retention strips the bodies. A title quotes the input, so the CP returns it only to a caller the evaluation's detail would admit; other summary readers get the row with a null title. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
The title derivation and retention behavior look sound, but the conversation list can expose a title after the caller loses edit access during the daemon read. The post-read summary check reloads the conversation; the new title check then uses the pre-read snapshot. Please run the body-access check against the refreshed conversation, as the detail route does.
sent by review-bot (Codex · gpt-6-sol) · open in session
…fter the read The gate list's title check used the conversation loaded before the daemon read, so a caller who lost edit access during the read still got titles. The audience check now returns the reloaded conversation and the title check runs on it, as the detail route does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Approved. The conversation evaluation list now checks title access against the conversation reloaded after the daemon reply, so a caller who loses edit access during that read receives title: null. The added regression test covers that case. The title derivation, retention behavior, and other two list routes remain consistent with their detail-access rules.
sent by review-bot (Codex · gpt-6-sol) · open in session
|
@aaa please review this pull request. |
|
Found one compatibility issue: required The earlier access issue is fixed. Tests could not run because pnpm’s store database failed to open. Formal review was not submitted because the PR is already merged. sent by |
Summary
A Recent evaluations row showed only a time, an answer, and an outcome, so a page of one routing's rows looked alike and gave no reason to open any of them. This adds a one-line
titleto every gate, shared-bot routing, and repository routing summary row, so the console can show what each evaluation judged. The console change comes in a follow-up.DecisionEvaluationRecordandDecisionRoutingEvaluationRecordgaintitle: string | null(max 256).summaryRowderives the title from the frozen input it already parses. A code-host subject reads as its session title does (PR #42: Fix the parser,MR !7,Issue #3: …); anything else uses the current message's first non-blank line. Both reuse the session title clamp (80 characters). Once retention strips the input the title is null, so it never outlives the bodies. Agent model selection keeps itstargetand gets no title.title: null. For gates and shared-bot routing that is the conversation audience withbodies: true(edit access to the consumer agent before any session names an audience); for repository routing it is edit access to every member agent.decisions.md§9.5 and the three list routes' OpenAPI descriptions say what the title is and who sees it.Performance
The daemon already reads and parses each row's input to fill
messageId, so deriving the title adds no query and no parse. The list read was measured against a test daemon's store with a code-host routing of 228 evaluations (about 17 KB of stored bodies per row): 3 ms for a 10-row page and 5 ms for a 50-row page, query plus parsing, so reading slim columns instead would save only 2–4 ms against a round trip through the CP. The title adds at most about 240 bytes per row; the existing 32 KiB page cap and cursor absorb it.Testing
🤖 Generated with Claude Code . Claude Opus 5.5