Skip to content

[pull] master from getsentry:master#1839

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

[pull] master from getsentry:master#1839
pull[bot] merged 21 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 : )

TkDodo and others added 21 commits March 31, 2026 12:33
…110979)

- Remove rule hash function
- Remove constants
- Remove all methods on custom dynamic sampling rules before removal of
the model

Contributes to TET-1957
… code (#110979)"

This reverts commit 44531be.

Co-authored-by: shellmayr <6788060+shellmayr@users.noreply.github.com>
)

## Summary

- Change unique constraint on `RepositoryProjectPathConfig` from
`(project, stack_root)` to `(project, stack_root, source_root)`
- Update single-mapping serializer validation to include `source_root`
in duplicate check
- Update bulk endpoint upsert key to match on `(stack_root,
source_root)` instead of just `stack_root`

This allows the same stack trace root (e.g. `io/sentry/opentelemetry`)
to map to multiple source paths in the repo (e.g.
`sentry-opentelemetry-core/src/...` and
`sentry-opentelemetry-bootstrap/src/...`), which is needed for monorepos
with shared package prefixes across modules.

Stack trace resolution already handles this correctly — it iterates all
mappings sorted by specificity and uses the first match that resolves to
a real file.

## Test plan

- [x] All 63 existing tests pass (bulk + single endpoints)
- [x] Updated tests to reflect new constraint semantics
- [ ] Deploy migration and verify with real monorepo upload

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…11824)

