Skip to content

Replays Self-Serve Bulk Delete System#6

Open
ShashankFC wants to merge 32 commits into
replays-delete-vulnerablefrom
replays-delete-stable
Open

Replays Self-Serve Bulk Delete System#6
ShashankFC wants to merge 32 commits into
replays-delete-vulnerablefrom
replays-delete-stable

Conversation

@ShashankFC

Copy link
Copy Markdown

Test 5

Summary by CodeRabbit

Release Notes

  • New Features

    • Added AI-powered feedback summaries in the feedback list.
    • Introduced table widget visualization for dashboards with customizable columns.
    • Added owner assignment support for workflow detectors.
    • Enhanced replay summaries with error context integration.
  • Bug Fixes

    • Improved PR comment formatting with better issue title and environment display.
    • Refined feedback summary generation with stricter length and format constraints.
    • Disabled autofix automation tuning by default for improved stability.

Replicated from ai-code-review-evaluation/sentry-coderabbit#5

armenzg and others added 30 commits June 20, 2025 12:49
…o 'low' (#93927)"

This reverts commit 8d04522.

Co-authored-by: roaga <47861399+roaga@users.noreply.github.com>
Missed in the initial commit, leading to some relevant logs being
unannotated.
We have had a few tasks get killed at 10% rollout.
Also add a test, so that this doesn't happen again
Fixes DE-129 and DE-156

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
These transitions should be matching
…` (#93946)

Use `project_id` on the replay record instead of the URL (where it does
not always exist).

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
Also fixed `replay.view_html` -> `replay.view-html`

---------

Co-authored-by: Michelle Zhang <56095982+michellewzhang@users.noreply.github.com>
…948)

gets `npx @typescript/native-preview` passing again
The conditions associated with a DCG can change over time, and it's good
if we can be completely confident that they're consistent within a given
task execution.
This is unused and most regex experiments have required broader changes
to ensure that regexes are evaluated in a specific order (ex:
traceparent). Removing this for now to simplify the code and very
slightly improve runtime performance.
From some testing (on feedback lists of all different lengths), this
prompt seems to work better. It doesn't write overly long sentences and
also does a better job at "summarizing" versus just mentioning a few
specific topics and leaving out others.
Just remove a couple custom Flex* classes in favor of the Flex primitive
This has been killed a few times.

Refs SENTRY-42M7
…n table (#93892)

<!-- Describe your PR here. -->

[ticket](https://linear.app/getsentry/issue/ID-156/grouping-info-remove-type-field-from-ui)
The Type field in the Grouping Info section of the issue details page
was redundant.
This removes the Type row from all variant types while keeping the
underlying data structure intact.

before
![Screenshot 2025-06-20 at 12 00
54 PM](https://github.com/user-attachments/assets/97ca72da-0a52-4446-9825-cd4fcb505adf)

after
![Screenshot 2025-06-20 at 11 59
29 AM](https://github.com/user-attachments/assets/a4284d2b-c9f5-442f-b010-7fe72a598e39)
### Changes
Related to this PR: getsentry/sentry#93810. This
is part 1 of the change, which is pulling out the new component and just
adding it to the repo. Also includes some simplification of the logic in
the base component.

Part 2 will be replacing tables in widgets.

### Before/After

There is no UI change as the table is not being used yet. There is a new
story page for the component.
…93943)

to prevent this issue from becoming too noisy, add a noise config
Unfortunately, 'event_data' went from being the variable for current
event context to being the complete parsed data from Redis, and we
continued logging it per group.
That's more data than we should be logging even arguably once, let alone
per group.
Co-authored-by: Abdullah Khan <abdullahkhan@PG9Y57YDXQ.local>
Adds some simple analytics to our endpoint so we can begin building a
dashboard in Amplitude.
Previously, explore supported multiple y axis per chart, so each
visualize supported multiple y axis. That functionality has since been
removed for simplicity so update the types here to match. Keep in mind
that saved queries still store them as an array so when
serializing/deserializing, we still need to treat it as an array.
We'll need the `useGetTraceItemAttributeKeys` hook in other places so
refactoring it so that it can exported.
mrduncan and others added 2 commits June 20, 2025 13:20
When the max segment ID is null the process fails. We should exit early
since if there aren't any segments to delete there's nothing to do.
@ShashankFC

Copy link
Copy Markdown
Author

@cubic-dev-ai review this pull request

@cubic-dev-ai

cubic-dev-ai Bot commented Feb 13, 2026

Copy link
Copy Markdown

@cubic-dev-ai review this pull request

@ShashankFC I have started the AI code review. It will take a few minutes to complete.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

21 issues found across 106 files

Note: This PR contains a large number of files. cubic only reviews up to 75 files per PR, so some files may not have been reviewed.

Prompt for AI agents (all issues)

Check if these issues are valid — if so, understand the root cause of each and fix them.


<file name="src/sentry/replays/usecases/delete.py">

<violation number="1" location="src/sentry/replays/usecases/delete.py:88">
P3: Typo: "segements" should be "segments".</violation>
</file>

<file name="static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.tsx">

<violation number="1" location="static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.tsx:94">
P2: Incomplete defensive coding: `Object.keys(tableData?.meta.fields)` will throw `TypeError` if `tableData` is nullish, because `Object.keys(undefined)` crashes. The optional chaining short-circuits to `undefined` but there's no fallback. Compare with `tableData?.data ?? []` on line 107, which properly falls back. Either remove the unnecessary optional chaining (since `tableData` is required) or add a proper fallback.</violation>
</file>

<file name="src/sentry/preprod/api/endpoints/organization_preprod_artifact_assemble.py">

<violation number="1" location="src/sentry/preprod/api/endpoints/organization_preprod_artifact_assemble.py:81">
P2: Analytics is recorded before the feature flag check, which means events will be tracked even for organizations that don't have the feature enabled (and receive a 404). Move the `analytics.record()` call after the `features.has()` check to avoid polluting analytics data with rejected requests.</violation>
</file>

<file name="static/app/components/scrollCarousel.tsx">

<violation number="1" location="static/app/components/scrollCarousel.tsx:204">
P2: Using CSS `transparent` here will cause a visible dark band artifact in the gradient. `transparent` is `rgba(0,0,0,0)` (transparent **black**), so the gradient interpolates through dark color values on the way to `p.theme.background`. The `LeftMask` correctly avoids this by using `Color(p.theme.background).alpha(0).rgb().string()` — the `RightMask` should do the same for a smooth, artifact-free gradient.</violation>
</file>

<file name="static/app/views/dashboards/widgetCard/chart.tsx">

<violation number="1" location="static/app/views/dashboards/widgetCard/chart.tsx:165">
P1: The `TableWidgetVisualization` is rendered with hardcoded empty `columns` and `tableData` instead of the actual query results available in scope (`result.data`, `result.meta`, `fields`). When the `use-table-widget-visualization` feature flag is enabled, users will see a blank table. Even if this is a scaffold, passing `columns={[]}` (an empty array rather than `undefined`) also defeats the component's own fallback column derivation logic. Consider wiring through the real data, or at minimum omit the `columns` prop so the component can self-derive columns from `tableData.meta`.</violation>
</file>

<file name="src/sentry/issues/endpoints/browser_reporting_collector.py">

<violation number="1" location="src/sentry/issues/endpoints/browser_reporting_collector.py:52">
P1: Bug: Truthiness check `self.initial_data.get("age")` will be falsy when `age=0`, which is a valid value (e.g., a report just generated). This silently bypasses the mutual exclusivity validation, allowing both `age` and `timestamp` to coexist. Use an identity check against `None` or `in` instead.</violation>

<violation number="2" location="src/sentry/issues/endpoints/browser_reporting_collector.py:58">
P1: Bug: Same truthiness issue — `self.initial_data.get("timestamp")` will be falsy when `timestamp=0` (allowed by `min_value=0`). This bypasses the mutual exclusivity check.</violation>
</file>

<file name="static/app/views/performance/newTraceDetails/traceWaterfall.tsx">

<violation number="1" location="static/app/views/performance/newTraceDetails/traceWaterfall.tsx:712">
P2: Potential layout regression: the old `FlexBox` had `height: 100%` which is not carried over to the `Flex` component. If any ancestor relies on `height: 100%` to size this container (rather than flexbox), the waterfall may collapse or not fill available vertical space. Consider adding a `style={{ height: '100%' }}` or `h="100%"` prop if the `Flex` component supports it.</violation>
</file>

<file name="static/app/views/feedback/feedbackListPage.tsx">

<violation number="1" location="static/app/views/feedback/feedbackListPage.tsx:125">
P2: `SummaryListContainer` is missing `overflow: hidden` (or `min-height: 0`). As a flex-column container placed in a grid cell, it inherits `min-height: auto` by default, which can prevent it from properly constraining the inner `Container` (a `FluidHeight` component). This can cause the feedback list to overflow its grid area instead of scrolling within the container.</violation>
</file>

<file name="static/app/views/performance/newTraceDetails/traceTabsAndVitals.tsx">

<violation number="1" location="static/app/views/performance/newTraceDetails/traceTabsAndVitals.tsx:27">
P2: Style regression: the second `<Flex>` in `Placeholder` is missing `align="center"` and `gap={space(1)}` that the original `FlexBox` had. The first `FlexBox` replacement correctly includes these props — this one should too.</violation>

<violation number="2" location="static/app/views/performance/newTraceDetails/traceTabsAndVitals.tsx:93">
P2: Style regression: the main `Container` replacement is missing `align="center"` and `gap={space(1)}` that the original `Container` (which extended `FlexBox`) had. Compare with the `Placeholder` component's outer `Flex`, which correctly preserves all three properties.</violation>
</file>

<file name="devservices/config.yml">

<violation number="1" location="devservices/config.yml:171">
P2: New subscription results consumers are missing from `full` and `ingest-all` modes. Both modes appear to be comprehensive configurations that include all consumers, yet the four new consumers (`eap-spans-subscription-results`, `subscription-results-eap-items`, `metrics-subscription-results`, `generic-metrics-subscription-results`) added here are only included in the `tracing` mode. They should likely be added to `full` and `ingest-all` as well for consistency.</violation>
</file>

<file name="static/app/components/feedback/list/useFeedbackSummary.tsx">

<violation number="1" location="static/app/components/feedback/list/useFeedbackSummary.tsx:37">
P2: `Boolean(normalizedDateRange)` is always `true` because `normalizeDateTimeParams` returns a plain object, which is inherently truthy in JavaScript. This guard has no effect. If the intent is to verify that meaningful date parameters exist, check for specific properties instead (e.g., that `start`/`end` or `statsPeriod` is present).</violation>
</file>

<file name="static/app/views/performance/newTraceDetails/traceDrawer/details/span/eapSections/attributes.tsx">

<violation number="1" location="static/app/views/performance/newTraceDetails/traceDrawer/details/span/eapSections/attributes.tsx:67">
P1: Bug: `HIDDEN_ATTRIBUTES` are only filtered when a search query is present. When the search box is empty (default view), the early return on line 65 (`return sorted;`) skips the hidden-attributes filter entirely, so `is_segment`, `project_id`, and `received` will still be displayed. The filter should be applied unconditionally.</violation>
</file>

<file name="src/sentry/integrations/source_code_management/commit_context.py">

<violation number="1" location="src/sentry/integrations/source_code_management/commit_context.py:582">
P2: `_truncate_title` can return a string up to `max_length + 3` characters due to the appended `"..."`. If the intent of `ISSUE_TITLE_MAX_LENGTH = 50` is to cap the final output at 50 characters, the slice should account for the ellipsis (e.g., `title[:max_length - 3]`).</violation>
</file>

<file name="static/app/components/feedback/feedbackSummary.tsx">

<violation number="1" location="static/app/components/feedback/feedbackSummary.tsx:11">
P2: Missing null/empty guard on `summary` before rendering. If the API returns successfully but with `summary: null` (or an empty string), the component will render the summary container with a header but no content. Add a check for `!summary` alongside the other early-return conditions.</violation>
</file>

<file name="static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx">

<violation number="1" location="static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx:37">
P2: Overly broad dependency: `useMemo` depends on `selection` but only uses `selection.datetime`. This causes unnecessary recomputations when unrelated parts of `selection` (e.g., `environments`) change.</violation>
</file>

<file name="src/sentry/hybridcloud/tasks/deliver_webhooks.py">

<violation number="1" location="src/sentry/hybridcloud/tasks/deliver_webhooks.py:239">
P1: `processing_deadline_duration=120` (2 min) is shorter than the task's internal `BATCH_SCHEDULE_OFFSET` deadline of 3 minutes. The taskworker will consider this task timed out before the internal delivery loop naturally breaks. This should be at least 180 seconds, or ideally match `drain_mailbox`'s 300 seconds to provide buffer for the stale-message cleanup that precedes the loop.</violation>
</file>

<file name="static/app/components/events/eventAttachments.tsx">

<violation number="1" location="static/app/components/events/eventAttachments.tsx:143">
P2: Replacing `FlexCenter` with `<Flex align="center">` drops `overflow: hidden` from the container. In a CSS grid with `1fr` column, this means long attachment names will overflow instead of truncating with ellipsis. The flex container needs `overflow: hidden` or `min-width: 0` so the child `Name`'s `text-overflow: ellipsis` can take effect.</violation>
</file>

<file name="src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py">

<violation number="1" location="src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py:118">
P1: Bug: `zip(error_ids, events.values())` will misalign error IDs with event data when nodestore entries are missing. The dict returned by `get_multi` is keyed by `node_id`, and missing entries shrink the dict, causing subsequent IDs to pair with wrong data. Instead, iterate over `(error_id, node_id)` pairs and look up each node_id in the dict.</violation>

<violation number="2" location="src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py:155">
P1: Potential timestamp unit mismatch: error event timestamps from nodestore are in Unix seconds while RRWeb replay segment event timestamps are in milliseconds. This comparison will always evaluate to `True` (seconds << milliseconds), causing all errors to be emitted before any breadcrumb events rather than being interleaved chronologically. Consider converting one format to match the other (e.g., `error_timestamp * 1000` or `event_timestamp / 1000`).</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment on lines +165 to +174
<TableWidgetVisualization
columns={[]}
tableData={{
data: [],
meta: {
fields: {},
units: {},
},
}}
/>

@cubic-dev-ai cubic-dev-ai Bot Feb 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: The TableWidgetVisualization is rendered with hardcoded empty columns and tableData instead of the actual query results available in scope (result.data, result.meta, fields). When the use-table-widget-visualization feature flag is enabled, users will see a blank table. Even if this is a scaffold, passing columns={[]} (an empty array rather than undefined) also defeats the component's own fallback column derivation logic. Consider wiring through the real data, or at minimum omit the columns prop so the component can self-derive columns from tableData.meta.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At static/app/views/dashboards/widgetCard/chart.tsx, line 165:

<comment>The `TableWidgetVisualization` is rendered with hardcoded empty `columns` and `tableData` instead of the actual query results available in scope (`result.data`, `result.meta`, `fields`). When the `use-table-widget-visualization` feature flag is enabled, users will see a blank table. Even if this is a scaffold, passing `columns={[]}` (an empty array rather than `undefined`) also defeats the component's own fallback column derivation logic. Consider wiring through the real data, or at minimum omit the `columns` prop so the component can self-derive columns from `tableData.meta`.</comment>

<file context>
@@ -162,23 +161,36 @@ class WidgetCardChart extends Component<WidgetCardChartProps> {
-            minColumnWidth={minTableColumnWidth}
-          />
+          {organization.features.includes('use-table-widget-visualization') ? (
+            <TableWidgetVisualization
+              columns={[]}
+              tableData={{
</file context>
Suggested change
<TableWidgetVisualization
columns={[]}
tableData={{
data: [],
meta: {
fields: {},
units: {},
},
}}
/>
<TableWidgetVisualization
tableData={{
data: result.data,
meta: {
fields: result.meta?.fields ?? {},
units: result.meta?.units ?? {},
},
}}
/>
Fix with Cubic


def validate_age(self, value: int) -> int:
"""Validate that age is present, but not timestamp."""
if self.initial_data.get("timestamp"):

@cubic-dev-ai cubic-dev-ai Bot Feb 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Bug: Same truthiness issue — self.initial_data.get("timestamp") will be falsy when timestamp=0 (allowed by min_value=0). This bypasses the mutual exclusivity check.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/sentry/issues/endpoints/browser_reporting_collector.py, line 58:

<comment>Bug: Same truthiness issue — `self.initial_data.get("timestamp")` will be falsy when `timestamp=0` (allowed by `min_value=0`). This bypasses the mutual exclusivity check.</comment>

<file context>
@@ -17,30 +18,46 @@
+
+    def validate_age(self, value: int) -> int:
+        """Validate that age is present, but not timestamp."""
+        if self.initial_data.get("timestamp"):
+            raise serializers.ValidationError("If age is present, timestamp must be absent")
+        return value
</file context>
Suggested change
if self.initial_data.get("timestamp"):
if "timestamp" in self.initial_data:
Fix with Cubic


def validate_timestamp(self, value: int) -> int:
"""Validate that age is absent, but timestamp is present."""
if self.initial_data.get("age"):

@cubic-dev-ai cubic-dev-ai Bot Feb 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Bug: Truthiness check self.initial_data.get("age") will be falsy when age=0, which is a valid value (e.g., a report just generated). This silently bypasses the mutual exclusivity validation, allowing both age and timestamp to coexist. Use an identity check against None or in instead.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/sentry/issues/endpoints/browser_reporting_collector.py, line 52:

<comment>Bug: Truthiness check `self.initial_data.get("age")` will be falsy when `age=0`, which is a valid value (e.g., a report just generated). This silently bypasses the mutual exclusivity validation, allowing both `age` and `timestamp` to coexist. Use an identity check against `None` or `in` instead.</comment>

<file context>
@@ -17,30 +18,46 @@
+
+    def validate_timestamp(self, value: int) -> int:
+        """Validate that age is absent, but timestamp is present."""
+        if self.initial_data.get("age"):
+            raise serializers.ValidationError("If timestamp is present, age must be absent")
+        return value
</file context>
Suggested change
if self.initial_data.get("age"):
if "age" in self.initial_data:
Fix with Cubic

@@ -31,6 +31,8 @@ import {makeReplaysPathname} from 'sentry/views/replays/pathnames';

@cubic-dev-ai cubic-dev-ai Bot Feb 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Bug: HIDDEN_ATTRIBUTES are only filtered when a search query is present. When the search box is empty (default view), the early return on line 65 (return sorted;) skips the hidden-attributes filter entirely, so is_segment, project_id, and received will still be displayed. The filter should be applied unconditionally.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At static/app/views/performance/newTraceDetails/traceDrawer/details/span/eapSections/attributes.tsx, line 67:

<comment>Bug: `HIDDEN_ATTRIBUTES` are only filtered when a search query is present. When the search box is empty (default view), the early return on line 65 (`return sorted;`) skips the hidden-attributes filter entirely, so `is_segment`, `project_id`, and `received` will still be displayed. The filter should be applied unconditionally.</comment>

<file context>
@@ -60,8 +62,10 @@ export function Attributes({
-      attribute.name.toLowerCase().trim().includes(searchQuery.toLowerCase().trim())
+    return sorted.filter(
+      attribute =>
+        !HIDDEN_ATTRIBUTES.includes(attribute.name) &&
+        attribute.name.toLowerCase().trim().includes(searchQuery.toLowerCase().trim())
     );
</file context>
Fix with Cubic

silo_mode=SiloMode.CONTROL,
taskworker_config=TaskworkerConfig(
namespace=hybridcloud_control_tasks,
processing_deadline_duration=120,

@cubic-dev-ai cubic-dev-ai Bot Feb 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: processing_deadline_duration=120 (2 min) is shorter than the task's internal BATCH_SCHEDULE_OFFSET deadline of 3 minutes. The taskworker will consider this task timed out before the internal delivery loop naturally breaks. This should be at least 180 seconds, or ideally match drain_mailbox's 300 seconds to provide buffer for the stale-message cleanup that precedes the loop.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/sentry/hybridcloud/tasks/deliver_webhooks.py, line 239:

<comment>`processing_deadline_duration=120` (2 min) is shorter than the task's internal `BATCH_SCHEDULE_OFFSET` deadline of 3 minutes. The taskworker will consider this task timed out before the internal delivery loop naturally breaks. This should be at least 180 seconds, or ideally match `drain_mailbox`'s 300 seconds to provide buffer for the stale-message cleanup that precedes the loop.</comment>

<file context>
@@ -234,6 +236,7 @@ def drain_mailbox(payload_id: int) -> None:
     silo_mode=SiloMode.CONTROL,
     taskworker_config=TaskworkerConfig(
         namespace=hybridcloud_control_tasks,
+        processing_deadline_duration=120,
     ),
 )
</file context>
Suggested change
processing_deadline_duration=120,
processing_deadline_duration=300,
Fix with Cubic

"""Truncate title if it's too long and add ellipsis."""
if len(title) <= max_length:
return title
return title[:max_length].rstrip() + "..."

@cubic-dev-ai cubic-dev-ai Bot Feb 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: _truncate_title can return a string up to max_length + 3 characters due to the appended "...". If the intent of ISSUE_TITLE_MAX_LENGTH = 50 is to cap the final output at 50 characters, the slice should account for the ellipsis (e.g., title[:max_length - 3]).

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/sentry/integrations/source_code_management/commit_context.py, line 582:

<comment>`_truncate_title` can return a string up to `max_length + 3` characters due to the appended `"..."`. If the intent of `ISSUE_TITLE_MAX_LENGTH = 50` is to cap the final output at 50 characters, the slice should account for the ellipsis (e.g., `title[:max_length - 3]`).</comment>

<file context>
@@ -570,6 +574,37 @@ def get_top_5_issues_by_count(
+        """Truncate title if it's too long and add ellipsis."""
+        if len(title) <= max_length:
+            return title
+        return title[:max_length].rstrip() + "..."
+
+    def get_environment_info(self, issue: Group) -> str:
</file context>
Suggested change
return title[:max_length].rstrip() + "..."
return title[:max_length - 3].rstrip() + "..."
Fix with Cubic

import useOrganization from 'sentry/utils/useOrganization';

export default function FeedbackSummary() {
const {isError, isPending, summary, tooFewFeedbacks} = useFeedbackSummary();

@cubic-dev-ai cubic-dev-ai Bot Feb 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Missing null/empty guard on summary before rendering. If the API returns successfully but with summary: null (or an empty string), the component will render the summary container with a header but no content. Add a check for !summary alongside the other early-return conditions.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At static/app/components/feedback/feedbackSummary.tsx, line 11:

<comment>Missing null/empty guard on `summary` before rendering. If the API returns successfully but with `summary: null` (or an empty string), the component will render the summary container with a header but no content. Add a check for `!summary` alongside the other early-return conditions.</comment>

<file context>
@@ -0,0 +1,64 @@
+import useOrganization from 'sentry/utils/useOrganization';
+
+export default function FeedbackSummary() {
+  const {isError, isPending, summary, tooFewFeedbacks} = useFeedbackSummary();
+
+  const organization = useOrganization();
</file context>
Fix with Cubic

datetime: selection.datetime,
projectIds,
});
}, [selection, traceItemType, type, projectIds]);

@cubic-dev-ai cubic-dev-ai Bot Feb 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Overly broad dependency: useMemo depends on selection but only uses selection.datetime. This causes unnecessary recomputations when unrelated parts of selection (e.g., environments) change.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx, line 37:

<comment>Overly broad dependency: `useMemo` depends on `selection` but only uses `selection.datetime`. This causes unnecessary recomputations when unrelated parts of `selection` (e.g., `environments`) change.</comment>

<file context>
@@ -36,76 +21,43 @@ export function useTraceItemAttributeKeys({
+      datetime: selection.datetime,
+      projectIds,
+    });
+  }, [selection, traceItemType, type, projectIds]);
+
+  const queryKey = useMemo(
</file context>
Suggested change
}, [selection, traceItemType, type, projectIds]);
}, [selection.datetime, traceItemType, type, projectIds]);
Fix with Cubic

{attachments.map(attachment => (
<Fragment key={attachment.id}>
<FlexCenter>
<Flex align="center">

@cubic-dev-ai cubic-dev-ai Bot Feb 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Replacing FlexCenter with <Flex align="center"> drops overflow: hidden from the container. In a CSS grid with 1fr column, this means long attachment names will overflow instead of truncating with ellipsis. The flex container needs overflow: hidden or min-width: 0 so the child Name's text-overflow: ellipsis can take effect.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At static/app/components/events/eventAttachments.tsx, line 143:

<comment>Replacing `FlexCenter` with `<Flex align="center">` drops `overflow: hidden` from the container. In a CSS grid with `1fr` column, this means long attachment names will overflow instead of truncating with ellipsis. The flex container needs `overflow: hidden` or `min-width: 0` so the child `Name`'s `text-overflow: ellipsis` can take effect.</comment>

<file context>
@@ -139,9 +140,10 @@ function EventAttachmentsContent({
           {attachments.map(attachment => (
             <Fragment key={attachment.id}>
-              <FlexCenter>
+              <Flex align="center">
                 <Name>{attachment.name}</Name>
-              </FlexCenter>
</file context>
Suggested change
<Flex align="center">
<Flex align="center" style={{overflow: 'hidden'}}>
Fix with Cubic


def _make_recording_filenames(project_id: int, row: MatchedRow) -> list[str]:
# Null segment_ids can cause this to fail. If no segments were ingested then we can skip
# deleting the segements.

@cubic-dev-ai cubic-dev-ai Bot Feb 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: Typo: "segements" should be "segments".

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/sentry/replays/usecases/delete.py, line 88:

<comment>Typo: "segements" should be "segments".</comment>

<file context>
@@ -84,6 +84,11 @@ def _delete_if_exists(filename: str) -> None:
 
 def _make_recording_filenames(project_id: int, row: MatchedRow) -> list[str]:
+    # Null segment_ids can cause this to fail. If no segments were ingested then we can skip
+    # deleting the segements.
+    if row["max_segment_id"] is None:
+        return []
</file context>
Suggested change
# deleting the segements.
# deleting the segments.
Fix with Cubic

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.