- test(usage): align pairwise proof with filter semantics
- fix(usage): match pairwise clients to the wire contract (kenn-io#361)
- fix(usage): drop stale pairwise results during selector refresh (kenn-io#361)
- fix(usage): keep pairwise state and schema aligned (kenn-io#361)
- fix(usage): clear summary-driven pairwise drift (kenn-io#361)
- test(usage): cover MCP pairwise daemon forwarding (kenn-io#361)
- fix(usage): keep generated client drift out of the PR (kenn-io#361)
- fix(usage): narrow generated client changes to pairwise scope (kenn-io#361)
- fix(usage): use shared selectors and clear aborted pairwise loading (kenn-io#361)
- Keep pairwise comparison CI aligned with current source and lint
- fix(usage): keep pairwise selectors reactive and non-blocking (kenn-io#361)
- fix(i18n): add zh-TW pairwise comparison copy
- docs: require synchronized localization catalogs
- fix(usage): lower pairwise comparison priority
- fix(usage): forward branch filters for pairwise comparisons
- fix(serve): reuse daemons published during startup
- fix(usage): clear stale pairwise data on refresh
The usage dashboard has enough aggregate data to show which models and projects cost the most, but it does not let users compare two choices directly. Issue #361 asks for questions like model A versus model B cost per session or token profile, which currently requires manual filtering and side-by-side arithmetic outside AgentsView.
This adds a pairwise usage comparison endpoint and dashboard panel. The comparison logic lives in the service layer so the direct backend, HTTP backend, server route, and frontend all use one metric definition. Each side applies the same usage filters and the same model or project filter path as the existing summary endpoint, so timezone handling, deduplication, pricing, and eligibility stay aligned with the rest of the usage dashboard.
The UI is additive: existing summary cards, time series, attribution, top sessions, and cache efficiency remain in place. The new panel focuses on model and project comparisons first, with cost, token, and session-based metrics returned by the backend instead of recomputed in the browser.
Fixes #361