Skip to content

[pull] master from getsentry:master#1819

Merged
pull[bot] merged 18 commits intoKingDEV95:masterfrom
getsentry:master
Mar 24, 2026
Merged

[pull] master from getsentry:master#1819
pull[bot] merged 18 commits intoKingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link

@pull pull bot commented Mar 24, 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 : )

obostjancic and others added 18 commits March 24, 2026 11:26
…on page (#111204)

for forms where we stay on the same page (no modals that close, no
redirects), we should reset the form after the source of `defaultValues`
(usually a query or a store) has been updated.

while the defaultValues are reactive by themselves, they only get
applied if the form is `pristine`. That means the `value` won’t change.
Now that might not be a problem if the server returns the same values,
but if it doesn’t, we’d want to see the server values here.

I’ve simulated this in the story where the mutation returns the input as
`toUpperCase()`, so that we can see what’s happening.

This also means if you only make a mutation and forget to update the
query, or if you don’t return the invalidation from the mutation, the
values will “flicker” back to the old initial state. This is intended
because it serves as a reminder that the corresponding query / store
needs to be updated.

For AutoSaveForms, we’re doing this internally.

Note: The reset is timing sensitive. If it happens too early, there will
be a flash of old initialData briefly. That’s why this PR is dependent
upon:

- #111187
…1141)

Add `maybe_emit_issues_from_size_results` so that "absolute" threshold
detectors fire as soon as a single build's size metrics are committed,
without waiting for a comparison against a base artifact.

Previously, all issue emission went through the comparison path
(`maybe_emit_issues`), which requires both head and base artifacts. This
meant absolute detectors — which only need one build's size — couldn't
fire until a comparison happened. Now:

- The **single-build path** (called after metrics commit in
`_assemble_preprod_artifact_size_analysis`) processes only
`threshold_type == "absolute"` detectors
- The **comparison path** (`_maybe_emit_issues`) processes only
`threshold_type in ("absolute_diff", "relative_diff")` detectors
- `SizeAnalysisMetadata` base fields (`base_metric_id`,
`base_artifact_id`, `base_artifact`) are now `NotRequired`, and
`create_occurrence` conditionally populates base-related evidence and
tags


Agent transcript:
https://claudescope.sentry.dev/share/UgFhB6vtmF1RiOVM-Ble2aoN68w7YgfkO_BzAXfdxnE
…stem (#109325)

Migrates `samplingModeSwitchModal.tsx` from the custom
`createForm`/`FormProvider`/`useFormState`/`useFormField` system to the
new `useScrapsForm`-based form system.

The custom form context (`organizationSamplingForm`) is replaced with a
Zod schema and `useScrapsForm`. Field layout and error display is now
handled automatically by `field.Layout.Stack` instead of a manually
wired `FieldGroup` and styled `ErrorMessage` component. The
`TargetRateInput` subcomponent is inlined into the modal body as a
`form.AppField`. The submit button becomes `form.SubmitButton` which
handles disabled-during-submission state natively.

Part of the broader effort to migrate dynamic sampling forms off the
legacy form system.

ref DE-949

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Priscila Oliveira <priscila.oliveira@sentry.io>
)

Replaces the `CompactSelect` in `AggregateDropdown` with
`CompositeSelect`, where each option group gets its own `Region`. This
removes the manual `findGroupKey` helper and the hand-rolled cross-group
filtering logic that lived in the `onChange` handler.

**Group modes:**
- `percentiles` and `stats` → multi-select regions (users commonly
compare e.g. p50 + p75 + p90)
- `rate` and `math` → single-select regions

Cross-group enforcement is now automatic: `handleChange` always replaces
the full `visualizes` array, so selecting from a new group clears the
previous group's selections on re-render without any explicit filtering.

The trigger label is manually constructed to match `CompactSelect`'s
built-in behaviour — first selected name in a `TriggerLabel` span, with
a muted `+N` badge when more than one aggregate is active
(`CompositeSelect` does not inject a trigger label the way
`CompactSelect` does).

