feat: branch filtering, activity rollups, and usage grouping - #1017
Conversation
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
|
This branch needs more work (I have over 1000 branches in my session database, and there are performance sharp edges) so I'm going to ship 0.37.0 and then get this merged when I can |
roborev: Combined Review (
|
b13fce9 to
2682399
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
34b3e7f to
117e099
Compare
roborev: Combined Review (
|
117e099 to
aa5196a
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
b4a6c0e to
04adf03
Compare
roborev: Combined Review (
|
04adf03 to
63ca296
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
d34459c to
c69d89b
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
2228d33 to
bf872a3
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
bf872a3 to
1e00449
Compare
roborev: Combined Review (
|
1e00449 to
50015a4
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
d48073e to
5af56d7
Compare
roborev: Combined Review (
|
5af56d7 to
46ac5c9
Compare
roborev: Combined Review (
|
Make branch identity usable across session discovery, activity analysis, and usage attribution so users can inspect work by branch without losing backend parity or fast default query paths. Squashed follow-ups: - fix(usage): preserve comparison work during lazy branch enrichment - fix(usage): keep project-qualified branches independently selectable - perf(usage): skip branch buckets for totals-only comparisons Co-authored-by: Wes McKinney <wesmckinn+git@gmail.com> Co-authored-by: Marius van Niekerk <marius.v.niekerk@gmail.com>
46ac5c9 to
bd46820
Compare
roborev: Combined Review (
|
Branch totals do not cover cursor usage, and server branch discovery is deliberately bounded. Without explicit fallbacks, the UI can understate percentages or hide branchless selection entirely. Represent the unattributed remainder in branch summaries and reserve the branchless picker entry outside capped search results so filters and totals remain usable for large histories.
roborev: Combined Review (
|
Branch selection can change while an ordinary summary is already in flight. Without generation-aware reconciliation, that response can either suppress the requested enrichment or overwrite richer data that completed first. Treat the current grouping as durable intent and only let responses replace branch-rich state when they belong to a newer generation.
roborev: Combined Review (
|
Plain branch selections can represent several project-qualified identities, and persisted opaque keys can outlive the archive that created them. Collapsing either case silently narrows results or leaves cached usage stale after a 400 response. Keep every qualified match, and recover unknown keys in stages so valid precision is retained before falling back to portable branch names.
roborev: Combined Review (
|
Branch suggestions must use the same one-shot and automation scope as the report they filter; otherwise the picker can offer branches that yield an empty dashboard.\n\nLarge treemaps also need to preserve the omitted share of the total. Aggregate overflow into a non-interactive Other tile so the capped visualization remains proportional without implying that hidden rows do not exist.
The branch-filtering pull request should not carry implementation plans and design notes from unrelated completed work. Removing these branch-only artifacts keeps the review surface focused and matches the requested publication scope.
roborev: Combined Review (
|
The branch picker needs bounded name search, but changing the stable v1 metadata endpoint would break clients that depend on project-qualified tokens. Keep that contract intact and expose picker-oriented search through an additive route.\n\nLarge archives also need a bounded Activity branch panel. Preserve the report total by aggregating overflow into an Other row instead of rendering an unbounded list or silently dropping data.
Adds Git branch as a first-class filter and grouping dimension across session
discovery, Activity, and Usage. This combines and supersedes #974, #978, and
#979 as part of #928.
Branch identity remains project-qualified through opaque tokens, so same-named
branches in different repositories stay independent. The stable
/api/v1/branchescontract continues to return project, branch, and token;bounded, recency-ordered picker search now uses the additive
/api/v1/branch-namesendpoint.Session search, the sidebar, HTTP clients, and MCP tools can filter by branch.
Picker suggestions follow the active project and session scope, retain the
branchless option outside bounded results, and recover safely from stale
archive-specific identities.
Activity now provides branch rollups across SQLite, PostgreSQL, and DuckDB. Its
branch panel shows the 39 highest-value rows and combines the remainder into an
Other row, keeping large archives responsive without misrepresenting totals.
Usage can group charts and attribution by branch with selection shared across
rows, URLs, and saved preferences. Branch data is loaded lazily without
interrupting comparisons; totals-only comparison queries skip branch buckets,
and unattributed usage remains visible so percentages reconcile with summary
totals.
Branch selections are include-based and intersect with the sidebar branch
filter when both are active. Large explicit selections can still increase URL
and request size, while branch breakdown payloads grow with per-day branch
churn; both costs are opt-in.