Skip to content

[pull] master from getsentry:master#1849

Merged
pull[bot] merged 35 commits into
KingDEV95:masterfrom
getsentry:master
Apr 4, 2026
Merged

[pull] master from getsentry:master#1849
pull[bot] merged 35 commits into
KingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Apr 3, 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 : )

Mihir-Mavalankar and others added 28 commits April 3, 2026 08:58
…e_context (#112181)

+ When the frontend sends a structured LLMContextSnapshot as JSON in
on_page_context (instead of the legacy ASCII DOM screenshot), the
explorer chat endpoint now detects it and converts it to a readable
markdown string before forwarding to Seer. Non-JSON on_page_context (the
existing ASCII screenshot) passes through unchanged.
+ This is the backend half of the structured page context feature. The
frontend counterpart (conditionally sending JSON instead of ASCII when
organizations:context-engine-structured-page-context flag is on +
dashboards page) will follow in a separate PR per the frontend/backend
split deploy requirement.

+ This won't do anything currently right cuz the this is always false -
snapshot = json.loads(on_page_context)
Follow-up PRs
1. Frontend PR: Wire getLLMContext() into useSeerExplorer.tsx — when the
feature flag is on and the user is on a dashboards page, send
JSON.stringify(getLLMContext()) as on_page_context instead of the ASCII
screenshot
2. Widget/chart context nodes: Add registerLLMContext('widget', ...) and
registerLLMContext('chart', ...) to dashboard widget and chart
components so the snapshot tree has richer data (query config, filters,
etc. — not
   raw timeseries data)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Currently, we only sync the available repositories from Github on
installing the integration. So over time, if new repositories are added
to the github organization, or access to specific repositories is added
or removed, we end up out of sync with which repositories we store in
Sentry.

To fix this, we are going to start handling the
`installation_repositories` webhook. This is fired whenever the
repositories that a github app can access change. This allows us to keep
all the repos in sync.

Note that when access to a repo is removed, we only ever disable the
repo and never delete it. This allows us to keep the history of commits
and so on so far.
…tate (#112188)

## Summary
- The `paymentForm.spec.tsx` test "renders an error when intent creation
fails" was flaky because it asserted `toBeEnabled()` on the "Pay Now"
button synchronously
- The mock Stripe `PaymentElement` fires `onChange({complete: true})`
inside a `setTimeout(..., 0)`, so the button's enabled state update
races with the assertion
- Wrapped the assertion in `waitFor()` to reliably wait for the async
state update

## Root Cause
In `tests/js/setup.ts`, the global Stripe mock for `PaymentElement` uses
`setTimeout(() => { onChange({complete: true}) }, 0)` to simulate form
completion. In `InnerIntentForm`, the submit button starts disabled
(`submitDisabled = true`) and only becomes enabled when `onChange` fires
with `complete: true`. The synchronous `toBeEnabled()` assertion could
run before the setTimeout callback executed, causing intermittent
failures.

## Test plan
- [x] Pre-commit passes
- [x] CI passes
…gs (#111952)

Implements double reads of occurrences from EAP for `get_release_tags`
in `src/sentry/tagstore/snuba/backend.py`.
…112054)

An iteration on the loading state. Before it would show a sort-of
incremental count and still be spinning along. It looked like it was
stuck or something because it wasn't ticking up consistently.

Now we hold back on showing the count and buttons until we're fully
ready to go. For these >800 repos it takes ~20seconds to load up for me.


https://github.com/user-attachments/assets/c865cb0c-014b-4239-a50e-e685c28e36c3
…SENTRY_REGION (#112140)

these can be safely removed now getsentry is updated
)

This makes this much easier to read/review and test. The stories are
small and still work

The bigs wins are a) moving a lot of logic out of the component and into
hooks, b) and then leveraging useQuery and `select: () => ...` inside
those hooks to format the data.