Ticket: LOGS-628

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4 <noreply@example.com>
…ew (#111302)

Set a performance.mark on click, then measure the duration in
dataWidgetViewerModal on mount — emitting a
`dashboards.widget.onFullScreenView` distribution metric.

Prebuilt insights dashboards (no dashboard ID) are not included for
measurement.

Refs DAIN-1371

<!-- 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@example.com>
Colton, I was double-checking why you said that initializing the SCM
Facade in its `__init__` method did not work, which I felt could be
hiding something more serious.

My conclusion is that you observed that behavior on an intermediate
version of #111113, when `_facade_type_for_provider_class` was returning
a subclass of `Facade`. You then fixed the main issue by making it
return a subclass of `cls`, but did not realize this allowed moving the
initialization back to `__init__`.

I did that, and added a test.

Reference:
[`object.__new__`](https://docs.python.org/3/reference/datamodel.html#object.__new__)
and
[`object.__init__`](https://docs.python.org/3/reference/datamodel.html#object.__init__).
This exposes the capabilities of a given provider through the SCM RPC.
It's used in getsentry/seer#5393.
@jaydgoss hit an [interesting type
issue](#111160 (comment))
in #111160

The gist is `SVGIconProps` extends `React.SVGAttributes<SVGSVGElement>`
which [includes `type:
string`](https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Attribute/type),
but that's not actually valid for the root `<svg>` of our icon
component.

By omitting `type` from `SVGIconProps`, `IconGraphProps` no longer
narrows the `type: string` prop, so `type` becomes a new optional prop.
The eliminates the variance conflict, so `ComponentType<IconGraph>`
should be directly assignable to `SVGIconProps`.
…111356)

This updates the total count shown in confidence footers to query for
_all_ metrics using `metric.name`, `metric.type`, and `metric.unit`
filters so we can show a count in widgets with multiple metrics. Since
metrics aren't sampled server side, I'm using a normal mode query which
may hit a downsampled tier, and then using `serverOnly` extrapolation to
ONLY factor in server side sampling. Since we don't do server-side
sampling, this effectively returns to us an approximation of the total
count of stored data for the metrics.

I also refactor the way that the explore page queries to fit this new
way of querying metrics total counts. Ultimately, I should update the
confidence footer so if the `totalCount` results are approximated (i.e.
they didn't hit tier 1), the footer should say "Estimating results from
X samples from approximately Y data points" but I'm going to punt that
for a future PR. This number is not fully accurate, but the confidence
footer just gives estimates anyways.
Explorer autofix is a complete rewrite of the legacy autofix meaning
that we cannot continue using the same columns to track when autofix was
last run. This is because the run states are not backwards compatible
and will need to be re-run again. By adding this new column, we can have
automations use check this instead for the new autofix runs.
…d) (#111127)

Remove the \`organizations:chart-legend-component\` flag declaration
from \`src/sentry/features/temporary.py\`. The flag is fully rolled out
to GA.

Frontend (code cleanup): #111126
sentry-options-automator (flagpole definition removal):
getsentry/sentry-options-automator#6894

Co-authored-by: Claude <noreply@anthropic.com>
… member projects (#111329)

<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
## Problem
When a user has no member projects (their team doesn't own/belong to any
projects) and the URL contains `project=-1` (All Projects sentinel), the
project filter trigger was incorrectly displaying a project count or
enumerated list instead of the "All Projects" label.

## Root Cause
1. The URL parameter `-1` (ALL_ACCESS_PROJECTS) gets expanded internally
to all individual project IDs
2. The trigger's `isAllProjectsSelected` logic was checking if both
`isMyProjectsSelected` AND `isNonMemberProjectsSelected` were true
3. `isMyProjectsSelected` requires `memberProjects.length > 0` to be
true
4. When a user has no member projects, this check fails even though all
projects are selected

## Solution
Updated the logic in `projectPageFilterTrigger.tsx` to directly check if
the `value` array contains all project IDs, regardless of the
member/non-member split. This correctly handles the edge case.

## Changes
- Modified `ProjectPageFilterTrigger` to use a `containsAllProjects`
check that verifies all project IDs are present in the value array
- Added test cases to cover users with no member projects
- Removed unused `isNonMemberProjectsSelected` variable

## Testing
- Added two new test cases in `projectPageFilter.spec.tsx`:
- Verifies "All Projects" label is shown when URL has -1 and user has no
member projects
- Verifies "All Projects" label is shown when URL is empty (defaults to
all) and user has no member projects
- All pre-commit hooks pass

Fixes the issue described in the Slack thread where the UI was showing a
count instead of "All Projects" for users without member projects.
<!-- CURSOR_AGENT_PR_BODY_END -->

[Slack
Thread](https://sentry.slack.com/archives/C087YQX2WH2/p1774289802943719?thread_ts=1774289802.943719&cid=C087YQX2WH2)

<div><a
href="https://cursor.com/agents/bc-43fbb420-88f9-59f3-b0cd-91f5299804e0"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-web-light.png"><img
alt="Open in Web" width="114" height="28"
src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a
href="https://cursor.com/background-agent?bcId=bc-43fbb420-88f9-59f3-b0cd-91f5299804e0"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img
alt="Open in Cursor" width="131" height="28"
src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Jonas <JonasBa@users.noreply.github.com>
Make `head.artifact_id` and `base.artifact_id` tags clickable on the
issue detail page, linking to the preprod size build detail page
(`/preprod/size/{id}/`).

These tags were added in #110854 but rendered as plain text. This adds
them to the existing tag-key switch in `EventTagsTreeValue`, following
the same `Link` + `TagLinkText` pattern used by `transaction` and
`replayId` tags. Uses the existing `getSizeBuildPath` utility.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Disables widgets from lazy loading when viewing an ai generated
dashboard preview. This is to reduce issues with new widgets being
inserted during generation but not loading due to lazy load. Also makes
it easier to detect failed queries by loading all widgets.
@pull pull bot locked and limited conversation to collaborators Mar 24, 2026
@pull pull bot added the ⤵️ pull label Mar 24, 2026
@pull pull bot merged commit 341730a into KingDEV95:master Mar 24, 2026
27 of 39 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 Mar 24, 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.