Removes some of the old custom styles in favor of our [standard Scraps
transparent
Button](https://sentry.sentry.io/stories/core/button/#priorities).

<table>
<thead>
<tr>
<th>Before</th>
<th>After</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<img width="1514" height="314"
src="https://github.com/user-attachments/assets/2ff4fcf2-a6ec-4791-8b47-8c2c692320ae"
/>
</td>
<td>
<img width="1514" height="314"
src="https://github.com/user-attachments/assets/8499f706-1eff-4947-a76c-7b41b441733a"
/>
</td>
</tr>
</tbody>
</table>

Fixes EXP-860

Made with [Cursor](https://cursor.com)
…111730)

Add inline syntax highlighting for JSON embedded within log attribute
values in the expanded attribute tree view.

Previously (LOGS-400), only attribute values that were *entirely* valid
JSON got pretty-printed with `StructuredEventData`. Values like `This is
my JSON: {"it": "would be", "nice": ["to", "highlight"], "this": true}`
rendered as plain text. Now, the JSON portion gets Prism-based syntax
colorizing inline — keys, strings, numbers, booleans, and punctuation
each get their own color — without adding newlines or changing the
layout.

<img width="838" height="245" alt="Screenshot of a log with a myData
field showing syntax-highlighted JSON object"
src="https://github.com/user-attachments/assets/7b78bb01-5be9-494e-9010-2008fde3b59c"
/>

The JSON extraction logic lives in a standalone utility
(`extractJsonFromText`) that uses string-aware bracket matching to
correctly handle braces inside quoted strings and escape sequences —
unlike existing npm packages (`balanced-match`,
`extract-json-from-string`) which break on these cases. I intentionally
set this up so that it acts like a standalone importable utility. It'd
be nifty if we could publish this as its own package...

Fixes LOGS-636

Made with [Cursor](https://cursor.com)

Co-authored-by: Claude Sonnet 4 <noreply@anthropic.com>
…typed switch-exhaustiveness-check (#109743)

Following up on
#109725 (comment):
our lint rules that attempt to enforce exhaustive logical handling
aren't set up right. We're using ESLint's core rules that are not
type-aware and so are actually buggy / problematic:

*
[`consistent-return`](https://eslint.org/docs/latest/rules/consistent-return):
Requires `return` statements to either always or never specify values.
This can be thought of as a safety point (never accidentally implicitly
returning `undefined`) or a stylistic point (clearly indicating returned
values). TypeScript handles the safety point.
* [`default-case`](https://eslint.org/docs/latest/rules/default-case):
Requires `default` cases in `switch` statements. This doesn't factor in
type information for union types, resulting in a need to add a `default`
even if the `switch` is already exhaustive or (e.g. for finite unions)
or cannot be (e.g. for primitive types).

This PR switches from them to the type-aware
[`@typescript-eslint/switch-exhaustiveness-check`](https://typescript-eslint.io/rules/switch-exhaustiveness-check).
That rule knows to only enforce asking for handling all cases when the
`switch` is over a union type.

In other words, for a `switch (value)`, if a `value` is...

* `string`: nothing will require a `default:`
* `"a" | "b"`: then if there isn't both `case "a":` and `case "b":`,
there will need to be `default:`
Implement get_file() in PerforceClient using p4 print to fetch file
contents from the depot. This enables the SCM source context feature to
display inline code in stack traces for Perforce-hosted projects.

Converts P4Exception to ApiError(404) so the source context caller
handles errors consistently with other integrations.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This fixes a cleanup bug when conditionally rendered fields have their
own field level validations

---------

Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
StepDetails in GuidedSteps is a grid item in a `34px 1fr` grid layout.
The default `min-width: auto` allows it to expand beyond the 1fr column
when content (like a code block with long lines) has a large intrinsic
width. This caused the *Metrics* onboarding step 2 to overlap the
adjacent preview column.

Adding `min-width: 0` lets the grid item respect its track size, so the
code block's existing `overflow-x: auto` produces a horizontal scrollbar
instead of breaking the layout.

## Before
<img width="1090" height="861" alt="image"
src="https://github.com/user-attachments/assets/2db9ba64-0424-4a25-a0e1-628fb25e1c12"
/>

## After
<img width="1087" height="924" alt="image"
src="https://github.com/user-attachments/assets/ff638a44-c615-48fe-9d6e-5949f81279f0"
/>

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

The dashboards list page was forwarding its query parameters (`sort`,
`filter`, `query`) through to dashboard detail page links. When
navigating from the list to a specific dashboard, these
list-page-specific params would appear in the detail URL, which could
interfere with the dashboard's own filter handling (e.g., saved global
filters).

These query params aren't really used in dashboard details, and has
potential to mess up the state of certain widgets that might confuse
these params

Removes query param forwarding from:
- `DashboardGrid` card links
- `DashboardTable` name links
- `onCreate`, `loadDashboard`, and `onPreview` navigation in the manage
index

Fixes DAIN-1432

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

there was an issue in dashboards where a numeric literal in the equation
would not fully register and only the first character would register.
This is because the number was only committed on enter. We want the
number to be committed on blur as well because only committing on enter
is not intuitive. This left some widgets to not be saved properly (which
sucks). Ticket will be linked by linear for more context.
These options will  be unused and are good to be unregistered.
#111811)

When all artifacts for a commit are filtered/skipped by project
settings, the
status check task returned early without updating any previously posted
IN_PROGRESS check on GitHub. This left checks stuck as `in_progress`
forever.

Confirmed in production: artifact uploads would initially post an
IN_PROGRESS
check (before the filter decision), then a subsequent task invocation
would see
all artifacts as SKIPPED and hit the early return at `tasks.py:256-261`
— never
updating the check to a terminal state.

Now the `all_skipped` branch posts a NEUTRAL completed check with a
"Size
analysis skipped" message and a link to configure status check rules,
matching
the existing pattern for the no-quota case.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
It's the second time we have a bypass of this organization setting which
allowed for code gen, new branches, and new PRs. Fixing this upstream in
chokepoints rather than in all the endpoints since RPC callbacks,
on-complete hooks, and slack flows lacked enforcement too.

Added check to:
- coding_agent.py launch_coding_agents_for_run()
- autofix_agent.py  trigger_coding_agent_handoff() 
- autofix.py update_autofix()
- SeerExplorerClient.push_changes()
- group_autofix_update.py & organization_seer_explorer_update.py to
inspect payload_type and request.data type to 403 when appropriate

Plus a bunch of tests
The autofix endpoint has some special handling of PR creation for issue
groups so we want to use that instead of the generic explorer update
endpoint. Specifically, it'll append `Fixes ISSUE-123` to the end of the
PR description so the issue is linked back to the sentry issue.
The type field is unnecessary as we can already discriminate on the
`to`, `onAction` and the presence of children
This PR modifies the use of Layout.Page to something that is defined at
the root layout level as opposed to the route level.

This is done because a) folks were not aware they should use it, and we
never enforced it and b) the page frame design comes with design
opinionation which requires us to lock this down.

Because some designs were restyling the layout to hide the footer, the
actual location of the footer in the DOM order had to be moved, which
enables us to temporarily preserve the functionality before entirely
removing the footer from the DOM (pending page-frame release)

In other cases where Layout.Page was used, the usage had been converted
to `<Stack flex={1} padding={withPadding ? ... : undefined>` which
preserves the initial styling previously provided by Layout.Page
component

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Priscila Oliveira <priscila.oliveira@sentry.io>
@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 da1d85a into KingDEV95:master Mar 31, 2026
6 of 10 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 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.