Skip to content

[pull] master from getsentry:master#1835

Merged
pull[bot] merged 16 commits into
KingDEV95:masterfrom
getsentry:master
Mar 30, 2026
Merged

[pull] master from getsentry:master#1835
pull[bot] merged 16 commits into
KingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Mar 30, 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 : )

JonasBa and others added 16 commits March 30, 2026 10:36
…09360)

Completes the form migration started in the previous PR by replacing the
custom `formContext`-based form in `projectSampling` with
`useScrapsForm`.

**What changed:**

- `projectSampling.tsx` — replaces `useFormState`/`FormProvider` with
`useScrapsForm`. A `useEffect` on the query data mirrors the old
`enableReInitialize: true` behaviour, resetting the form (and
`savedProjectRates`) whenever server data arrives or changes.
Per-project rate validity is checked inline in the `AppField` render
prop to disable the Apply Changes button, since `z.record(z.string(),
z.string())` is used for the schema (type safety only — Zod's
`ZodEffects` chained on record values isn't assignable to
`FormValidateOrFn`).
- `projectsEditTable.tsx` — removes the `useFormField('projectRates')`
context consumer and instead receives `projectRates`,
`savedProjectRates`, and `onProjectRatesChange` as explicit props.
Per-project validation errors are now computed locally via
`getProjectRateErrors`, keeping the validation logic co-located with the
table that displays it.
- `utils/projectSamplingForm.tsx` — deleted.
- `utils/formContext.tsx` — deleted; this was the shared custom form
context, now fully unused.

Stacks on top of #109356.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Priscila Oliveira <priscila.oliveira@sentry.io>
The goal of this PR is to actually validate that the keys the user is
querying for actually exist in their projects. The problem with the
initial implementation is that it seems to have just checked to see if
the passed keys "fit" what an attribute key would look like and not if
it actually existed 🤦

To do this validation we check each of the different types (`boolean`,
`number`, and `string`) behind a thread pool kicking one RPC call for
each time to a max of 3 so that we can validate in parallel.

Also made some modifications to the endpoint:
- Added support for `statsPeriod` so we can search smaller time windows
and ensure that the attributes exist when the user thinks they should
- Moved `itemType` from the post body to a query param. It's not
something that we're validating against so i think it's better to live
in the query params.

---------

Co-authored-by: Claude Sonnet 4 <noreply@example.com>
Co-authored-by: OpenAI Codex <noreply@openai.com>
Co-authored-by: Claude Sonnet 4 <noreply@anthropic.com>
~Assigning this directory to `app-frontend`.~
~Not sure if it should go to @getsentry/design-engineering but i'll let
them give their input.~

@TkDodo agreed, and assigning this directory to the design-eng team.
Adding a flag in so that we can initially restrict calling the
validation before fully rolling this feature out.

Ticket: EXP-857
_"Why run many unit test when few do trick?"_ – Kevin Malone, Senior
Frontend Developer

