feat(seer): Add Autofix overview UI - #121749
Conversation
| </Text> | ||
| <Text size="sm" variant="muted" ellipsis title={run.title}> | ||
| {run.title} | ||
| </Text> |
There was a problem hiding this comment.
Duplicate issue title on cards
Medium Severity
Every card always renders run.title twice—once as the primary link and again as the muted subline. The original overview only shows that muted line when a distinct headline exists; overview2 has no separate headline, so the subline is always a duplicate of the same issue title.
Reviewed by Cursor Bugbot for commit 23a34b4. Configure here.
| > | ||
| <PageFiltersContainer | ||
| skipInitializeUrlParams | ||
| defaultSelection={{datetime: {period: '14d', start: null, end: null, utc: null}}} |
There was a problem hiding this comment.
Wrong stats period in tooltips
Low Severity
The page defaults to a 14d selection and passes that into periodWindowLabel, but that helper only knows 24h/7d/30d/90d and falls back to the 90d copy. Event and user count tooltips therefore claim “in the last 90 days” while counts come from the 14-day window.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit 23a34b4. Configure here.
## Summary
First of three stacked PRs splitting the Autofix overview feature.
Adds the Seer Autofix overview endpoint (`GET
/organizations/{org}/seer/autofix-overview/`), which groups an
organization's autofix runs by their furthest-reached milestone and
returns each run's root cause, proposed fix, and issue details.
Pull-request (SCM) enrichment — checks, review status, and changed files
— is intentionally stubbed out behind `NOTE:` markers in this PR and
re-enabled in the next PR in the stack, so this one stays a
self-contained backend change.
## Stack
1. **This PR** — endpoint core
2. #121748 — SCM enrichment + endpoint wiring
3. #121749 — frontend UI
## Test Plan
- New
`tests/sentry/seer/endpoints/test_organization_seer_autofix_overview.py`
covers milestone grouping, latest-run-per-group, project scoping,
deleted-group tolerance, nested issue object, stats-period filtering,
and per-milestone capping.
---------
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
de7d191 to
35b6a77
Compare
23a34b4 to
5c7b971
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
There are 4 total unresolved issues (including 2 from previous reviews).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 5c7b971. Configure here.
| '%s affected users %s', | ||
| userCount.toLocaleString(), | ||
| periodWindowLabel(statsPeriod) | ||
| )} |
There was a problem hiding this comment.
Wrong event count period labels
Medium Severity
Event and user count tooltips call periodWindowLabel with DatePageFilter periods such as the page default 14d. That helper only knows 24h/7d/30d/90d and falls back to “in the last 90 days,” so tooltips disagree with the stats window actually queried.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 5c7b971. Configure here.
| target_file: file.path, | ||
| type: DiffFileType.MODIFIED, | ||
| hunks: [], | ||
| }; |
There was a problem hiding this comment.
PR file change type ignored
Low Severity
toFilePatch always sets DiffFileType.MODIFIED and never maps file.changeType from the overview payload. Deleted files therefore skip FileDiffViewer’s delete treatment when expanded, even though the endpoint and card types carry changeType.
Reviewed by Cursor Bugbot for commit 5c7b971. Configure here.
| function issueFixture(overrides: Record<string, unknown> = {}) { | ||
| return { | ||
| count: '0', | ||
| userCount: 0, | ||
| lastSeen: '2026-07-14T08:00:00Z', | ||
| level: 'error', | ||
| substatus: 'ongoing', | ||
| priority: 'high', | ||
| priorityLockedAt: null, | ||
| issueType: 'error', | ||
| issueCategory: 'error', | ||
| assignedTo: null, | ||
| owners: [], | ||
| project: {id: '2', slug: 'project-slug', platform: 'python'}, | ||
| ...overrides, | ||
| }; | ||
| } |
There was a problem hiding this comment.
we have fixtures for things like issues
There was a problem hiding this comment.
apologies, this PR is entirely vibed and i didnt mean for it to be opened for review yet, sorry for the noise!
| issue: issueFixture({project: {id: '3', slug: 'project-slug', platform: 'python'}}), | ||
| }; | ||
|
|
||
| function mockOverview(runsByMilestone: Record<string, unknown[]>) { |
There was a problem hiding this comment.
feels like we're escaping the type system here
5c7b971 to
571862d
Compare
59ba79f to
170ac30
Compare
571862d to
5d6e884
Compare
170ac30 to
25bbc1b
Compare
5d6e884 to
2a40809
Compare
25bbc1b to
8c1d39e
Compare
8c1d39e to
cd591cf
Compare
1df095e to
96a7209
Compare
Sentry Snapshot Testing
|
…21748) ## Summary Second of three stacked PRs for the Autofix overview feature. **Stacked on #121747 — review/merge that first.** Adds pull-request SCM enrichment and wires it into the Autofix overview endpoint: - New `pull_request_status_batch` module extracts the shared batch helpers (`get_checks_and_review` + provider resolution) out of the group pull requests endpoint so both consumers share one implementation. - Adds batched checks, review status, and changed-file enrichment. GitHub file expansion is opt-in and keyed separately in the provider cache, so existing status-only consumers are unaffected. - Re-enables the pull-request serialization in the overview endpoint that was stubbed behind `NOTE:` markers in #121747. ## Stack 1. #121747 — endpoint core 2. **This PR** — SCM enrichment + endpoint wiring 3. #121749 — frontend UI ## Test Plan - Overview endpoint tests now cover pull requests, checks/review status, changed files, merged-PR fetch skipping, and provider-failure degradation. - `test_group_pull_requests`, `test_client`, and `test_pull_request_status` updated for the extracted batch module and file expansion.
96a7209 to
c08d22d
Compare
c08d22d to
3c1d04e
Compare
|
🚨 Warning: This pull request contains Frontend and Backend changes! It's discouraged to make changes to Sentry's Frontend and Backend in a single pull request. The Frontend and Backend are not atomically deployed. If the changes are interdependent of each other, they must be separated into two pull requests and be made forward or backwards compatible, such that the Backend or Frontend can be safely deployed independently. Have questions? Please ask in the |
c55cbae to
c5d0382
Compare
📊 Type Coverage Diff
🔍 1 new type safety issue introducedType assertions (
This is informational only and does not block the PR. |
c5d0382 to
e5ae9de
Compare
e5ae9de to
40f09c7
Compare
92831a7 to
b248daf
Compare
b248daf to
512fa99
Compare
Add the overview2 page that groups a project's autofix runs by the furthest milestone each reached. Runs load progressively with shimmer placeholders, can be sorted, and each linked pull request expands to show its changed files with on-demand diff hunks fetched from the pull-request-files endpoint.
512fa99 to
485fef3
Compare


Summary
The Autofix
overview2page and issue card. Each card shows the run's issue, root cause, proposed fix, and pull requests — with check status, review status, and changed files from the endpoint's SCM enrichment.The page loads progressively: a cheap Postgres-only request paints the cards immediately, then an
expand=scmInfo&expand=issueStatsrequest replaces the data with the enriched payload, with shimmer placeholders in the enriched slots until it resolves. If the enriched request fails, those slots degrade to empty rather than shimmering forever.Stacked on the backend enrichment work (PR #122105 — land that first). Because this PR currently targets
master, its diff includes the backend commits until #122105 merges.Review feedback folded in
seer-night-shift-uifeature so orgs without access issue no requests (query owner moved into a child mounted beneath<Feature>, mirroring v1).changeTypeis a precise typed union; the unused-export Knip failure is resolved; the invisible environment filter was removed.Test Plan
overview2/index.spec.tsxcovers the page and card: the access gate (zero requests when disabled), the two-request progressive load and shimmer, pull-request selection across mixed open/closed states, and changed-file semantics (includingnull/added/deleted).pnpm run typecheck,pnpm run lint:js, andpnpm run knippass.