Skip to content

[pull] master from getsentry:master#2004

Merged
pull[bot] merged 38 commits into
KingDEV95:masterfrom
getsentry:master
May 27, 2026
Merged

[pull] master from getsentry:master#2004
pull[bot] merged 38 commits into
KingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 27, 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 : )

untitaker and others added 30 commits May 27, 2026 18:01
…6293)

## Summary
- Pass bytes directly to tasks instead of base64-encoding, now that
taskbroker uses msgpack
- `assemble_download`: `page_token` now accepts `bytes | str`
- `fulfill_cross_region_export_request`: `encrypt_with_public_key` now
accepts `bytes | str`
- Both handle legacy base64 strings for backwards compatibility

Follow-up to #115069 which did the same for `process_profile_task`.

ref STREAM-1011
This PR refactors the `IssueDiff` component's event data fetching logic.

Previously, the component used multiple `useQuery` hooks to sequentially
fetch 'latest' event IDs and then the full event data. This created a
complex asynchronous chain that could lead to flaky tests, specifically
`JEST-21V8: TestingLibraryElementError: Unable to find an element by:
[data-test-id="split-diff"]`, where the `SplitDiff` component was not
rendered within the test timeout.

This change consolidates the data fetching into a single `useQueries`
call. It leverages `skipToken` for conditional fetching and the
`combine` function to process the results and compute the combined
stacktraces. This approach simplifies the component's data fetching
logic, making it more robust and easier to reason about, which should
also contribute to more stable test execution.

Related to JEST-21V8

---------

Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Ryan Albrecht <ryan@ryanalbrecht.ca>
Co-authored-by: Ryan Albrecht <ryan.albrecht@sentry.io>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
The GET handler for the codeowners endpoint looked up
RepositoryProjectPathConfig by config id and organization only. The
sibling PUT and DELETE handlers on the code-mapping details endpoint
gate on project access; this brings the GET path in line with that
behaviour.

Also moves the test file to the canonical mirror path under
tests/sentry/integrations/api/endpoints/ to match the source module
location, and consolidates the two test classes into one following the
pattern established by the sibling endpoint tests.

<!-- Describe your PR here. -->

<!--

  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.

Co-authored-by: Claude Sonnet 4 <noreply@anthropic.com>
now that ai issue detection is GA, updating the badge from beta to new
…116196)

Prioritize bookmarked projects over membership status in our project
page filter sort

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add a `shuffle` parameter to `CursoredScheduler` that randomizes the PK
processing order at cycle start. Defaults to `False` for backward
compatibility.

The CursoredScheduler currently always processes items in ascending PK
order.
When items have varying processing yield, this creates a deterministic
pattern of peaks and
dips that repeats every cycle. Shuffling distributes high-yield items
randomly
across the cycle, smoothing throughput over time.
Move all custom metadata (theme, variant, size, state, etc.) from flat
top-level keys into a structured `tags: Record<string, string>` field
across all 14 snapshot test files. This makes snapshot properties
filterable and queryable on the product side without relying on `extra =
"allow"` passthrough fields.

**Framework type changes**

`SnapshotTestMetadata` replaces the previous `Record<string, string>`
parameter on `it.snapshot()` and `it.snapshot.each()`. The new type
restricts metadata to three keys: `group`, `display_name`, and `tags`.
The `SnapshotImageMetadata` output interface gains a matching `tags`
field. No backend changes needed — `ImageMetadata` in `manifest.py`
already has `tags: dict[str, str] | None` with coercion.

**Per-file tag mapping**

Every snapshot test now passes an explicit `tags` object containing the
relevant axes for that component — `theme` is universal,
`size`/`variant`/`state` vary by file. An `area` tag distinguishes core
design system primitives (`core`) from product-side snapshot UI
(`snapshots`). Three files (checkbox, radio, switch) that previously had
no metadata now gain tags for the first time.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…eature flag (#116189)

## Summary
- Registers `organizations:onboarding-scm-project-creation-experiment`
in `temporary.py` for the SCM-first project creation wizard A/B test.
- Uses `FLAGPOLE` handler with `api_expose=True` so the frontend can
read it via `useExperiment()` to gate the new wizard against the legacy
`createProject.tsx` form.

Companion PR in sentry-options-automator:
getsentry/sentry-options-automator#7930

Refs VDY-73

## Test plan
- [ ] Verify flag is accessible via the org serializer
- [ ] Confirm experiment assignment works with `useExperiment()` hook
once the wizard scaffold (VDY-73 follow-up) lands
)

