Skip to content

Conversation

@ryan953
Copy link
Member

@ryan953 ryan953 commented Dec 9, 2025

New settings page, summary of project settings inside the Org>Seer settings area.

SCR-20251209-owku

One big deviation from the designs is that I've added a column for Cursor Agent (it could also be labelled something like 'Delegated Agent' because it should be the same for any delegated agent).

We need this because if we're delegating a project to an agent we should:
a) show that it's delegated
b) disable the "PR Creation" toggle. That toggle only applies to Seer, not delegated agents (they'll have their own config elsewhere)

So now we have the column, and a bunch of logic for enabling/disabling the checkboxes
Note that you can only enable delegation by going to the Project Settings page directly, because there's a few options to pick it won't all fit in here.

@github-actions github-actions bot added the Scope: Frontend Automatically applied to PRs that change frontend components label Dec 9, 2025
@ryan953 ryan953 changed the title Ryan953/seer org settings projects feat(seer): Seer org-level bulk project settings Dec 9, 2025
@ryan953 ryan953 changed the title feat(seer): Seer org-level bulk project settings feat(seer): Seer org-level bulk project settings page Dec 9, 2025
@ryan953 ryan953 requested a review from a team December 10, 2025 00:54
@ryan953 ryan953 marked this pull request as ready for review December 10, 2025 00:54
@ryan953 ryan953 requested review from a team as code owners December 10, 2025 00:54
@ryan953 ryan953 requested a review from ivy-sentry December 10, 2025 00:55
@codecov
Copy link

codecov bot commented Dec 10, 2025

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
12807 1 12806 10
View the top 1 failed test(s) by shortest run time
CursorIntegrationCta Stage 2: Integration Installed but Not Configured enables automation when setup button is clicked and automation is disabled
Stack Traces | 1.05s run time
Error: expect(jest.fn()).toHaveBeenCalledWith(...expected)

Expected: {"access": ["project:read"], "allowedDomains": ["*"], "autofixAutomationTuning": "low", "dateCreated": "2017-10-17T02:41:20.000Z", "digestsMaxDelay": 0, "digestsMinDelay": 0, "dynamicSamplingBiases": null, "environments": [], "features": [], "firstEvent": null, "firstTransactionEvent": false, "groupingConfig": "", "hasAccess": true, "hasCustomMetrics": false, "hasFeedbacks": false, "hasFlags": false, "hasInsightsAgentMonitoring": false, "hasInsightsAppStart": false, "hasInsightsAssets": false, "hasInsightsCaches": false, "hasInsightsDb": false, "hasInsightsHttp": false, "hasInsightsMCP": false, "hasInsightsQueues": false, "hasInsightsScreenLoad": false, "hasInsightsVitals": false, "hasLogs": false, "hasMinifiedStackTrace": false, "hasMonitors": false, "hasNewFeedbacks": false, "hasProfiles": false, "hasReplays": false, "hasSessions": false, "hasTraceMetrics": false, "id": "2", "isBookmarked": false, "isInternal": false, "isMember": true, "name": "Project Name", "organization": {"access": ["org:read", "org:write", "org:admin", "org:integrations", "project:read", "project:write", "project:releases", "project:admin", "team:read", "team:write", …], "aggregatedDataConsent": false, "alertsMemberWrite": false, "allowBackgroundAgentDelegation": false, "allowJoinRequests": false, "allowMemberInvite": true, "allowMemberProjectCreation": false, "allowSharedIssues": false, "allowSuperuserAccess": false, "attachmentsRole": "member", "autoEnableCodeReview": false, "autoOpenPrs": false, "availableRoles": [], "avatar": {"avatarType": "default", "avatarUrl": null, "avatarUuid": null}, "codecovAccess": false, "dataScrubber": false, "dataScrubberDefaults": false, "dateCreated": "2017-10-17T02:41:20.000Z", "debugFilesRole": "", "defaultAutofixAutomationTuning": "off", "defaultCodeReviewTriggers": [], "defaultRole": "", "enableSeerCoding": true, "enhancedPrivacy": false, "eventsMemberAdmin": false, "features": [], "githubNudgeInvite": false, "githubPRBot": false, "gitlabPRBot": false, "hideAiFeatures": false, "id": "3", "isDefault": false, "isDynamicallySampled": true, "isEarlyAdopter": false, "issueAlertsThreadFlag": false, "links": {"organizationUrl": "https://org-slug.sentry.io", "regionUrl": "https://us.sentry.io"}, "metricAlertsThreadFlag": false, "name": "Organization Name", "onboardingTasks": [], "openMembership": false, "orgRoleList": [{"desc": "Can manage subscription and billing details.", "id": "billing", "isAllowed": false, "isGlobal": false, "isRetired": false, "isTeamRolesAllowed": false, "is_global": false, "minimumTeamRole": "contributor", "name": "Billing"}, {"desc": "Members can view and act on events, as well as view most other data within the organization.", "id": "member", "isAllowed": false, "isGlobal": false, "isRetired": false, "isTeamRolesAllowed": true, "is_global": false, "minimumTeamRole": "contributor", "name": "Member"}, {"desc": "Admin privileges on any teams of which they're a member. They can create new teams and projects, as well as remove teams and projects on which they already hold membership (or all teams, if open membership is enabled). Additionally, they can manage memberships of teams that they are members of. They cannot invite members to the organization.", "id": "admin", "isAllowed": false, "isGlobal": false, "isRetired": true, "isTeamRolesAllowed": true, "is_global": false, "minimumTeamRole": "admin", "name": "Admin"}, {"desc": "Gains admin access on all teams as well as the ability to add and remove members.", "id": "manager", "isAllowed": false, "isGlobal": true, "isRetired": false, "isTeamRolesAllowed": true, "is_global": true, "minimumTeamRole": "admin", "name": "Manager"}, {"desc": "Gains full permission across the organization. Can manage members as well as perform catastrophic operations such as removing the organization.", "id": "owner", "isAllowed": false, "isGlobal": true, "isRetired": false, "isTeamRolesAllowed": true, "is_global": true, "minimumTeamRole": "admin", "name": "Owner"}], "pendingAccessRequests": 0, "quota": {"accountLimit": null, "maxRate": null, "maxRateInterval": null, "projectLimit": null}, "relayPiiConfig": null, "require2FA": false, "requiresSso": false, "safeFields": [], "samplingMode": "organization", "scrapeJavaScript": true, "scrubIPAddresses": false, "sensitiveFields": [], "slug": "org-slug", "status": {"id": "active", "name": "active"}, "storeCrashReports": 0, "streamlineOnly": true, "targetSampleRate": 1, "teamRoleList": [{"desc": "...", "id": "contributor", "isMinimumRoleFor": "", "isRetired": false, "name": "Contributor"}, {"desc": "...", "id": "admin", "isMinimumRoleFor": "", "isRetired": false, "name": "Team Admin"}], "trustedRelays": []}, "plugins": [], "processingIssues": 0, "relayCustomMetricCardinalityLimit": null, "relayPiiConfig": "", "resolveAge": 0, "safeFields": [], "scrapeJavaScript": true, "scrubIPAddresses": false, "seerScannerAutomation": true, "sensitiveFields": [], "slug": "project-slug", "storeCrashReports": null, "subjectTemplate": "", "team": {"access": ["team:read"], "avatar": {"avatarType": "letter_avatar", "avatarUuid": "f4fcf3561cac4674bca8137632519767"}, "externalTeams": [], "flags": {"idp:provisioned": false}, "hasAccess": false, "id": "1", "isMember": true, "isPending": false, "memberCount": 0, "name": "Team Name", "projects": [], "slug": "team-slug", "teamRole": null}, "teams": [], "verifySSL": false}

Number of calls: 0

Ignored nodes: comments, script, style
...
    at toHaveBeenCalledWith (.../events/autofix/cursorIntegrationCta.spec.tsx:264:36)
    at runWithExpensiveErrorDiagnosticsDisabled (.../sentry/node_modules/.pnpm/@[email protected]/node_modules/@.../dom/dist/config.js:47:12)
    at checkCallback (.../sentry/node_modules/.pnpm/@[email protected]/node_modules/@.../dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (.../sentry/node_modules/.pnpm/@[email protected]/node_modules/@.../dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (.../sentry/node_modules/.pnpm/[email protected]..../jsdom/browser/Window.js:579:19)
    at listOnTimeout (node:internal/timers:588:17)
    at processTimers (node:internal/timers:523:7)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Comment on lines +158 to +167
onChange={() => {
// This preference can only be turned off, not on, from here.
// You need to go to the project settings page to turn it on.
updateProjectSeerPreferences(
{
repositories: preference?.repositories || [],
automated_run_stopping_point: 'background_agent',
automation_handoff: preference?.automation_handoff,
},
{

This comment was marked as outdated.

Copy link
Member Author

Choose a reason for hiding this comment

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

This is intentional

// const automatedRunStoppingPoint = value ? 'open_pr' : 'code_changes';
// Set preferences.automated_run_stopping_point for all _selectedIds
// See: useUpdateProjectSeerPreferences()
};
Copy link
Contributor

Choose a reason for hiding this comment

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

Bug: Bulk action handlers are empty stub functions

The handleBulkAutoFix and handleBulkPRCreate functions are empty stubs with only comments indicating what they should do. The dropdown menus for bulk "Auto Fix" and "PR Creation" actions are visible and clickable when projects are selected, but clicking them does nothing. Users will expect these bulk actions to work, but they silently fail with no feedback.

Fix in Cursor Fix in Web

Copy link
Member Author

Choose a reason for hiding this comment

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

yup. will revisit this when i have info about the bulk endpoints.

Copy link
Member

@billyvg billyvg left a comment

Choose a reason for hiding this comment

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

Something weird happens when I load/switch the tab, it redirects me to prod. not sure if it's just env related.

project: Project;
}

export default function SeerProjectTableRow({project, organization}: Props) {
Copy link
Member

Choose a reason for hiding this comment

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

As a follow-up we should split this component up so that we can memoize the row, should improve perf a bit with large tables.

@ryan953
Copy link
Member Author

ryan953 commented Dec 10, 2025

Something weird happens when I load/switch the tab, it redirects me to prod. not sure if it's just env related.

I'm not seeing this in dev locally. That could be something env related in https://github.com/getsentry/sentry/blob/master/static/gsApp/views/seerAutomation/components/settingsPageTabs.tsx

@ryan953 ryan953 merged commit 1ec3abb into master Dec 10, 2025
46 checks passed
@ryan953 ryan953 deleted the ryan953/seer-org-settings-projects branch December 10, 2025 17:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Scope: Frontend Automatically applied to PRs that change frontend components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants