Skip to content

[pull] master from getsentry:master#1809

Merged
pull[bot] merged 61 commits intoKingDEV95:masterfrom
getsentry:master
Mar 19, 2026
Merged

[pull] master from getsentry:master#1809
pull[bot] merged 61 commits intoKingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link

@pull pull bot commented Mar 19, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

rbro112 and others added 30 commits March 19, 2026 09:00
Updates frontend web snapshots to support grouping snapshots by describe
blocks. As an example from our `button.snapshots.tsx`

```
describe("Button", () => {
  describe.each(['light', 'dark'] as const)('%s', themeName => {
    it.snapshot.each<ButtonProps['priority']>([
      'default',
      'primary',
      'danger',
      'warning',
      'link',
      'transparent',
    ])(
      '%s',
      priority => (
        <ThemeProvider theme={themes[themeName]}>
          {/* Buttons need a bit of padding as rootElement.screenshot() clips to the
            element's CSS border-box. For buttons, box-shadows/outlines/focus rings
            extending outside #root get cut off. */}

          <div style={{padding: 8}}>
            <Button priority={priority}>{priority}</Button>
          </div>
        </ThemeProvider>
      ),
      priority => ({theme: themeName, priority: String(priority)})
    );
  });
})
```

Would group each button by “Button/${theme}” (so in practice, two
groups, Button/light and Button/dark), each
containing 6 variants - one for each button priority
Fix the `usePlatformizedView` query parameter to correctly return
`false` when set to `0`.

Previously, `?usePlatformizedView=0` would skip the early return and
fall through to the organization-level `hasPlatformizedInsights` check,
effectively ignoring the explicit opt-out. Now the hook checks for the
presence of the query param first, then evaluates its value.