This fixes y-axis formatting for all charts but it was a needed fix for
heat maps. Initially the y-axis would preserve decimal points up to 20
spaces (that's way too much) and it would take up so much space on the
chart. This is especially seen with the logarithmic heat maps y-axis.
I've changed this to use the default in
`formatNumberWithDynamicDecimalPoints` or 4 decimal points in really
small numbers. This way the y-axis values are shown with enough detail
but don't take up a big chunk of space.

| Before | After |
|--------|--------|
| <img width="620" height="432" alt="image"
src="https://github.com/user-attachments/assets/c575ce9b-e000-4241-9b10-04350142ba9c"
/> | <img width="616" height="438" alt="image"
src="https://github.com/user-attachments/assets/313a462b-b6a6-4985-bce2-29bbc783f3a6"
/> |
This makes a few small changes to the `SafeRolloutComparator` code.

- For the initial round of span-first detector testing, only the comparison part of the comparator is needed. This therefore splits the `check` part of `check_and_choose` off into its own `compare` method. 

- In cases where only the comparison is being used, it's not accurate to say that either the experimental or control data is being used. Therefore, "both" and "neither" have been added as allowable `source_of_truth` tag values, to account for (as the names would suggest) both results being used or both results being discarded.

- Finally, now that it's part of the `compare` method rather than the `check_and_choose` method, for new comparators the `SafeRolloutComparator.check_and_choose` metric has been renamed to `SafeRolloutComparator.compare`. (The one existing comparator now has a flag which preserves the old behavior, so as not to break existing dashboards.)

h/t Claude for his help with parts of these changes
…115639)

## TL;DR

Decouples the four SCM onboarding step components from
`OnboardingContext` so they accept all flow state via props. Adapter
wrappers in `onboarding.tsx` source those props from context, preserving
today's behavior. Unblocks the project creation variant of SCM
onboarding.

---

Refactor `ScmConnect`, `ScmPlatformFeatures`, `ScmProjectDetails`, and
`ScmRepoSelector` to read and write all flow state via props. Three
adapter wrappers in `onboarding.tsx` (`ScmConnectAdapter`,
`ScmPlatformFeaturesAdapter`, `ScmProjectDetailsAdapter`) source those
props from `OnboardingContext`, preserving today's behavior.

This unblocks the project creation variant of SCM onboarding (VDY-73
through VDY-78), which needs the same components driven from local
wizard state instead of session-storage-backed context.

`clearDerivedState` moves out of `ScmRepoSelector` and into the
onboarding adapter so callers in other flows can pick their own
invalidation strategy. `ProjectDetailsFormState` is now exported from
`onboardingContext` so the project-details prop interface can name it.

Alternative considered: a shared `ScmFlowContext` that both flows would
populate. Rejected for two-consumer scope because it reintroduces a
provider wrapper in tests (the simplification this PR delivers) and adds
an abstraction layer with marginal payoff at this size.

Supersedes #112948.

Refs VDY-72
…16316)

