Skip to content

feat: title each Decision evaluation row by what it judged - #2552

Merged
zfy0701 merged 2 commits into
mainfrom
claude/decision-evaluation-message-preview
Sep 26, 2026
Merged

zfy0701 merged 2 commits into
mainfrom
claude/decision-evaluation-message-preview

Conversation

@zfy0701

@zfy0701 zfy0701 commented Sep 26, 2026

Copy link
Copy Markdown
Contributor

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 title to 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.

  • protocol: DecisionEvaluationRecord and DecisionRoutingEvaluationRecord gain title: string | null (max 256).
  • daemon: summaryRow derives 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 its target and gets no title.
  • control plane: a title quotes the input, so each list route returns it only to a caller the detail would admit; other summary readers get the row with title: null. For gates and shared-bot routing that is the conversation audience with bodies: true (edit access to the consumer agent before any session names an audience); for repository routing it is edit access to every member agent.
  • docs: 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

  • daemon: titles from a pull request, a merge request without a title, a push (first non-blank line), an over-long message, a blank message, a reserved row, an expired row, and a router row
  • control plane integration: a viewer reads summaries without titles before any session names an audience and with them once one does; a collaborator with edit access reads them titled; repository routing withholds titles from a member who cannot open details
  • protocol, web decision tests, typecheck, lint

🤖 Generated with Claude Code . Claude Opus 5.5

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>
@zfy0701
zfy0701 enabled auto-merge (squash) September 26, 2026 18:45

@agentconnect-md-test agentconnect-md-test Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Comment thread packages/control-plane/src/http/routes/integration-channel-decisions.ts Outdated
…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>

@agentconnect-md-test agentconnect-md-test Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@zfy0701

zfy0701 commented Sep 26, 2026

Copy link
Copy Markdown
Contributor Author

@aaa please review this pull request.

@zfy0701
zfy0701 merged commit d7f2beb into main Sep 26, 2026
14 checks passed
@zfy0701
zfy0701 deleted the claude/decision-evaluation-message-preview branch September 26, 2026 18:57
@agentconnect-md-test

Copy link
Copy Markdown
Contributor

Found one compatibility issue: required title fields make the updated control plane reject non-empty evaluation pages from older daemons. Accept missing titles as null or negotiate the new response shape.

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 aaa (Codex · gpt-6-astra) · open in session

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant