Skip to content

[pull] master from getsentry:master#1840

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

[pull] master from getsentry:master#1840
pull[bot] merged 51 commits into
KingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link
Copy Markdown

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

swartzrock and others added 30 commits March 31, 2026 09:09
…111869)

When the task tries to delete sentry_environment rows, Django's cascade
sees that workflow_engine_workflow rows still reference them. It tries
to cascade-delete those workflows in Python — but those rows haven't
gone through their own proper deletion task yet, and if Workflow has any
child relations or outbox requirements, the inline cascade may fail or
leave orphans.

This is a deletion ordering bug introduced when Workflow was added to
the org deletion task. Workflow should be appended before Environment in
the relation list, not after. Since it has an FK pointing at
Environment, it needs to be cleaned up first.

Fixed by moving the Workflow relation earlier in get_child_relations,
before Environment.

## Investigation

I ran a query for child rows of an organization that was failing to
delete, and `Environment` was the top in the list that still had
undeleted rows. This indicated a dependent table that was not getting
rows related to this Organization removed.

table_name | row_count 
-- | -- 
sentry_externalissue | 748   
sentry_promptsactivity | 183   
sentry_environment | 177 
workflow_engine_workflow | 9 
sentry_dashboard | 9 
sentry_discoversavedquery | 7
…on (#110619)

Use `get_from_cache` instead of a direct database `get` when looking up
a Group by ID during event ingestion in `handle_existing_grouphash()`.

This is the hottest query path in event ingestion — every event that
matches an existing group (the vast majority) executes `SELECT * FROM
sentry_groupedmessage WHERE id = ? LIMIT ?` directly against the
database. Switching to `get_from_cache` serves this from Django's cache
layer first, only falling back to the database on a miss. Popular groups
receiving many events will see a high cache hit rate.

---------

Co-authored-by: Claude Opus 4.6 <noreply@example.com>
The AdminRecordUsageEndpoint that this UI calls is being removed from
getsentry as part of the billing platform migration.
…olumn (#111885)

Show a yellow star icon as the column header for
`is_starred_transaction`
in dashboard widget tables instead of the raw field name. The icon
matches
the star used in the insights overview tables.

- Render `<IconStar>` in the table widget header when
`is_starred_transaction`
  is present and no field alias overrides it
- Right-align the column via `fieldAlignment`
- Disable sorting on the column since it's always a forced primary sort

Refs LINEAR-DAIN-1437

<img width="496" height="316" alt="image"
src="https://github.com/user-attachments/assets/6c058d91-41a2-489c-97dd-1691515979c9"
/>

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…ions (#111890)

## Summary
- Update `GithubCopilotTask`, `GithubCopilotSession`, and related models
to match the current live GitHub Copilot Tasks API response shape
- `creator_id`/`owner_id` (int) → `creator`/`owner` (object with `id`
field)
- `last_updated_at` → `updated_at`
- `user_collaborators` changed from `list[int]` to `list[Any]` to handle
the upcoming migration from int IDs to User objects
- Added new fields: `repository`, `html_url`, `url`, `slug` on
collaborators
- Removed deprecated `status` field from `GithubCopilotTask` — our code
only reads `state`
- Removed legacy `{"task": {...}}` response envelope handling and
`GithubCopilotTaskResponse` model — the API returns task objects
directly now

**Context:** GitHub is rolling out breaking changes to their Copilot
Tasks API. We verified the current API state by testing against a live
repo — `last_updated_at`, `creator_id`, `owner_id`, and the `{"task":
...}` envelope are already gone. `status` is still present alongside
`state` but deprecated. `user_collaborators` type change (int → object)
is coming soon.

Our polling flow (`poll_github_copilot_agents`) only reads `task.state`
and `task.artifacts`, so it's unaffected. These changes prevent Pydantic
validation failures when parsing API responses with the new field
shapes.

## Test plan
- [x] All existing tests pass (54 tests across `test_client.py` +
`test_coding_agent.py`)
- [x] Verified against live GitHub Copilot API
…ocated with its caller (#111894)

This makes OWNERS file cleaner as everything is within the same folder
structure.
…rawer (#111859)

Add a feedback banner at the top of the supergroup drawer asking users
if the grouping is accurate, with thumbs up/down buttons that fire a new
analytics event. Also add an experimental badge to the breadcrumbs.

<img width="735" height="208" alt="image"
src="https://github.com/user-attachments/assets/9ecf7dde-2dd8-47d0-a661-438ac8f3b6e3"
/>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This broke with our change to the new indicators, so I'm updating each
element's location and the button overflow accordingly
This reverts commit 128112a.

Co-authored-by: ryan953 <187460+ryan953@users.noreply.github.com>
Related: #111866,
getsentry/seer#5554

Reranking has been on for ~2 years, we don't need to check it in the
frontend.

Co-authored-by: Claude <noreply@anthropic.com>
Removing from seer here: getsentry/seer#5554

We've always been using the reranking path for ~2 years. We can get rid
of the non-reranking path.

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

Integration providers register callback URLs with external services
(e.g. GitHub OAuth redirect). These URLs point to PipelineAdvancerView,
which traditionally drives the pipeline server-side by calling
pipeline.current_step() on each callback.

For the new API-driven pipeline mode, we cannot change the callback URLs
already registered with production integrations. Instead, this view now
detects when a pipeline was initiated in API mode (api_mode flag in
session state) and renders a lightweight trampoline page. The trampoline
relays the callback URL query parameters (code, state, installation_id,
etc.) back to the opener window via postMessage and closes itself. The
frontend pipeline system then continues driving the pipeline via API
endpoints.

Fixes [VDY-36](https://linear.app/getsentry/issue/VDY-36)
…1893)

Adds an RPC interface for fetching a GitHub integration's
installation_id.

- Adds a new get_repo_installation_id function to the Seer RPC interface
that resolves a repository to its GitHub App installation ID
- GitHub stores the installation ID as integration.external_id, while
GitHub Enterprise stores it in integration.metadata["installation_id"]
- Registered in seer_method_registry so Seer can call it via RPC
- Only supports GitHub and GitHub Enterprise providers; returns an error
for unsupported providers
This breaks clickhouse. Let's raise a SnubaError that spells out the
problem more clearly instead of letting things get that far.
This is a repeat of #111829 

That #111829 was reverted because of a failing test: the selective test
runner didn't find the test so i missed it.
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.10.1 to 2.12.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/jpadilla/pyjwt/releases">pyjwt's
releases</a>.</em></p>
<blockquote>
<h2>2.12.0</h2>
<h2>Security</h2>
<ul>
<li>Validate the crit (Critical) Header Parameter defined in RFC 7515
§4.1.11. by <a
href="https://github.com/dmbs335"><code>@​dmbs335</code></a> in <a
href="https://github.com/jpadilla/pyjwt/security/advisories/GHSA-752w-5fwx-jx9f">GHSA-752w-5fwx-jx9f</a></li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1132">jpadilla/pyjwt#1132</a></li>
<li>chore(docs): fix docs build by <a
href="https://github.com/tamird"><code>@​tamird</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1137">jpadilla/pyjwt#1137</a></li>
<li>Annotate PyJWKSet.keys for pyright by <a
href="https://github.com/tamird"><code>@​tamird</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1134">jpadilla/pyjwt#1134</a></li>
<li>fix: close HTTPError to prevent ResourceWarning on Python 3.14 by <a
href="https://github.com/veeceey"><code>@​veeceey</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1133">jpadilla/pyjwt#1133</a></li>
<li>chore: remove superfluous constants by <a
href="https://github.com/tamird"><code>@​tamird</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1136">jpadilla/pyjwt#1136</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1135">jpadilla/pyjwt#1135</a></li>
<li>chore(tests): enable mypy by <a
href="https://github.com/tamird"><code>@​tamird</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1138">jpadilla/pyjwt#1138</a></li>
<li>Bump actions/download-artifact from 7 to 8 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1142">jpadilla/pyjwt#1142</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1141">jpadilla/pyjwt#1141</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1145">jpadilla/pyjwt#1145</a></li>
<li>fix: do not store reference to algorithms dict on PyJWK by <a
href="https://github.com/akx"><code>@​akx</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1143">jpadilla/pyjwt#1143</a></li>
<li>Use PyJWK algorithm when encoding without explicit algorithm by <a
href="https://github.com/jpadilla"><code>@​jpadilla</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1148">jpadilla/pyjwt#1148</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/tamird"><code>@​tamird</code></a> made
their first contribution in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1137">jpadilla/pyjwt#1137</a></li>
<li><a href="https://github.com/veeceey"><code>@​veeceey</code></a> made
their first contribution in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1133">jpadilla/pyjwt#1133</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/jpadilla/pyjwt/compare/2.11.0...2.12.0">https://github.com/jpadilla/pyjwt/compare/2.11.0...2.12.0</a></p>
<h2>2.11.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Fixed type error in comment by <a
href="https://github.com/shuhaib-aot"><code>@​shuhaib-aot</code></a> in
<a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1026">jpadilla/pyjwt#1026</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1018">jpadilla/pyjwt#1018</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1033">jpadilla/pyjwt#1033</a></li>
<li>Make note of use of leeway with nbf by <a
href="https://github.com/djw8605"><code>@​djw8605</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1034">jpadilla/pyjwt#1034</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1035">jpadilla/pyjwt#1035</a></li>
<li>Fixes <a
href="https://redirect.github.com/jpadilla/pyjwt/issues/964">#964</a>:
Validate key against allowed types for Algorithm family by <a
href="https://github.com/pachewise"><code>@​pachewise</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/985">jpadilla/pyjwt#985</a></li>
<li>Feat <a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1024">#1024</a>:
Add iterator for PyJWKSet by <a
href="https://github.com/pachewise"><code>@​pachewise</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1041">jpadilla/pyjwt#1041</a></li>
<li>Fixes <a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1039">#1039</a>:
Add iss, issuer type checks by <a
href="https://github.com/pachewise"><code>@​pachewise</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1040">jpadilla/pyjwt#1040</a></li>
<li>Fixes <a
href="https://redirect.github.com/jpadilla/pyjwt/issues/660">#660</a>:
Improve typing/logic for <code>options</code> in decode,
decode_complete; Improve docs by <a
href="https://github.com/pachewise"><code>@​pachewise</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1045">jpadilla/pyjwt#1045</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1042">jpadilla/pyjwt#1042</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1052">jpadilla/pyjwt#1052</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1053">jpadilla/pyjwt#1053</a></li>
<li>Fix <a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1022">#1022</a>:
Map <code>algorithm=None</code> to &quot;none&quot; by <a
href="https://github.com/qqii"><code>@​qqii</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1056">jpadilla/pyjwt#1056</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1055">jpadilla/pyjwt#1055</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1058">jpadilla/pyjwt#1058</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1060">jpadilla/pyjwt#1060</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1061">jpadilla/pyjwt#1061</a></li>
<li>Fixes <a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1047">#1047</a>:
Correct <code>PyJWKClient.get_signing_key_from_jwt</code> annotation by
<a href="https://github.com/khvn26"><code>@​khvn26</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1048">jpadilla/pyjwt#1048</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1062">jpadilla/pyjwt#1062</a></li>
<li>Fixed doc string typo in _validate_jti() function <a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1063">#1063</a>
by <a
href="https://github.com/kuldeepkhatke"><code>@​kuldeepkhatke</code></a>
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1064">jpadilla/pyjwt#1064</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1065">jpadilla/pyjwt#1065</a></li>
<li>Update SECURITY.md by <a
href="https://github.com/auvipy"><code>@​auvipy</code></a> in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1057">jpadilla/pyjwt#1057</a></li>
<li>Typing fix: use <code>float</code> instead of <code>int</code> for
<code>lifespan</code> and <code>timeout</code> by <a
href="https://github.com/nikitagashkov"><code>@​nikitagashkov</code></a>
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1068">jpadilla/pyjwt#1068</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>[bot]
in <a
href="https://redirect.github.com/jpadilla/pyjwt/pull/1067">jpadilla/pyjwt#1067</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst">pyjwt's
changelog</a>.</em></p>
<blockquote>
<h2><code>v2.12.0
&lt;https://github.com/jpadilla/pyjwt/compare/2.11.0...2.12.0&gt;</code>__</h2>
<p>Fixed</p>
<pre><code>
- Annotate PyJWKSet.keys for pyright by @tamird in
`[#1134](jpadilla/pyjwt#1134)
&lt;https://github.com/jpadilla/pyjwt/pull/1134&gt;`__
- Close ``HTTPError`` response to prevent ``ResourceWarning`` on Python
3.14 by @veeceey in
`[#1133](jpadilla/pyjwt#1133)
&lt;https://github.com/jpadilla/pyjwt/pull/1133&gt;`__
- Do not keep ``algorithms`` dict in PyJWK instances by @akx in
`[#1143](jpadilla/pyjwt#1143)
&lt;https://github.com/jpadilla/pyjwt/pull/1143&gt;`__
- Validate the crit (Critical) Header Parameter defined in RFC 7515
§4.1.11. by @dmbs335 in `GHSA-752w-5fwx-jx9f
&lt;https://github.com/jpadilla/pyjwt/security/advisories/GHSA-752w-5fwx-jx9f&gt;`__
- Use PyJWK algorithm when encoding without explicit algorithm in
`[#1148](jpadilla/pyjwt#1148)
&lt;https://github.com/jpadilla/pyjwt/pull/1148&gt;`__
<p>Added
</code></pre></p>
<ul>
<li>Docs: Add <code>PyJWKClient</code> API reference and document the
two-tier caching system (JWK Set cache and signing key LRU cache).</li>
</ul>
<h2><code>v2.11.0
&lt;https://github.com/jpadilla/pyjwt/compare/2.10.1...2.11.0&gt;</code>__</h2>
<p>Fixed</p>
<pre><code>
- Enforce ECDSA curve validation per RFC 7518 Section 3.4.
- Fix build system warnings by @kurtmckee in
`[#1105](jpadilla/pyjwt#1105)
&lt;https://github.com/jpadilla/pyjwt/pull/1105&gt;`__
- Validate key against allowed types for Algorithm family in
`[#964](jpadilla/pyjwt#964)
&lt;https://github.com/jpadilla/pyjwt/pull/964&gt;`__
- Add iterator for JWKSet in
`[#1041](jpadilla/pyjwt#1041)
&lt;https://github.com/jpadilla/pyjwt/pull/1041&gt;`__
- Validate `iss` claim is a string during encoding and decoding by
@pachewise in `[#1040](jpadilla/pyjwt#1040)
&lt;https://github.com/jpadilla/pyjwt/pull/1040&gt;`__
- Improve typing/logic for `options` in decode, decode_complete by
@pachewise in `[#1045](jpadilla/pyjwt#1045)
&lt;https://github.com/jpadilla/pyjwt/pull/1045&gt;`__
- Declare float supported type for lifespan and timeout by
@nikitagashkov in
`[#1068](jpadilla/pyjwt#1068)
&lt;https://github.com/jpadilla/pyjwt/pull/1068&gt;`__
- Fix ``SyntaxWarning``\s/``DeprecationWarning``\s caused by invalid
escape sequences by @kurtmckee in
`[#1103](jpadilla/pyjwt#1103)
&lt;https://github.com/jpadilla/pyjwt/pull/1103&gt;`__
- Development: Build a shared wheel once to speed up test suite setup
times by @kurtmckee in
`[#1114](jpadilla/pyjwt#1114)
&lt;https://github.com/jpadilla/pyjwt/pull/1114&gt;`__
- Development: Test type annotations across all supported Python
versions,
increase the strictness of the type checking, and remove the mypy
pre-commit hook
by @kurtmckee in `[#1112](jpadilla/pyjwt#1112)
&lt;https://github.com/jpadilla/pyjwt/pull/1112&gt;`__
<p>Added
</code></pre></p>
<ul>
<li>Support Python 3.14, and test against PyPy 3.10 and 3.11 by <a
href="https://github.com/kurtmckee"><code>@​kurtmckee</code></a> in
<code>[#1104](jpadilla/pyjwt#1104)
&lt;https://github.com/jpadilla/pyjwt/pull/1104&gt;</code>__</li>
<li>Development: Migrate to <code>build</code> to test package building
in CI by <a
href="https://github.com/kurtmckee"><code>@​kurtmckee</code></a> in
<code>[#1108](jpadilla/pyjwt#1108)
&lt;https://github.com/jpadilla/pyjwt/pull/1108&gt;</code>__</li>
<li>Development: Improve coverage config and eliminate unused test suite
code by <a
href="https://github.com/kurtmckee"><code>@​kurtmckee</code></a> in
<code>[#1115](jpadilla/pyjwt#1115)
&lt;https://github.com/jpadilla/pyjwt/pull/1115&gt;</code>__</li>
<li>Docs: Standardize CHANGELOG links to PRs by <a
href="https://github.com/kurtmckee"><code>@​kurtmckee</code></a> in
<code>[#1110](jpadilla/pyjwt#1110)
&lt;https://github.com/jpadilla/pyjwt/pull/1110&gt;</code>__</li>
<li>Docs: Fix Read the Docs builds by <a
href="https://github.com/kurtmckee"><code>@​kurtmckee</code></a> in
<code>[#1111](jpadilla/pyjwt#1111)
&lt;https://github.com/jpadilla/pyjwt/pull/1111&gt;</code>__</li>
<li>Docs: Add example of using leeway with nbf by <a
href="https://github.com/djw8605"><code>@​djw8605</code></a> in
<code>[#1034](jpadilla/pyjwt#1034)
&lt;https://github.com/jpadilla/pyjwt/pull/1034&gt;</code>__</li>
<li>Docs: Refactored docs with <code>autodoc</code>; added
<code>PyJWS</code> and <code>jwt.algorithms</code> docs by <a
href="https://github.com/pachewise"><code>@​pachewise</code></a> in
<code>[#1045](jpadilla/pyjwt#1045)
&lt;https://github.com/jpadilla/pyjwt/pull/1045&gt;</code>__</li>
<li>Docs: Documentation improvements for &quot;sub&quot; and
&quot;jti&quot; claims by <a
href="https://github.com/cleder"><code>@​cleder</code></a> in
<code>[#1088](jpadilla/pyjwt#1088)
&lt;https://github.com/jpadilla/pyjwt/pull/1088&gt;</code>__</li>
<li>Development: Add pyupgrade as a pre-commit hook by <a
href="https://github.com/kurtmckee"><code>@​kurtmckee</code></a> in
<code>[#1109](jpadilla/pyjwt#1109)
&lt;https://github.com/jpadilla/pyjwt/pull/1109&gt;</code>__</li>
<li>Add minimum key length validation for HMAC and RSA keys (CWE-326).
Warns by default via <code>InsecureKeyLengthWarning</code> when keys are
below</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/jpadilla/pyjwt/commit/bd9700cca7f9258fadcc429c1034e508025931f2"><code>bd9700c</code></a>
Use PyJWK algorithm when encoding without explicit algorithm (<a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1148">#1148</a>)</li>
<li><a
href="https://github.com/jpadilla/pyjwt/commit/051ea341b5573fe3edcd53042f347929b92c2b92"><code>051ea34</code></a>
Merge commit from fork</li>
<li><a
href="https://github.com/jpadilla/pyjwt/commit/1451d70eca2059bc472703692f0bb0777bc0fe93"><code>1451d70</code></a>
fix: do not store reference to algorithms dict on PyJWK (<a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1143">#1143</a>)</li>
<li><a
href="https://github.com/jpadilla/pyjwt/commit/f3ba74c106df9ce10e272dfaad96acb4ab3ef5a5"><code>f3ba74c</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1145">#1145</a>)</li>
<li><a
href="https://github.com/jpadilla/pyjwt/commit/0318ffa7b156b01600376e38952bf961382e0724"><code>0318ffa</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1141">#1141</a>)</li>
<li><a
href="https://github.com/jpadilla/pyjwt/commit/a52753db3c1075ac01337fa8b7cc92b13a19ac09"><code>a52753d</code></a>
Bump actions/download-artifact from 7 to 8 (<a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1142">#1142</a>)</li>
<li><a
href="https://github.com/jpadilla/pyjwt/commit/b85050f1d444c6828bb4618ee764443b0a3f5d18"><code>b85050f</code></a>
chore(tests): enable mypy (<a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1138">#1138</a>)</li>
<li><a
href="https://github.com/jpadilla/pyjwt/commit/1272b264779717cc481c8341f321a7fc8b3aaba6"><code>1272b26</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1135">#1135</a>)</li>
<li><a
href="https://github.com/jpadilla/pyjwt/commit/99a87287c26cb97c94399084ee4186ee52207a7f"><code>99a8728</code></a>
chore: remove superfluous constants (<a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1136">#1136</a>)</li>
<li><a
href="https://github.com/jpadilla/pyjwt/commit/412cb67a93363812ae4029d6a95f5d4d40ab2609"><code>412cb67</code></a>
fix: close HTTPError to prevent ResourceWarning on Python 3.14 (<a
href="https://redirect.github.com/jpadilla/pyjwt/issues/1133">#1133</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/jpadilla/pyjwt/compare/2.10.1...2.12.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pyjwt&package-manager=uv&previous-version=2.10.1&new-version=2.12.0)](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: Alexander Tarasov <alex.tarasov@sentry.io>
Co-authored-by: Michelle Tran <michelle.tran@sentry.io>
Co-authored-by: Claude <noreply@anthropic.com>
The current `CompositeSelect` component doesn't seem to have an easy way
to hook up clearing selections, which is understandable since there are
multi-selection possibilities so to tackle this I'd like to add in a
button that is styled to match that of the `CompactSelect`'s clear
button.

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4 <noreply@example.com>
Remove 9 options that were deleted in
getsentry/sentry-options-automator#7037. These
controlled seer similarity backfill tuning and are no longer needed.

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

## Summary
- Implement the full `process_mention_for_slack` task body (replacing
the previous TODO stub): fetch org, check explorer access, construct
`SlackExplorerEntrypoint`, resolve the Sentry user from Slack identity,
extract the user prompt, build thread context, and trigger an Explorer
run via `SeerExplorerOperator`
- Add `_resolve_user()` helper that maps a Slack user ID to an `RpcUser`
through the linked identity provider, `_send_link_identity_prompt()`
that sends an ephemeral Slack message prompting the user to link their
identity when no link exists, and `_send_not_org_member_message()` that
sends an ephemeral error when the user is not a member of the
organization
- Extract `bot_user_id` from the Slack `authorizations` payload in
`on_app_mention` so the task can strip the bot mention from the user's
prompt via `extract_prompt()`
- Set assistant thread status ("Thinking..." with loading messages)
immediately on mention for user feedback before dispatching the async
task; clear thread status on early exits (identity not linked, not an
org member)
- Fix `thread_ts` resolution in `on_app_mention` to correctly
distinguish `ts` (message timestamp) from `thread_ts` (parent thread
timestamp, None for top-level messages), and pass both to the task
- Move `return self.respond()` inside the lifecycle context manager so
halts/failures are properly recorded
- Simplify `SlackExplorerEntrypoint`: remove `message_ts` parameter
(caller now resolves `thread_ts`), make `thread_ts` required, raise
`EntrypointSetupError` instead of `ValueError`, and store
`self.integration` for use by identity-linking helpers
- Add Block Kit text extraction utilities (`_extract_block_text`,
`_extract_text_from_blocks`, `_extract_rich_text_element_text`) for
building thread context from rich_text, section, context, header, and
markdown blocks — with defensive `isinstance` checks for external Slack
API data
- Update `build_thread_context` to prefer block-based text extraction
over plain `text` fallback, preserving URLs and mentions from rich text
blocks
- Fix `SlackActionRequest.get_action_list` to use `.get("value", "")`
instead of `["value"]` to avoid `KeyError` on actions without a value
field
- Rename `MISSING_CHANNEL_OR_TEXT` to `MISSING_EVENT_DATA` in
`AppMentionHaltReason` to reflect broader validation
- Add `SlackEntrypointInteractionType.PROCESS_MENTION` and
`ProcessMentionHaltReason`/`ProcessMentionFailureReason` enums for
structured observability
- Change `SeerExplorerOperator.execute` to pass `summary=None` instead
of a hardcoded fallback string when no assistant content is found in
Explorer results
- Add `loading_messages` parameter to
`SlackIntegration.set_thread_status` for rotating status messages
- Add comprehensive tests for the task (`test_tasks.py`) covering happy
path, org-not-found, no-access, integration-not-found,
identity-not-linked, user-not-org-member, and thread-context scenarios;
add Block Kit extraction tests; update webhook and entrypoint tests
accordingly

Refs ISWF-2023
…111832)

Using `Section` like we use in the detector form for consistency
…111801)

"Create Monitor" buttons should always link to the initial type
selection page. We made this link to the actual form on the
type-specific pages after user feedback, but we now believe that the
original experience was more consistent and leads to less confusion
overall.
Update the convert_to_async_slack_response and
convert_to_async_discord_response tasks to also accept cell_name.

Once deployed everywhere, will update callers to pass cell_name
…selection (#111668)

Tweaking the logic around selecting default operators. When a user
selects a value from the dropdown it's likely they're looking for an
exact matching value, rather than it containing that value.

This PR modifies the query builder logic so that if a user selects a
value from the value combobox it'll change it from `contains` to `is`.
However, if a user already has a valid contains filter, we do not change
the operator if selecting a value afterwards.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
tests failed on master here:
https://github.com/getsentry/sentry/actions/runs/23808567753/job/69388944325


https://github.com/getsentry/sentry/actions/runs/23767928687/job/69252070904

```
gh api "repos/getsentry/sentry/actions/workflows/backend.yml/runs?head
      _sha=b8bd5add647a14a7c80afae86cf5cafe1ec26ba5&per_page=10" --jq
      '.workflow_runs[] | {id, run_number, created_at, run_attempt, event,
      status}'
```

and the newer stuff (prints how many test contexts changed files are
linked to):
https://github.com/getsentry/sentry/actions/runs/23767928704/job/69252070278#step:7:32

src/sentry/constants.py has plenty of coverage apparently but not enough
## Summary
- Registers a new FlagPole feature flag
`organizations:data-browsing-widget-unfurl` to gate URL unfurling in the
data browsing widget.
- The flag is API-exposed so the frontend can check it.

## Test plan
- [ ] Verify the feature flag is registered correctly by checking
`features.has("organizations:data-browsing-widget-unfurl", ...)` in a
shell
- [ ] Confirm the flag appears in the organization features API response
when enabled

DAIN-1439
…r counts (errors) (#111861)

Implements double reads of occurrences from EAP for
`get_groups_user_counts` in `src/sentry/tagstore/snuba/backend.py`.
Co-Authored-By: bmckerry <110857332+bmckerry@users.noreply.github.com>

---------

Co-authored-by: getsentry-bot <10587625+getsentry-bot@users.noreply.github.com>
Co-authored-by: bmckerry <110857332+bmckerry@users.noreply.github.com>
jaydgoss and others added 21 commits March 31, 2026 14:10
…111936)

The "Connected to {provider} org {name}" tag was expanding to 100% width
of its parent flex container. Wrapping it in a Container constrains it
to its natural content width.
#111701)

Replace the free-text notes field in the "Add to Startup Program" admin
modal with a dropdown of predefined program options:

- Y Combinator
- Sentry for Startups (default)
- a16z
- Accelatoms
- Accelfam
- Renderstack
- Finpack
- Betaworks
- Alchemist
- Antler
- Other (reveals a free-text input)

When "Other" is selected, a custom notes text field appears for
free-form input. The submitted `notes` value is the selected program
key, or the custom text when "Other" is chosen.

---------

Co-authored-by: Claude <noreply@anthropic.com>
…on (#110602)

Add external namespace registration for launchpad tasks and shadow
dispatch
of artifact processing to the taskbroker alongside the existing Kafka
pipeline.

This is the Sentry-side integration for the launchpad taskbroker
migration.
When enabled, after the existing Kafka dispatch succeeds, a shadow
dispatch
sends the same artifact processing request to the launchpad application
via
the taskbroker. This allows us to validate the taskbroker path in
production
without affecting the primary Kafka pipeline.

**Safety gates:**
- Feature flag `launchpad-taskbroker-rollout` — org-level rollout
control
- Shadow dispatch failures are caught and logged, never affecting the
primary path

**Changes:**
- Register external `launchpad_tasks` namespace via `taskbroker-client`
`ExternalNamespace`
- Extract `_dispatch_kafka` helper from `assemble_preprod_artifact` for
clarity
- Add `_dispatch_taskbroker_shadow` with feature-based quota/size checks
and `process_artifact.apply_async()` dispatch
- Bump `taskbroker-client` to 0.1.5 (adds `ExternalNamespace` support)
- Bump `sentry-cli` to 3.1.0

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
Adds backend support for completing the GitHub integration setup flow
via API endpoints instead of server-rendered Django views.

Extracts shared logic from the existing template-driven pipeline views
into reusable functions (exchange_github_oauth,
validate_github_installation,
validate_org_installation_choice, _build_installation_info_with_counts)
so
both the legacy views and new API steps can use them.

Adds OAuthLoginApiStep and GithubOrganizationSelectionApiStep which
implement the same flow as the existing views but return structured data
for the frontend to render. Adds api_finish_pipeline to
IntegrationPipeline
for completing the pipeline without server-side redirects.

Refactors _finish_pipeline to separate model operations
(_execute_finish_pipeline) from HTTP response handling, and extracts
initialize_integration_pipeline from OrganizationIntegrationSetupView
for
reuse by the API endpoint.

Refs VDY-38
This fixes two bugs with our integer parameterization:

- Only count a dash as a minus sign if it doesn't come in between two sets of alphanumeric characters (so `1121-1231` comes out as `<int>-<int>` rather than `<int><int>` and `maisey-908` comes out as `maisey-<int>` rather than `maisey<int>`, but `difference:-4` and `difference: -4` both are correctly parameterized as `difference:<int>` and `difference: <int>`, respectively).

- Fix the fact that positive integers count as hex values if they have at least 8 digits, but negative integers still count as integers (no matter how long they are) by restricting the int pattern to 7 characters.

Note that the combination of these fixes (making sure that dashes count as minus signs for negative hex values if they're not part of a dashed string) will require changes to the hex pattern, and so isn't included here. (It will be addressed in an upcoming PR making other hex changes.)
…r counts (issue platform) (#111863)

Implements double reads of occurrences from EAP for
`get_generic_groups_user_counts` in
`src/sentry/tagstore/snuba/backend.py`.
…value count (#111868)

Implements double reads of occurrences from EAP for
`get_group_tag_value_count` in `src/sentry/tagstore/snuba/backend.py`.
…dence_data (#111923)

Add `value`, `conditions`, and `config` to the `evidence_data` dict in
`PreprodSizeAnalysisDetectorHandler.create_occurrence()`. This snapshots
the evaluated value, the condition(s) that fired, and the detector
config
at trigger time — following the same pattern as
`StatefulDetectorHandler._build_workflow_engine_evidence_data`.

This is the backend half of EME-981 (triggered condition display for
size
analysis issues). The frontend PR will read these new fields from
`event.occurrence.evidenceData` to render a triggered condition section.

Refs EME-981

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

Always use the InstallButtonHook path instead of branching on the
flag. Removes the old renderInstallationButtonOld code path and
associated dead code (doesntRequireUpgrade, isSelfHosted, etc).
This is handful of refactors to the parameterization code, to make it a bit simpler and more testable.

- Allow `ParameterizationRegex` objects to be passed directly to parameterizer during initialization rather than always using the default set. (This should make it easier to test, so we don't have to do a bunch of mocking.) If none are passed, the default set will still be used.

- Create the final regex directly in `__init__` rather than in a separate method.

- When deciding if the experimental parameterizer is actually experimental, look at the regexes themselves rather than at the regex maps.

- When deciding whether to skip testing the experimental parameterizer, look directly at it rather than comparing the regex maps.

- Use `lastgroup` to get matched key/original value directly rather than iterating over `groupdict`.

- Remove the now-unused regex maps.

- Rename a number of things.
…izer (#111942)

The previous logic had us potentially sending 100+ workflow queries,
which can add 300ms+ to the request.
By only fetching ids, we avoid considerable unnecessary work.
First pass at a Seer Settings Overview page. To help people get oriented
while they're getting setup.
Reuse the previous supergroup request while the visible issue ids only
shrink. This keeps archive and resolve actions from issuing a new
supergroup lookup and flashing the stream back into a loading state.

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

Adds `collapse=stats` to the feedback group details query key so the
group details endpoint skips computing 24h/30d time-series stats. The
feedback details page doesn't use the `stats` field from the group
response.

Matches the pattern from #111156 which did the same for the issue
details page.
…ojectName & eventId (#111931)

Test plan:

I have a feedback with `groupId: 7377579909` & `eventId:
0e8581c24ade4bb8bb59b3a0f8387b4b` in the `javascript` project.

Normally I would need to go to visit
`/issues/feedback/?feedbackSlug=javascript:7377579909` to see that
feedback properly, using the groupId in the url.

Now I've updated the url to not require the the `project` part at all,
so the url can be `/issues/feedback/?feedbackSlug=7377579909`, woo!

But we can't construct that url from the sdk, we don't know the groupId
at that time, only the event it.

Turns out we have a redirect in place already, using the url template
`/organizations/${orgSlug}/projects/${projectSlug}/events/${eventId}/`
we do a redirect to the proper issue.
I fixed this redirect to see if the issue is a feedback issue or not,
and if it is then we'll use the proper feedback view instead of the
generic feedback view!

Tested by visiting
`/projects/javascript/events/0e8581c24ade4bb8bb59b3a0f8387b4b/` which
now takes me to `/issues/feedback/?feedbackSlug=javascript%3A7377579909`

I also was able to import nuqs and create a single, simpler,
`useFeedbackSlug` hook to fetch the values from the url. Turns out we
don't _really_ need projectSlug except to make the alert-creation page
have better defaults.

Fixes
https://linear.app/getsentry/issue/REPLAY-873/direct-url-to-user-feedback-from-capturefeedback
Fixes #108213
@pull pull Bot locked and limited conversation to collaborators Mar 31, 2026
@pull pull Bot added the ⤵️ pull label Mar 31, 2026
@pull pull Bot merged commit 3f75bac into KingDEV95:master Mar 31, 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 31, 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.