This makes it easier to disable platformized insights to test
Looks like we're still using the URLs from the old navigation 
(`/alerts/`) and never updated to the new pathname `/issues/alerts`.
…ycle (#111024)

Adds `metrics.distribution` and `metrics.incr` instrumentation to the
snapshot upload endpoint and `compare_snapshots` task so the Preprod
Health dashboard can track snapshot usage and build quality signals.

## Metrics added

**On upload** (`ProjectPreprodSnapshotEndpoint.post`):

- `preprod.snapshots.upload.image_count` — number of images per upload,
tagged `has_vcs` to distinguish CI builds from standalone uploads
- `preprod.snapshots.upload.duplicate_image_file_names` — count of
`image_file_name` collisions within a single manifest (proxy for same
screen uploaded under multiple hashes)
- `preprod.snapshots.upload.bundles_per_commit` — how many snapshot
bundles have been uploaded for the same commit (only emitted when
`has_vcs=True`)

**On diff completion** (`compare_snapshots` task):

- `preprod.snapshots.diff.duration_s` — time from comparison record
creation to diff task completion
- `preprod.snapshots.e2e_duration_s` — time from artifact upload to diff
completion, mirrors the existing `preprod.size_analysis.results_e2e`
pattern
- `preprod.snapshots.image.avg_size_bytes` — average byte size of images
actually fetched for pixel diff (excludes added/removed)
- `preprod.snapshots.diff.zero_changes` — incremented when a diff
completes with no changed, added, or removed images

All metrics use `sample_rate=1.0`. No Amplitude analytics events are
included — this is Datadog/tracemetrics only, targeting the existing
Preprod Health dashboard.

---------

Co-authored-by: Claude <noreply@anthropic.com>
We've gotten the signal we need — 800k events every 5 minutes are
missing their trace_id.
…ompletion hook (#111059)

Updates dashboard generation on completion hook to also check artifact
result against dashboard serializer. If result fails validation, resumes
seer run with error information to regenerate dashboard.
This adds a new API to get a download repository URL. Note that GitHub
returns 302 with a presigned URL in the Location header whereas GitLab
streams the content directly. I believe we also need to supply an auth
header for GitLab as well (but havent confirmed yet).

This is needed to replicate behavior for [downloading a
repo](https://github.com/getsentry/seer/blob/main/src/seer/automation/codebase/repo_manager.py#L151-L162)
in Seer
…idgets (#111029)

`replay.id` and `profile.id` columns in dashboard table widgets rendered
as plain text instead of clickable links. This was because
`SPECIAL_FIELDS` in `fieldRenderers.tsx` only had a `replayId`
(camelCase) entry but no `replay.id` (dot notation), and the
`profile.id` entry rendered a shortened ID without a link.

Since `getFieldRenderer` checks `SPECIAL_FIELDS` first, fixing the
renderers there makes them work everywhere (dashboards, discover, etc.)
without needing to touch individual dataset configs.

- Added `replay.id` entry to `SPECIAL_FIELDS` that shares a
`renderReplayIdAsLink` helper with the existing `replayId` entry
- Updated `profile.id` entry to link to the profile flamechart page,
with a plaintext fallback when the project slug can't be resolved
- Added `project` column to prebuilt Web Vitals sample tables (LCP, INP,
CLS) so the profile renderer can resolve the project slug needed for the
link

Refs DAIN-1292

---------

Co-authored-by: Claude <noreply@anthropic.com>
… and repo selection (#110883)

## Summary

Implements the `SCM_CONNECT` onboarding step behind the
`organizations:onboarding-scm` feature flag. Functional-first -- UI
polish is out of scope.

## What it does

**Provider connection**
- Renders OAuth buttons for each SCM provider (GitHub, GitLab,
Bitbucket, Azure DevOps)
- Auto-selects an existing integration on mount so returning users skip
to the connected view
- Stores the `Integration` in `OnboardingContext.selectedIntegration`

**Repository selection**
- Debounced search dropdown querying `GET
/integrations/{id}/repos/?search=`
- Selecting a repo registers it in Sentry via `POST /repos/` (or looks
up the existing Sentry ID if already added)
- Switching repos cleans up the previously added one
- Removing a repo deletes it from Sentry if we added it during this
session
- Stores `Repository` (with real Sentry ID) in
`OnboardingContext.selectedRepository`
- Continue is disabled until a repo is selected

**PRD scenario alignment**
- Scenario A (new org): provider pills with OAuth
- Scenario B (existing SCM): auto-selects, shows connected view with
repo search
- Scenario D/E/F (add new org, switch provider, remove SCM): not
supported in onboarding per PRD, "Manage in Settings" link provided

**Skip and navigation**
- "Skip for now" advances to next step without SCM data
- Selections restore from context when navigating back

## Out of scope
- UI polish, animations, "Why connect" benefits card
- Repo relevance ordering
- Multiple simultaneous integrations
- Explicit error states for popup closed / OAuth failure

## New files
- `useScmProviders.ts` -- data-fetching hook for SCM providers and
active installations
- `components/scmProviderPills.tsx` -- OAuth provider pill buttons
- `components/scmConnectedView.tsx` -- connected status + "Manage in
Settings" link + repo selector
- `components/scmRepoSelector.tsx` -- repo search dropdown UI
- `components/useRepoSearch.ts` -- debounced provider repo search query
- `components/useRepoSelection.ts` -- repo add/remove lifecycle with
optimistic updates

## Test plan
- [x] 22 onboarding tests passing
- [x] Auto-selects existing integration and shows connected view
- [x] "Skip for now" advances to next step
- [x] Manual: OAuth flow connects provider and shows connected view
- [x] Manual: Repo search, selection, and removal work end-to-end
- [x] Manual: Switching repos cleans up the previously added one

Refs VDY-19

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
The rate limiter policy was wrong
A customer is hitting the limit here, so increasing this.
Implements double reads of occurrences from EAP for the errors query in
`src/sentry/snuba/trace.py`.
…110949)

Stacked on #110937.

The only place that renders tombstones is `groupTombstones.tsx`, so move
the tombstone title/message rendering there instead of routing it
through `GroupHeaderRow`. This removes `GroupTombstoneHelper` from the
prop types of `GroupHeaderRow`, `GroupTitle`, `EventMessage`, and
`createIssueLink`. Also removes the unused `data` prop from
`EventMessage`.

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…109106)

## Summary
- Moves the "Suggest Assertions" button from the form footer to the
verification section for better discoverability
- In the alerts form, the button sits next to the "Verification" heading
with the subtext, bottom-aligned
- In the detector form, the button is placed in the Section heading via
`trailingItems`
- Removes the button from `extraFooterButton` in both detector form
variants

## Screenshots

### Alerts form (`/alerts/new/uptime/`)

| Before | After |
|--------|-------|
|<img width="1400" height="900" alt="suggest-assertions-before-alerts"
src="https://github.com/user-attachments/assets/eff93df3-4452-44d4-a26f-db8693809cde"
/>|<img width="1400" height="900" alt="suggest-assertions-after-alerts"
src="https://github.com/user-attachments/assets/c11a1e55-d125-4040-864e-226567a668ac"
/>|

### Detector form (`/monitors/new/settings/`)

| Before | After |
|--------|-------|
|<img width="1400" height="900" alt="suggest-assertions-before-detector"
src="https://github.com/user-attachments/assets/8b70e61c-3d5b-46e6-842f-e49d9e9bec1d"
/>|<img width="1400" height="900"
alt="suggest-assertions-after-detector"
src="https://github.com/user-attachments/assets/c7725452-a270-4577-83d6-07e6188092e7"
/>|

## Test plan
- Verify the "Suggest Assertions" button appears in the verification
section (not footer) on both `/alerts/new/uptime/` and
`/monitors/create/`
- Verify the numbered list item "3. Verification" retains its number
- Verify the button opens the AI suggestion drawer when clicked
- `CI=true pnpm test
static/app/views/alerts/rules/uptime/uptimeAlertForm.spec.tsx`

Fixes NEW-763
Currently the add to dashboard flow from text widgets is throwing
errors. This PR fixes that. We can now add text widgets to other
dashboards (if people want to ig)

Closes
[DAIN-1322](https://linear.app/getsentry/issue/DAIN-1322/implement-add-to-dashboard-flow-for-text-widgets)
…ics (#111089)

Track how long React re-renders take in response to window resize events
on both the individual dashboard view and the manage dashboards page.

The existing `dashboards.widget.onEdit` metric (in `detail.tsx`) uses
the same `performance.now()` + `scheduleMicroTask` pattern to
approximate JS render cost. This PR applies the same approach to resize
events, which can be expensive as they trigger layout recalculations
across the widget grid.

Each sample is tagged with `page: 'dashboard'` or `page: 'manage'` so
the two pages can be compared independently in Sentry metrics.

Refs LINEAR-DAIN-1369

Co-authored-by: Shaun Kaasten <shaunk.kaasten@sentry.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
… used (#110954)

When testing, debugging, and analyzing perf impact, it's useful for us
to be able to tell which requests used legacy models both as a client
and via spans.
As we discussed with Salesforce, we need to have a staging Slack app in
order to get them to review our scope changes for Seer Explorer feature
in Slack.

This PR will add a feature flag to enable/disable staging app
installation flow

We also add options for the staging app's credentials.

a part of ISWF-2225
…ferent aggs (#111114)

Currently the logic for rendering the legends for tracemetrics is broken
because it can't match up the right y-axis to generate the label, so it
falls back to always showing the first aggregate (i.e. `aggregates[0]`).
So when you select multiple metrics, the legend and tooltips should show
the pretty labels and they should be distinct

I couldn't find a way to do this cleanly without special casing
tracemetrics since anything else would require generalizing formatters
and it's not usually necessary. We can consider it if there's time for
cleanup/it makes things easier to reason about.

Essentially, this PR changes the `yAxis` lookup to work with the
formatted series name, and formats the series name to push into the
label. I also changed the units and types to use `yAxis` because it's a
bit clearer with the aggregate lookup
…ndaryNavigation (#110824)

Consolidates draggable nav elements from explore, issues and dashboards
under common secondary nav primitives.

I will migrate away from reorder in a followup PR

Fix DE-583, DE-582, DE-590, DE-771

Ref DE-578

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
This adds in the steps to
1. ensure the org has configured billing for seer
2. ensure the org has configured a scm
3. ensure the project has linked a scm

| Seer Not Available Admin | Seer Not Available Member |
| ------------------------- | --------------------------- |
| <img width="640" height="604" alt="image"
src="https://github.com/user-attachments/assets/b2d05bde-c076-4d5e-88d2-a5fd4938642c"
/> | <img width="316" height="298" alt="Screenshot 2026-03-19 at 10 43
30 AM"
src="https://github.com/user-attachments/assets/a68d9927-801f-4948-81e9-109a6e7e5c5a"
/> |


| SCM Not Available for Organization | SCM Not Available for Project |
| ----------------------------------- | ----------------------------- |
| <img width="620" height="740" alt="image"
src="https://github.com/user-attachments/assets/41fca2f4-a4d2-48ea-b65b-3ab57c00e9ba"
/> | <img width="618" height="744" alt="image"
src="https://github.com/user-attachments/assets/49c2fb4d-85d8-47f3-877b-78178f26e267"
/> |
…11078)

Adds support for setting linkedDashboards on groupBy columns in
timeseries widgets when using breakdown legend type. Previously, linked
dashboards were only configurable for table widgets.

The timeseries visualization already rendered linked dashboard URLs in
the breakdown legend footer, but there was no way to configure them
through the widget builder for non-table widgets.

Changes:
- Add "Link field" button to groupBy selector rows (only visible when
legend type is breakdown and drilldown flows feature is enabled)
- Allow `SET_LINKED_DASHBOARDS` action for breakdown legend type in
addition to table display type
- Clear linkedDashboards when legend type changes away from breakdown
- Deduplicate linked dashboard entries when re-linking a field that
already has a linked dashboard
- Add `renderExtraActions` prop to `QueryField` and `GroupBySelector`
for extensibility

<img width="855" height="150" alt="image"
src="https://github.com/user-attachments/assets/5d526d5d-b7cb-4237-a37d-36e2512712e7"
/>
<img width="671" height="303" alt="image"
src="https://github.com/user-attachments/assets/7266a4e6-f0fe-434f-a926-85f02c09a26e"
/>
<img width="644" height="425" alt="image"
src="https://github.com/user-attachments/assets/f4b3f60f-7106-4f4f-a94b-85a7aef4c47b"
/>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@example.com>
…onId org fields (#111051)

Followup to #110548
Related to AIML-2604

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Zylphrex and others added 25 commits March 19, 2026 15:19
To have better loading states, this works with autofix sections instead
of autofix artifacts.
revives #110668

can do this safely now that there's a stub in
getsentry/getsentry#19619
The yAxis and the series name might differ, so just check the y-axis
again to be safe for metrics.

This regression was introduced when making the labels unique by changing
it to rely on the y-axis
…ent (#111131)

Replace the `renderExtraActions` render function prop on
`GroupBySelector` with a
`showDashboardLinkButton` boolean and a colocated
`LinkToDashboardAction` component.

Passing render functions as props causes unnecessary re-renders of
children because
a new function reference is created on every parent render. Using a
boolean prop with
a colocated component avoids this and simplifies the API — the caller no
longer needs
to know about the rendering details of the link button.

The `LinkToDashboardAction` component now lives in `groupBySelector.tsx`
alongside
`GroupBySelector` and accesses widget builder context via its own hooks.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@example.com>
…107785)

adds `get_thread_history()`, `set_thread_status()`,
`clear_thread_status()` methods to slackintegration with scope checking.
new installations can request extended scopes when
`slack.extended-scopes-enabled` option is enabled.

`get_thread_history()` will be used to gather the context to feed into
the Seer Explorer

this is done this way because of a few things:
- the current list is static, and when we roll new perms, it won't be
accurate
- we cant just update the static list after that date since existing
installs _wont_ have the perms till they upgrade
- this way we can set an option once our app gets re-approved to start
assuming the new perms on fresh installs if something is wrong about the
payload, but the best case we just use the scopes from the oauth
response

ive tested it locally and scoured, we don't currently use these scopes
for anything else.
Closes ISWF-2017
comes with a security fix and also upgrades to node24:
getsentry/action-github-app-token#105
)

Add explicit handling for `ApiForbiddenError` in the integration proxy
endpoint's
`handle_exception_with_details` method, following the same pattern
established in
#111030 for `ApiUnauthorized` and `ApiRateLimitedError`.

Previously, `ApiForbiddenError` exceptions fell through to the unknown
error handler,
which logs at warning level and delegates to the base class (returning
500). Now it
returns the correct 403 status with a dedicated `forbidden_error`
failure metric type
and info-level logging.


Agent transcript:
https://claudescope.sentry.dev/share/IV3nYCdnIAW35SRn4N0wnSGyQrw4sP8303Ea3PzRkjE
Autofix has a relevant_repos field which allows coding agent
integrations to run agents only in the required repositories instead of
all of the ones attached to the project. Explorer did not have that set
up.

Now the RootCauseArtifact returned by explorer has the field and it is
included in the prompt as a return. The repos provided to a coding agent
are now filtered by this return value. Tests have been added for this
filtering functionality.

I ran this locally and seemed to work with not all repos being returned,
but real test will be on prod with complex repos that have issues across
them etc.

**Would also be open to thoughts about whether we even want more than
one agent spawned at all... there is theoretically a use case, but is it
common enough to support?**

Also, claude currently has the ability to attach multiple repos through
mcp to one agent so we could pivot to do that, but neither of the other
integrations do at the moment so it would be a larger refactor.
This should be a clearer label

<img width="1091" height="187" alt="SCR-20260319-keus"
src="https://github.com/user-attachments/assets/685a69b6-a00f-489f-852e-d23cedac15ee"
/>
<img width="311" height="111" alt="SCR-20260319-ketw"
src="https://github.com/user-attachments/assets/6c8fd72d-98b1-429f-b73b-5c49927f3e8d"
/>
…pHashMetadata (#111047)

Use Seer's `model_used` response field to record what model Seer
actually used, separately from what we requested.

When Sentry calls Seer for similarity grouping,
`GroupHashMetadata.seer_model` was previously set from what Sentry
*requested*. If Seer internally falls back from v2 to v1, we had no
visibility into that. Seer now returns a `model_used` field in the
response — this PR consumes it.

- `seer_model` ← what Seer actually used (`model_used` from response,
falling back to the requested version)
- `seer_latest_training_model` ← what we sent (always the requested
version)

**Changes:**

- Add `model_used: NotRequired[str]` to
`SimilarIssuesEmbeddingsResponse`
- `get_similarity_data_from_seer` now returns
`tuple[list[SeerSimilarIssueData], str | None]`
- `get_seer_similar_issues` now returns a 3-tuple threading `model_used`
through
- `maybe_check_seer_for_matching_grouphash` sets `seer_model` from the
response value

Backward compatible: `model_used` is parsed with `.get()` defaulting to
`None`, and `seer_model_used or model_version.value` means behavior is
identical to today if the field is absent. No migration needed.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…reaches settled state + small fixes (#111138)

- Moves `validateDashboardAndRecordMetrics` to after polling has settled
to avoid reporting success/fail on dashboards that are still re
generating
- Adds an experimental badge to the Create dashboard with Seer button
- Fixes issue where seer session updated_at timestamp changes but status
remains complete not being handled correctly, causing loading state to
enter unexpected state
…tamp (#110504)

## Summary

- `datetime.replace()` returns a new object (datetime is immutable), but
the return value was discarded at line 220 of
`src/sentry/search/utils.py`
- Timezone-naive ISO 8601 strings (e.g., `"2024-01-01T00:00:00"`) were
parsed using the server's local timezone instead of UTC
- The correct pattern already exists at line 264 in the same file

## Fix

```diff
-        date.replace(tzinfo=timezone.utc)
+        date = date.replace(tzinfo=timezone.utc)
```

Fixes #110503

## Impact

- **UTC servers**: no visible change (coincidentally correct before)
- **Non-UTC servers** (local dev, on-premise): search queries with
timezone-naive timestamps will now correctly use UTC instead of the
server's local timezone

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Charlie Luo <cvxluo@gmail.com>
Fix typecheck errors introduced by the reland of monitor filters
(95e3ff4).

`FormContext` and `Section` are named exports but were imported as
default
exports in the mobile build detector form, causing three TypeScript
errors.


Agent transcript:
https://claudescope.sentry.dev/share/0f6OHlCAOh7GRffxn4UrfZPAgEjU-mIK3FCG-ksuJY0
## Summary

Refactors the `SeerEntrypoint` protocol into a layered hierarchy to
support both autofix and explorer workflows:

- **Split `SeerEntrypoint` into three protocols**: `SeerEntrypointCore`
(shared base), `SeerAutofixEntrypoint` (autofix lifecycle methods), and
`SeerExplorerEntrypoint` (explorer lifecycle methods — stub for now)
- **Renamed `entrypoint_registry` → `autofix_entrypoint_registry`** to
clarify it only holds autofix entrypoints
- **Extracted `has_seer_entrypoint_access`** from
`SeerOperator.has_access` into a standalone function so it can be reused
outside the operator
- **Updated `SlackEntrypoint`** and all references/tests to use the new
`SeerAutofixEntrypoint` protocol and renamed registry

Builds on #107785.

ISWF-2020
I think using `span.duration` instead of `span.self_time` for DB queries
is better for two reasons:

1. It's more semantically correct: since a DB query span represents a DB
query, the span's length represents the query's runtime, regardless of
any child spans.
2. `span.duration` is available on all spans, whereas `span.self_time`
is only available for spans that have gone through the span
buffer/segment enrichment during ingestion.

Changes all uses in the Queries and Query Summary dashboards, and the
Backend landing page's Queries widget.

See BROWSE-454.
…#111144)

This adds loading and error states so it doesn't just render nothing
when the artifact isn't ready yet.

| | Root Cause | Implementation Plan | Coding Changes | Pull Requests |
| --- | ------------ | -------------------- | ---------------- |
-------------- |
| loading | <img width="608" height="390" alt="image"
src="https://github.com/user-attachments/assets/7b50c9a7-8f8f-4f2b-8124-e2fa1af3c366"
/> | <img width="632" height="652" alt="image"
src="https://github.com/user-attachments/assets/1b2c457f-b91e-4dcf-a629-70d9966a56e5"
/> | <img width="630" height="820" alt="image"
src="https://github.com/user-attachments/assets/c6329cbd-eccd-428d-a198-7164baf57b4e"
/> | <img width="626" height="976" alt="image"
src="https://github.com/user-attachments/assets/4a938a4c-1dda-416e-89b1-39642b306989"
/> |
| no artifact | <img width="614" height="398" alt="image"
src="https://github.com/user-attachments/assets/b3d052b6-584d-4e45-8f48-92116614f607"
/> | <img width="624" height="678" alt="image"
src="https://github.com/user-attachments/assets/80cf0105-a8ad-4d1c-92c6-e417ee22a50d"
/> | <img width="624" height="838" alt="image"
src="https://github.com/user-attachments/assets/75335df2-02f0-4a36-ba9f-aa8646a14366"
/> | <img width="614" height="1010" alt="image"
src="https://github.com/user-attachments/assets/f00de129-62e7-4fd7-9268-0a4973ba4963"
/> |
Part of
https://linear.app/getsentry/issue/CW-1060/remove-sentryenable-pr-review-test-generation-option-values-from-db
Closes
https://linear.app/getsentry/issue/CW-1063/remove-enable-ai-code-review-toggle-fe
Blocks #111049

In the PR linked above we're swapping over to using the repository
settings as the source of truth for all users: seat based, beta, or
legacy. We no longer need this setting, and will remove that
"legacyseer" conditional to just route to the new settings page very
soon too.


Before
<img width="1643" height="540" alt="Screenshot 2026-03-18 at 4 28 05 PM"
src="https://github.com/user-attachments/assets/7bde033d-1770-4563-9aa3-2679518a615d"
/>

After
<img width="1459" height="601" alt="Screenshot 2026-03-18 at 4 26 25 PM"
src="https://github.com/user-attachments/assets/599c34fc-1ec1-49df-a8d7-928828ed2d4d"
/>


<!--

  Sentry employees and contractors can delete or ignore the following.

-->

### Legal Boilerplate

Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
…111082)

## Summary
- Remove the `organizations:autofix-send-code-mappings` feature flag
which has been GA'd at 100% rollout
- Make code mapping pre-resolution in autofix unconditional
- Companion PR in sentry-options-automator to remove the flagpole config

## Test plan
- [ ] CI passes
- [ ] Autofix continues to pre-resolve stacktrace frames without the
flag gate


Agent transcript:
https://claudescope.sentry.dev/share/SJ7h6lGgiDOdYm2_Zo758cttXdqQSx615lOoaFhA4aA
…1037)

Use fzf scoring to rank value combobox suggestions so that better
matches (e.g. prefix matches) appear before weaker ones when the user is
typing a filter value.

before

<img width="513" height="443" alt="Screenshot 2026-03-18 at 1 52 17 PM"
src="https://github.com/user-attachments/assets/4199a0d2-a1b7-4cb5-a49f-95a382102c4c"
/>

after

<img width="512" height="452" alt="Screenshot 2026-03-18 at 1 52 45 PM"
src="https://github.com/user-attachments/assets/54399d79-3268-41ee-855a-2d9a81bc1404"
/>

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…111049)

This PR does a couple things:

- Simplifies code review preflight to use RepositorySettings as the
source of truth across all eligible cohorts
- Removes backend exposure and handling of the deprecated org option
`sentry:enable_pr_review_test_generation`
- Updates related tests.

Higher level task:
https://linear.app/getsentry/issue/CW-1005/consolidate-seer-settings-product-experience-across-legacy-and-new

Depends on #111055 (removing FE
toggle)
Depends on getsentry/getsentry#19606 (backfill
repo settings rows)

Closes
https://linear.app/getsentry/issue/CW-1059/change-pointer-for-beta-orgs-to-look-at-repository-settings-rows
Relates to
https://linear.app/getsentry/issue/CW-1060/remove-sentryenable-pr-review-test-generation-option-values-from-db





<!--

  Sentry employees and contractors can delete or ignore the following.

-->

### Legal Boilerplate

Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
@pull pull bot locked and limited conversation to collaborators Mar 19, 2026
@pull pull bot added the ⤵️ pull label Mar 19, 2026
@pull pull bot merged commit 5147596 into KingDEV95:master Mar 19, 2026
@github-actions github-actions bot added Scope: Frontend Automatically applied to PRs that change frontend components Scope: Backend Automatically applied to PRs that change backend components labels Mar 19, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

⤵️ pull Scope: Backend Automatically applied to PRs that change backend components Scope: Frontend Automatically applied to PRs that change frontend components

Projects

None yet

Development

Successfully merging this pull request may close these issues.