Add `github_enterprise` to the list of providers that use the new
API-driven pipeline modal instead of the legacy popup-based flow.
…ization (#116322)

logger.error() in _serialize_rpc_issue causes Sentry to capture these as
error events (~14K/day), but a deleted/merged group during trace
rendering is an expected race condition. The function already handles
this gracefully by returning None. Downgrade to logger.info to stop
generating noise.

Fixes SENTRY-5KWJ
Limited-access flag registered Aug 2024, never GA'd (~22 months). Remove
the flag and its MRI alert gating from charts.py and
snuba_query_validator.py. The custom-metrics flag still gates MRI access
where needed.
- This endpoint was defaulting to all time so queries were commonly
timing out, add our usual snuba params style timestamps along with a
trace style timestamp parameter with a buffer
…#116319)

Move project access control in the latest-base-snapshot endpoint from a
post-fetch check to a queryset-level filter. The old approach picked the
globally latest artifact, then returned 404 if the user lacked access to
its project — even when older, accessible artifacts existed. The new
approach filters the queryset upfront using
`request.access.accessible_project_ids`, so the query returns the latest
artifact the user can actually see.

Also adds an explicit `project__status=ObjectStatus.ACTIVE` filter to
the base queryset so inactive/deleted projects are excluded for all
users, including staff and global-access roles. This preserves the
status check that the old `has_project_access()` call performed.

Staff and `has_global_access` users (superusers, org owners) bypass the
project-id filter entirely, keeping their existing behavior intact.

Co-authored-by: Claude <noreply@anthropic.com>
Legacy user feedback is the last place using ActivityItem. This moves
the markup and styles into the component so it owns the avatar + speech
bubble layout locally.

Types event.userReport and hides email when it is the same as the
display name.

Redash query where you can find issues that use legacy user feedback
https://redash.getsentry.net/queries/11330/source

New story for component 

<img width="917" height="302" alt="image"
src="https://github.com/user-attachments/assets/e16379bc-364c-40b5-9fb8-15c2432fbc77"
/>
Activity notes and the note preview were still using MarkedText with
local markdown styles layered on top. This swaps both to the core
Markdown component and lets it own the rendered markdown styling.

Only real functional change is internal links (missing https://) are no
longer allowed, which i think is fine.

before

<img width="396" height="267" alt="image"
src="https://github.com/user-attachments/assets/db1bbca4-cea5-45ea-a721-82cade2f4681"
/>


after

<img width="353" height="181" alt="image"
src="https://github.com/user-attachments/assets/66a8a4a3-ee85-496a-b599-0e1a14d56c3d"
/>
…ers (#116323)

Fixed 2 vulns:
- Use hashed token lookup in `/oauth/userinfo` endpoint. The endpoint
was looking up tokens by plaintext column only, diverging from the
standard hash-first path used everywhere else. Switch to `hashed_token`
lookup with plaintext fallback and migration, matching
`UserAuthTokenAuthentication._find_or_update_token_by_hash`.
- Reject tokens for inactive/suspended users and disabled apps in
'/oauth/userinfo`. The endpoint was missing is_active checks that the
standard `UserAuthTokenAuthentication` path enforces. Tokens belonging
to deactivated users or disabled OAuth applications now return 401.

---------

Co-authored-by: Claude <noreply@anthropic.com>
…116325)

The skip_field_validation_for_entity_subscription_deletion flag was
added to bypass query validation during subscription deletion, but it
only covered default_filter_converter. The resolve_tag_key method was
still raising IncompatibleMetricsQuery for tags not in
default_metric_tags (e.g. http.url), causing deletion to fail.

Fixes SENTRY-5HAG
… Server integration setup (#116295)

Implement `get_pipeline_api_steps()` on
`BitbucketServerIntegrationProvider` with two steps: installation config
(validates URL, RSA private key, and consumer key length, then fetches
an OAuth 1.0a request token from the Bitbucket Server instance), and an
OAuth callback step that builds the authorize URL from the request token
and exchanges the callback's `oauth_token` (used by Bitbucket Server as
the verifier) for an access token.

Legacy `InstallationConfigView`, `OAuthLoginView`, and
`OAuthCallbackView` remain in place so in-flight installs can complete
via the existing flow; they will be removed in a follow-up
([VDY-103](https://linear.app/getsentry/issue/VDY-103/remove-legacy-bitbucket-server-integration-setup-views))
once the API flow has been validated in production.

Ref
[VDY-99](https://linear.app/getsentry/issue/VDY-99/bitbucket-server-api-driven-integration-setup)
…116327)

Resolves ISWF-2751

It's simple enough to use the paginated endpoint, but let's make sure it
works before turning it on for all customers.
…ver integration setup (#116294)

Register Bitbucket Server in the pipeline registry with two steps: an
installation config form (URL, consumer key, RSA private key, SSL
toggle) and a popup-based OAuth 1.0a authorization step using
`useRedirectPopupStep`. Unlike OAuth 2.0 providers, the Bitbucket Server
callback returns an `oauth_token` (used as the verifier), which the
frontend relays to the backend as `oauthToken`.

Ref
[VDY-99](https://linear.app/getsentry/issue/VDY-99/bitbucket-server-api-driven-integration-setup)
There are no in progress plan migrations and any new migrations would
need to be done on the billing platform, so we are deleting the legacy
plan migration API and this frontend that used it
…#115937)

The org listing endpoint returns the smaller OrganizationSummary type
not the full Organization. OrganizationSummary is a strict subset of
organization and does not include a number of fields, such as `features`
(as these can no longer be returned from the control silo).

Since `features` is not present on OrganizationSummary, this change
unconditionally shows every category on the notifications list page, and
doesn't hide any. This seems the safer direction to go, as the
notificationSettingsByType component is primarily just a list of links
-- the actual orgs that the change would be applied to is configured on
the linked view.

The exception to this pattern is self-hosted. This follows the pattern
in #115829 which hid the `quota`
entry from the notification settings index on self-hosted. This PR adds
the same `isSelfHosted` gate so a direct link to the quota page returns
null on self-hosted instead of rendering categories that don't apply.
tnt-sentry and others added 8 commits May 27, 2026 16:23
…#116193)

Closes [SCM-112](https://linear.app/getsentry/issue/SCM-112).

Adds GitHub Enterprise support to Sentry's SCM Platform RPC server so
seer's \`ScmRepoClient\` proxy path can construct a working
\`GitHubProvider\` for \`github_enterprise\` integrations.
…16306)

We were not checking the `alerts:write` permission on the frontend on
both the alerts list and details pages, so users in orgs with that
setting disabled were able to attempt to create/edit alerts but would
eventually get rejected by the form.

This PR disables those buttons with an explanatory tooltip in all
locations where a user can create/edit alerts.

<img width="304" height="173" alt="CleanShot 2026-05-26 at 16 54 50"
src="https://github.com/user-attachments/assets/82639bf4-5caf-4ec1-a615-81909db48b09"
/>
<img width="238" height="164" alt="CleanShot 2026-05-26 at 16 54 44"
src="https://github.com/user-attachments/assets/a5cf6900-4555-4bed-8626-def465132510"
/>
Called it `WorkflowActivityRegistry` instead of `GroupActivityRegistry`,
not sure if the other is preferred, let me know.

Added some basic tests and a todo for the member I'll add later.
Previously, legacy autofix agent would read the preferences to decide a
stopping point for automated runs without a stopping point. The seer
agent doesnt do that so to fix it, we can just pass the stopping point
from the beginning to avoid another fetch.

See
https://github.com/getsentry/seer/blob/67e6c232f708a03b59b4cab09381668ae5eb92b9/src/seer/automation/autofix/tasks.py#L145-L148

---------

Co-authored-by: Claude <noreply@anthropic.com>
we aren't using this here right now, but it's required for
getsentry/getsentry#20354
Skip `option.seen` audit logs when running with `DEBUG` enabled so local
mypy and process output is not flooded by option reads. Non-debug
environments still emit the audit log for production visibility.

---------

Co-authored-by: OpenAI Codex <codex@openai.com>
…116338)

Follow up on #116263. Log the
throttled threshold when we get a 429 response due to throttling from
snuba.

Co-authored-by: Claude <noreply@anthropic.com>
… with a project (#116239)

If we're moving a Workflow to a new organization, we need to make sure
the associated Environment is updated to one in that org.

Fixes ISWF-2687.
@pull pull Bot locked and limited conversation to collaborators May 27, 2026
@pull pull Bot added the ⤵️ pull label May 27, 2026
@pull pull Bot merged commit f5603c7 into KingDEV95:master May 27, 2026
4 of 7 checks passed
@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 May 27, 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.