Everything is more centered around `type PreferredAgent`, including the
filename. i like how those things align tbh. And the tests are easier to
read, and more plentiful, than before.
…p changes (#112202)

When a group is archived and a new one backfills in, keep the previous
supergroup data visible while the new query fetches in the background.
Only show a loading state when navigating to an entirely new page of
results (no overlap with previous group IDs).

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

This test didn't run in my branch, so fixing this now.

<!-- Describe your PR here. -->
…default (#112208)

When handoff is not None and auto_create_pr is False (its registered
default), delete the option rather than writing it. The other handoff
fields are fine because they can't be None if handoff is not None.
+ When on dashboard pages with the
context-engine-structured-page-context feature flag enabled, send
JSON.stringify(getLLMContext()) instead of an ASCII DOM screenshot as
on_page_context. The backend (already merged) detects JSON and converts
it to markdown before forwarding to Seer.
+ Uses an explicit STRUCTURED_CONTEXT_ROUTES set for route matching
rather than string includes, making it easy to extend as more pages
register LLMContext providers.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Just a bunch of missing types. Added it to strictlist at the file-level
(rather than the usual module level) because I think this file is
important and tasks is too big to do all at once.
Remove the `execute()` function from `sentry/utils/concurrent.py`. It
spawns a bare `threading.Thread` that does not propagate `contextvars`,
making it a potential hazard for ViewerContext propagation work.

Its last caller was the legacy pre-Arroyo Kafka post-process forwarder,
removed in Feb 2023 (#44631). No code in the Sentry codebase imports or
calls it today.

Removing it rather than fixing its context propagation since
`ContextPropagatingThreadPoolExecutor` is the blessed pattern (enforced
by S016 lint rule). One less function that could silently lose context
if rediscovered.


Agent transcript:
https://claudescope.sentry.dev/share/-gVA8oDYrqoHR4FJeNP_snlwGf7vKDU_cG4AV4FH4pA
… tag value (#111963)

Implements double reads of occurrences from EAP for
`get_group_list_tag_value` & `get_generic_group_list_tag_value` in
`src/sentry/tagstore/snuba/backend.py`.

---------

Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
…)"

This reverts commit a8a8009.

Co-authored-by: wedamija <6288560+wedamija@users.noreply.github.com>
…_IMPORTS (#112201)"

This reverts commit 371be3f.

Co-authored-by: wedamija <6288560+wedamija@users.noreply.github.com>
…gPoint (#112211)

Just the basics as a dropdown. 

Following this will be the summary blurb and bulk-edit button

<img width="942" height="205" alt="SCR-20260403-jyzo"
src="https://github.com/user-attachments/assets/b1a9af15-0301-42fb-8bf6-1e01de39434c"
/>
…ask (#112177)"

This reverts commit b4f2897.

Co-authored-by: Christinarlong <60594860+Christinarlong@users.noreply.github.com>
Adds new Slot primitive for building detached slots into Scraps and
around the UI.

The Slot primitive follows a factory pattern which returns the relevant
React building blocks to build slots. Slots need to be rendered into DOM
elements (constraint due to the use of portals).

An example of how a slot may be used is

```tsx
import {slot} from '@sentry/scraps/slot'
const SlotModule = slot(['Foo'] as const);

function Component(props){
  return (
	<SlotModule.Provider>
      <SlotModule.slot.Foo.Root>
       {ref => <Container {...ref}/>
      </SlotModule.slot.Foo.Root>
      {children}
    </SlotModule.Provider>
  )
}

// The children can later render items to the slot via
function Child(){
  return <SlotModule.slot.Foo>...</SlotModule.slot.Foo>
}

// The final effect is the equivalent of
function Component(props){
  return (
	<SlotModule.Provider>
      <Container><Child /></Container>
      {children}
    </SlotModule.Provider>
  )
}
```

---------

Co-authored-by: Claude Sonnet 4 <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Jonas <JonasBa@users.noreply.github.com>
Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
…reflected in status column (#112223)

"Approved" wasn't being set in the "status" column of status checks as
we simply never wired that up. This fixes it to properly post "approved"
once snapshot diffs are approved.

Resolves EME-1004
…112221)

`make_signed_seer_api_request` now auto-reads from the `ViewerContext`
contextvar when no explicit `viewer_context` parameter is passed. This
means Seer calls made during API requests (where the middleware sets the
contextvar) automatically get identity context without callers needing
to construct and pass `SeerViewerContext`.

**Behavior:**
- Contextvar is the base — includes `actor_type` and `token` (kind +
scopes) when available
- Explicit `SeerViewerContext` param overrides `organization_id` /
`user_id` if passed
- If both exist and disagree on non-None values, logs
`seer.viewer_context_mismatch` warning and strips the token from the
payload

This is safe to land independently — it's a no-op until the
ViewerContext middleware is enabled (`viewer-context.enabled` option).
Existing callers that pass explicit context continue to work unchanged.

Part of the [ViewerContext
RFC](https://www.notion.so/sentry/RFC-Unified-ViewerContext-via-ContextVar-32f8b10e4b5d81988625cb5787035e02).

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@pull pull Bot locked and limited conversation to collaborators Apr 3, 2026
@pull pull Bot added the ⤵️ pull label Apr 3, 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 Apr 3, 2026
shashjar and others added 7 commits April 3, 2026 15:00
…value iter (#112122)

Implements double reads of occurrences from EAP for
`get_group_tag_value_iter` in `src/sentry/tagstore/snuba/backend.py`.

---------

Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
+ Prepend a blockquote explaining that the content is a structured
summary, not an exact screenshot. This helps the LLM understand the
context type and also serves as a marker to differentiate structured
context from raw ASCII screenshots downstream.
+ Planning to add a few more lines to this preamble later too

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

We had to revert #111864 because
the webhooks were being routed to cells. This is because we deploy cells
first, then control, and so the routing wasn't in place. Adding this
routing first, then we'll merge the webhook itself after this deploys.

<!-- Describe your PR here. -->
Fixes widgetBuilder panel container by anchoring its position to the
main element
Implements async actions inside our CMDK by allowing each action to
define a resource callback function that returns `queryOptions`.

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
@pull pull Bot merged commit e6e831c into KingDEV95:master Apr 4, 2026
1 of 4 checks passed
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.