Changes the Frontend > Jest jobs to use Jest's [`--changedSince`
option](https://jestjs.io/docs/cli#--changedsince) when possible. That
has them only run test suites that are impacted by the changes in a PR
based on the module dependency graph. Jest requires the commit history
since the base commit, so this adds a second _"run only necessary Jest
tests"_ flow in `frontend-optional.yml`. Specifically, that:

1. Increases the frontend-optional fetch-depth in PRs to `100`, which
should get most PRs' commits pretty quickly
2. Tries to compute a `MERGE_BASE` using `git merge-base`
* Note that this also clears `MERGE_BASE` if the PR touches any
non-`static/` files.
3. If `MERGE_BASE` could be computed, passes it as a process env var to
test scripts for use as Jest's `changedSince`
* If `MERGE_BASE` couldn't be computed, the new _"run only necessary
Jest tests"_ flow is skipped

My plan (thanks to reviewer feedback) is to keep this running as a
secondary, optional test flow on `master` for a couple weeks. If all
seems well, we can remove the original _"run all Jest tests"_ logic and
only run the _"run only necessary Jest tests"_ logic.

The following PRs exercise different scales of changes:

| PR | Source Files | Test Files | Interconnectivity | Ran Suites | /
1,881 suites |
|---|---|---|---|---|---|
| [#110624](#110624) | 0 | 1 |
⬜️ None | 1 | 0.05% |
| [#111073](#111073) | 0 | 6 |
⬜️ None | 6 | 0.32% |
| [#111122](#111122) | 0 | 100 |
⬜️ None | 100 | 5.3% |
| [#111074](#111074) | 1 | 0 | 🟦
Low | 5 | 0.27% |
| [#111075](#111075) | 4 | 0 | 🟦
Low | 7 | 0.37% |
| [#111076](#111076) | 3 | 3 | 🟦
Low | 13 | 0.69% |
| [#111110](#111110) | 20 | 20 |
🟦 Low | 74 | 3.9% |
| [#111111](#111111) | 100 | 100
| 🟦 Low | 196 | 10.4% |
| [#111119](#111119) | 1 | 1 | 🟨
Medium | 30 | 1.6% |
| [#111628](#111628) | 3 | 3 | 🟨
Medium | 78 | 4.1% |
| [#111629](#111629) | 10 | 10 |
🟨 Medium | 167 | 8.9% |
| [#111633](#111633) | 25 | 25 |
🟨 Medium | 227 | 12.1% |
| [#111652](#111652) | 100 | 100
| 🟨 Medium | 549 | 29.2% |
| [#111115](#111115) | 3 | 3 | 🟧
High | 1,652 | 87.8% |
| [#111083](#111083) | 20 | 20 |
🟧 High | 1,660 | 88.3% |
| [#111086](#111086) | 100 | 100
| 🟧 High | 1,721 | 91.5% |
| [#110568](#110568) | 0 | 0 | 🟥
Config (Full) | 1,881 | 100% |

For low-connectivity changes (isolated components, feature-specific
views), `--changedSince` provides pretty great savings: even 100
low-connectivity files only trigger ~10% of suites. Medium-connectivity
files still scale pretty well, with 100 files hitting ~29%.
High-connectivity files (widely-imported utils, core components) sadly
trigger 85-90% of suites, which is inevitable given Sentry's highly
connected module graph.

Fixes ENG-7103
…ker (#111639)

We don't want to trip the breaker when the proxied requests fail with
500s. We're mostly interested in preventing resource exhaustion from
slow requests/connection errors here.

Refs INFRENG-275
The metric selector was calling `scrollToIndex` whenever the focused
option changed. That caused the dropdown list to jump while hovering
items or moving through highlighted options.

Co-authored-by: GPT-5.4 <noreply@openai.com>
Fixing this three year old weakness
14a6b2c.
`had_release permission` was granting access if a user had any project
on a release, which was nasty for mutations where a member shouldn't be
able modify a release they don't have access to. We had a number of
downstream code vulnerability fixes that stemmed from this, but I'm
solving it upstream now.

Changes:
- `has_release_permission` Added `require_all_projects_param` with a
false default so it's backward compatible with the previous fixes
-- when true, checks against `request.access.has_projects_access()` 
- Org release details PUT/DELETE, release file details PT/DELETE,
release files POST, release assembly POST, and release deploys POST are
all happy
- bunch of regression tests

No changes to the read-only endpoints here nor artifactbundle assembly
which we recently added explicit project scoping to.
…111500)

## Summary
- Flip the early-return guard `if not artifact.commit_comparison:
return` into an `if artifact.commit_comparison: ... else: log` block
- Pure structural change — no behavior difference
- Prepares for a follow-up PR that adds logic to the else branch and
after the if/else block

## Test plan
- No-op refactor; existing tests pass unchanged

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
Update the stats page link in `MissingReplayAlert` from `/stats/` to
`/settings/stats/`.

The `navigation-sidebar-v2` feature flag has been GA'd and removed, but
this link was still pointing to the old `/stats/` route, causing
unnecessary redirects logged as `Unexpected navigation redirect` in
Sentry. The `last_known_route` was `/issues/:groupId/`, confirming users
hit this from the issue detail page.
Show the device authorization and verification URLs on the OAuth
application details page for public clients.

Public clients can use device flow today, but the settings UI only
exposes the authorize and token endpoints. This adds the static
device-flow URLs to the same credentials block so CLI and native app
setups do not need to bounce back to the auth docs.

This keeps the extra fields scoped to public apps and normalizes
`urlPrefix` before composing the OAuth URLs so copied values do not
contain duplicate slashes.
Bumps [orjson](https://github.com/ijl/orjson) from 3.10.10 to 3.11.6.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ijl/orjson/releases">orjson's
releases</a>.</em></p>
<blockquote>
<h2>3.11.6</h2>
<h3>Changed</h3>
<ul>
<li>orjson now includes code licensed under the Mozilla Public License
2.0 (MPL-2.0).</li>
<li>Drop support for Python 3.9.</li>
<li>ABI compatibility with CPython 3.15 alpha 5.</li>
<li>Build now depends on Rust 1.89 or later instead of 1.85.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix sporadic crash serializing deeply nested <code>list</code> of
<code>dict</code>.</li>
</ul>
<h2>3.11.5</h2>
<h3>Changed</h3>
<ul>
<li>Show simple error message instead of traceback when attempting to
build on unsupported Python versions.</li>
</ul>
<h2>3.11.4</h2>
<h3>Changed</h3>
<ul>
<li>ABI compatibility with CPython 3.15 alpha 1.</li>
<li>Publish PyPI wheels for 3.14 and manylinux i686, manylinux arm7,
manylinux ppc64le, manylinux s390x.</li>
<li>Build now requires a C compiler.</li>
</ul>
<h2>3.11.3</h2>
<h3>Fixed</h3>
<ul>
<li>Fix PyPI project metadata when using maturin 1.9.2 or later.</li>
</ul>
<h2>3.11.2</h2>
<h3>Fixed</h3>
<ul>
<li>Fix build using Rust 1.89 on amd64.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Build now depends on Rust 1.85 or later instead of 1.82.</li>
</ul>
<h2>3.11.1</h2>
<h3>Changed</h3>
<ul>
<li>Publish PyPI wheels for CPython 3.14.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix <code>str</code> on big-endian architectures.</li>
</ul>
<h2>3.11.0</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ijl/orjson/blob/master/CHANGELOG.md">orjson's
changelog</a>.</em></p>
<blockquote>
<h2>3.11.6 - 2026-01-29</h2>
<h3>Changed</h3>
<ul>
<li>orjson now includes code licensed under the Mozilla Public License
2.0 (MPL-2.0).</li>
<li>Drop support for Python 3.9.</li>
<li>ABI compatibility with CPython 3.15 alpha 5.</li>
<li>Build now depends on Rust 1.89 or later instead of 1.85.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix sporadic crash serializing deeply nested <code>list</code> of
<code>dict</code>.</li>
</ul>
<h2>3.11.5 - 2025-12-06</h2>
<h3>Changed</h3>
<ul>
<li>Show simple error message instead of traceback when attempting to
build on unsupported Python versions.</li>
</ul>
<h2>3.11.4 - 2025-10-24</h2>
<h3>Changed</h3>
<ul>
<li>ABI compatibility with CPython 3.15 alpha 1.</li>
<li>Publish PyPI wheels for 3.14 and manylinux i686, manylinux arm7,
manylinux ppc64le, manylinux s390x.</li>
<li>Build now requires a C compiler.</li>
</ul>
<h2>3.11.3 - 2025-08-26</h2>
<h3>Fixed</h3>
<ul>
<li>Fix PyPI project metadata when using maturin 1.9.2 or later.</li>
</ul>
<h2>3.11.2 - 2025-08-12</h2>
<h3>Fixed</h3>
<ul>
<li>Fix build using Rust 1.89 on amd64.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Build now depends on Rust 1.85 or later instead of 1.82.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/ijl/orjson/commit/ec02024c3837255064f248c0d2d331319b75e9ad"><code>ec02024</code></a>
3.11.6</li>
<li><a
href="https://github.com/ijl/orjson/commit/d58168733189f82b3fd0c058dff73e05d09202e6"><code>d581687</code></a>
build, clippy misc</li>
<li><a
href="https://github.com/ijl/orjson/commit/4105b29b2275f200f6fae01349bef02ccf1bc2e2"><code>4105b29</code></a>
writer::num</li>
<li><a
href="https://github.com/ijl/orjson/commit/62bb185b70785ded49c79c26f8c9781f1e6fe370"><code>62bb185</code></a>
Fix sporadic crash on serializing object close</li>
<li><a
href="https://github.com/ijl/orjson/commit/d860078a973f44401265c5c4ad12a7dbe4f839ad"><code>d860078</code></a>
PyRef idiom refactors</li>
<li><a
href="https://github.com/ijl/orjson/commit/343ae2f148197918aba9f8562db42c364620e4b8"><code>343ae2f</code></a>
Deserializer, Utf8Buffer</li>
<li><a
href="https://github.com/ijl/orjson/commit/7835f58d1c56947d1cf7a18acdfc07a2bca9b0f2"><code>7835f58</code></a>
PyBytesRef and other input refactor</li>
<li><a
href="https://github.com/ijl/orjson/commit/71e0516424ce1e11613eb1780f18e8cde83989fd"><code>71e0516</code></a>
PyStrRef</li>
<li><a
href="https://github.com/ijl/orjson/commit/1096df42dc585fde837ed0c930a346f5ef7dbb94"><code>1096df4</code></a>
MSRV 1.89</li>
<li><a
href="https://github.com/ijl/orjson/commit/b718e75b8ba18a707c2b44b6de14d52547573771"><code>b718e75</code></a>
Drop support for python3.9</li>
<li>Additional commits viewable in <a
href="https://github.com/ijl/orjson/compare/3.10.10...3.11.6">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=orjson&package-manager=uv&previous-version=3.10.10&new-version=3.11.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/getsentry/sentry/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: michelletran-sentry <167130096+michelletran-sentry@users.noreply.github.com>
## Summary
- Add `SeerExplorerOperator` class with `trigger_explorer()` method that
starts or continues Explorer runs via `SeerExplorerClient`, checking for
existing runs by category (e.g. Slack thread) and routing to
`continue_run()` or `start_run()` accordingly
- Handle errors through entrypoint callbacks
(`on_trigger_explorer_error`) and cache payload for the
`ExplorerOnCompletionHook` via `SeerOperatorExplorerCache`
- Add Explorer-specific interaction types (`OPERATOR_TRIGGER_EXPLORER`,
`ENTRYPOINT_ON_TRIGGER_EXPLORER`,
`ENTRYPOINT_CREATE_EXPLORER_CACHE_PAYLOAD`,
`ENTRYPOINT_ON_EXPLORER_UPDATE`) to `SeerOperatorInteractionType` for
metrics instrumentation
- Widen `SeerExplorerClient` and `collect_user_org_context` to accept
`RpcUser` in addition to `User`/`AnonymousUser`, enabling use from
cross-silo contexts like Slack
- Harden `SeerOperatorCompletionHook.execute()`: fetch-run-status errors
now log instead of aborting, add org-id mismatch guard on cache
payloads, and wrap `on_explorer_update` calls with per-entrypoint
lifecycle metrics

Refs ISWF-2022

---------

Co-authored-by: Leander Rodrigues <me@leander.xyz>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@example.com>
@pull pull Bot locked and limited conversation to collaborators Mar 30, 2026
@pull pull Bot added the ⤵️ pull label Mar 30, 2026
@pull pull Bot merged commit 1975bff into KingDEV95:master Mar 30, 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 30, 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.