From 3d9694caeb0e03d3293bbc622ea0232dfd579297 Mon Sep 17 00:00:00 2001 From: sehr-m <58871345+sehr-m@users.noreply.github.com> Date: Tue, 10 Nov 2026 13:27:38 -0800 Subject: [PATCH 1/5] feat(billing): share Seer billing feature identifiers --- .../v1/common/v1/seer_billing_feature.proto | 55 +++++++ .../src/sentry_protos.billing.v1.common.v1.rs | 151 ++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 proto/sentry_protos/billing/v1/common/v1/seer_billing_feature.proto diff --git a/proto/sentry_protos/billing/v1/common/v1/seer_billing_feature.proto b/proto/sentry_protos/billing/v1/common/v1/seer_billing_feature.proto new file mode 100644 index 00000000..02bfe889 --- /dev/null +++ b/proto/sentry_protos/billing/v1/common/v1/seer_billing_feature.proto @@ -0,0 +1,55 @@ +syntax = "proto3"; + +package sentry_protos.billing.v1.common.v1; + +// Identifies the feature responsible for Seer usage, independently of the +// program executing the work. Whether usage is chargeable is billing policy. +// Set by trusted server entrypoints; persisted attribution is preserved for +// subsequent operations on the same run. +// For concrete values, the billing/proxy label is the lowercase enum name +// with the SEER_BILLING_FEATURE_ prefix removed. +enum SeerBillingFeature { + // Missing attribution, not a real feature or a billing exemption. + // New runs must provide a concrete feature. Legacy runs need an explicit + // compatibility fallback in the consuming application. + SEER_BILLING_FEATURE_UNSPECIFIED = 0; + + SEER_BILLING_FEATURE_AUTOFIX_WEB = 1; + SEER_BILLING_FEATURE_AUTOFIX_HEADLESS = 2; + SEER_BILLING_FEATURE_AUTOFIX_INTEGRATIONS = 3; + SEER_BILLING_FEATURE_AUTOFIX_AGENTIC_TRIAGE = 4; + SEER_BILLING_FEATURE_AUTOFIX_POST_PROCESS = 5; + + SEER_BILLING_FEATURE_SEER_AGENT = 6; + SEER_BILLING_FEATURE_SEER_AGENT_SLACK = 7; + SEER_BILLING_FEATURE_SEER_AGENT_SUGGESTIONS = 8; + SEER_BILLING_FEATURE_AGENTIC_TRIAGE = 9; + SEER_BILLING_FEATURE_RUN_QUESTIONS = 10; + SEER_BILLING_FEATURE_INVESTIGATIONS = 11; + + SEER_BILLING_FEATURE_SMART_ASSIGNMENT = 12; + SEER_BILLING_FEATURE_MONITOR_CLEANUP = 13; + SEER_BILLING_FEATURE_IMPACT_ASSESSMENT = 14; + SEER_BILLING_FEATURE_DASHBOARD_GENERATION = 15; + SEER_BILLING_FEATURE_CONTEXT_INDEXING = 16; + SEER_BILLING_FEATURE_ISSUE_SUMMARY = 17; + SEER_BILLING_FEATURE_FIXABILITY = 18; + SEER_BILLING_FEATURE_USER_FEEDBACK = 19; + SEER_BILLING_FEATURE_REPLAY_SUMMARY = 20; + SEER_BILLING_FEATURE_ISSUE_VIEW_TITLE = 21; + SEER_BILLING_FEATURE_EXTERNAL_ISSUE_DETAILS = 22; + SEER_BILLING_FEATURE_UPTIME_ASSERTIONS = 23; + SEER_BILLING_FEATURE_ISSUE_DETECTION = 24; + SEER_BILLING_FEATURE_LOW_VALUE_SPANS = 25; + SEER_BILLING_FEATURE_MALICIOUS_ISSUE_DETECTION = 26; + + SEER_BILLING_FEATURE_CODE_REVIEW = 27; + SEER_BILLING_FEATURE_PR_METRICS = 28; + SEER_BILLING_FEATURE_ASSISTED_QUERY = 29; + SEER_BILLING_FEATURE_EVALS = 30; + SEER_BILLING_FEATURE_AI_MONITORING = 31; + SEER_BILLING_FEATURE_INBOUND_FILTERS = 32; + SEER_BILLING_FEATURE_SEVERITY = 33; + SEER_BILLING_FEATURE_GROUPING = 34; + SEER_BILLING_FEATURE_MODEL_TRAINING = 35; +} diff --git a/rust/src/sentry_protos.billing.v1.common.v1.rs b/rust/src/sentry_protos.billing.v1.common.v1.rs index bc371920..5a39e76b 100644 --- a/rust/src/sentry_protos.billing.v1.common.v1.rs +++ b/rust/src/sentry_protos.billing.v1.common.v1.rs @@ -799,6 +799,157 @@ impl SeatStatus { } } } +/// Identifies the feature responsible for Seer usage, independently of the +/// program executing the work. Whether usage is chargeable is billing policy. +/// Set by trusted server entrypoints; persisted attribution is preserved for +/// subsequent operations on the same run. +/// For concrete values, the billing/proxy label is the lowercase enum name +/// with the SEER_BILLING_FEATURE\_ prefix removed. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum SeerBillingFeature { + /// Missing attribution, not a real feature or a billing exemption. + /// New runs must provide a concrete feature. Legacy runs need an explicit + /// compatibility fallback in the consuming application. + Unspecified = 0, + AutofixWeb = 1, + AutofixHeadless = 2, + AutofixIntegrations = 3, + AutofixAgenticTriage = 4, + AutofixPostProcess = 5, + SeerAgent = 6, + SeerAgentSlack = 7, + SeerAgentSuggestions = 8, + AgenticTriage = 9, + RunQuestions = 10, + Investigations = 11, + SmartAssignment = 12, + MonitorCleanup = 13, + ImpactAssessment = 14, + DashboardGeneration = 15, + ContextIndexing = 16, + IssueSummary = 17, + Fixability = 18, + UserFeedback = 19, + ReplaySummary = 20, + IssueViewTitle = 21, + ExternalIssueDetails = 22, + UptimeAssertions = 23, + IssueDetection = 24, + LowValueSpans = 25, + MaliciousIssueDetection = 26, + CodeReview = 27, + PrMetrics = 28, + AssistedQuery = 29, + Evals = 30, + AiMonitoring = 31, + InboundFilters = 32, + Severity = 33, + Grouping = 34, + ModelTraining = 35, +} +impl SeerBillingFeature { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "SEER_BILLING_FEATURE_UNSPECIFIED", + Self::AutofixWeb => "SEER_BILLING_FEATURE_AUTOFIX_WEB", + Self::AutofixHeadless => "SEER_BILLING_FEATURE_AUTOFIX_HEADLESS", + Self::AutofixIntegrations => "SEER_BILLING_FEATURE_AUTOFIX_INTEGRATIONS", + Self::AutofixAgenticTriage => "SEER_BILLING_FEATURE_AUTOFIX_AGENTIC_TRIAGE", + Self::AutofixPostProcess => "SEER_BILLING_FEATURE_AUTOFIX_POST_PROCESS", + Self::SeerAgent => "SEER_BILLING_FEATURE_SEER_AGENT", + Self::SeerAgentSlack => "SEER_BILLING_FEATURE_SEER_AGENT_SLACK", + Self::SeerAgentSuggestions => "SEER_BILLING_FEATURE_SEER_AGENT_SUGGESTIONS", + Self::AgenticTriage => "SEER_BILLING_FEATURE_AGENTIC_TRIAGE", + Self::RunQuestions => "SEER_BILLING_FEATURE_RUN_QUESTIONS", + Self::Investigations => "SEER_BILLING_FEATURE_INVESTIGATIONS", + Self::SmartAssignment => "SEER_BILLING_FEATURE_SMART_ASSIGNMENT", + Self::MonitorCleanup => "SEER_BILLING_FEATURE_MONITOR_CLEANUP", + Self::ImpactAssessment => "SEER_BILLING_FEATURE_IMPACT_ASSESSMENT", + Self::DashboardGeneration => "SEER_BILLING_FEATURE_DASHBOARD_GENERATION", + Self::ContextIndexing => "SEER_BILLING_FEATURE_CONTEXT_INDEXING", + Self::IssueSummary => "SEER_BILLING_FEATURE_ISSUE_SUMMARY", + Self::Fixability => "SEER_BILLING_FEATURE_FIXABILITY", + Self::UserFeedback => "SEER_BILLING_FEATURE_USER_FEEDBACK", + Self::ReplaySummary => "SEER_BILLING_FEATURE_REPLAY_SUMMARY", + Self::IssueViewTitle => "SEER_BILLING_FEATURE_ISSUE_VIEW_TITLE", + Self::ExternalIssueDetails => "SEER_BILLING_FEATURE_EXTERNAL_ISSUE_DETAILS", + Self::UptimeAssertions => "SEER_BILLING_FEATURE_UPTIME_ASSERTIONS", + Self::IssueDetection => "SEER_BILLING_FEATURE_ISSUE_DETECTION", + Self::LowValueSpans => "SEER_BILLING_FEATURE_LOW_VALUE_SPANS", + Self::MaliciousIssueDetection => { + "SEER_BILLING_FEATURE_MALICIOUS_ISSUE_DETECTION" + } + Self::CodeReview => "SEER_BILLING_FEATURE_CODE_REVIEW", + Self::PrMetrics => "SEER_BILLING_FEATURE_PR_METRICS", + Self::AssistedQuery => "SEER_BILLING_FEATURE_ASSISTED_QUERY", + Self::Evals => "SEER_BILLING_FEATURE_EVALS", + Self::AiMonitoring => "SEER_BILLING_FEATURE_AI_MONITORING", + Self::InboundFilters => "SEER_BILLING_FEATURE_INBOUND_FILTERS", + Self::Severity => "SEER_BILLING_FEATURE_SEVERITY", + Self::Grouping => "SEER_BILLING_FEATURE_GROUPING", + Self::ModelTraining => "SEER_BILLING_FEATURE_MODEL_TRAINING", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "SEER_BILLING_FEATURE_UNSPECIFIED" => Some(Self::Unspecified), + "SEER_BILLING_FEATURE_AUTOFIX_WEB" => Some(Self::AutofixWeb), + "SEER_BILLING_FEATURE_AUTOFIX_HEADLESS" => Some(Self::AutofixHeadless), + "SEER_BILLING_FEATURE_AUTOFIX_INTEGRATIONS" => { + Some(Self::AutofixIntegrations) + } + "SEER_BILLING_FEATURE_AUTOFIX_AGENTIC_TRIAGE" => { + Some(Self::AutofixAgenticTriage) + } + "SEER_BILLING_FEATURE_AUTOFIX_POST_PROCESS" => Some(Self::AutofixPostProcess), + "SEER_BILLING_FEATURE_SEER_AGENT" => Some(Self::SeerAgent), + "SEER_BILLING_FEATURE_SEER_AGENT_SLACK" => Some(Self::SeerAgentSlack), + "SEER_BILLING_FEATURE_SEER_AGENT_SUGGESTIONS" => { + Some(Self::SeerAgentSuggestions) + } + "SEER_BILLING_FEATURE_AGENTIC_TRIAGE" => Some(Self::AgenticTriage), + "SEER_BILLING_FEATURE_RUN_QUESTIONS" => Some(Self::RunQuestions), + "SEER_BILLING_FEATURE_INVESTIGATIONS" => Some(Self::Investigations), + "SEER_BILLING_FEATURE_SMART_ASSIGNMENT" => Some(Self::SmartAssignment), + "SEER_BILLING_FEATURE_MONITOR_CLEANUP" => Some(Self::MonitorCleanup), + "SEER_BILLING_FEATURE_IMPACT_ASSESSMENT" => Some(Self::ImpactAssessment), + "SEER_BILLING_FEATURE_DASHBOARD_GENERATION" => { + Some(Self::DashboardGeneration) + } + "SEER_BILLING_FEATURE_CONTEXT_INDEXING" => Some(Self::ContextIndexing), + "SEER_BILLING_FEATURE_ISSUE_SUMMARY" => Some(Self::IssueSummary), + "SEER_BILLING_FEATURE_FIXABILITY" => Some(Self::Fixability), + "SEER_BILLING_FEATURE_USER_FEEDBACK" => Some(Self::UserFeedback), + "SEER_BILLING_FEATURE_REPLAY_SUMMARY" => Some(Self::ReplaySummary), + "SEER_BILLING_FEATURE_ISSUE_VIEW_TITLE" => Some(Self::IssueViewTitle), + "SEER_BILLING_FEATURE_EXTERNAL_ISSUE_DETAILS" => { + Some(Self::ExternalIssueDetails) + } + "SEER_BILLING_FEATURE_UPTIME_ASSERTIONS" => Some(Self::UptimeAssertions), + "SEER_BILLING_FEATURE_ISSUE_DETECTION" => Some(Self::IssueDetection), + "SEER_BILLING_FEATURE_LOW_VALUE_SPANS" => Some(Self::LowValueSpans), + "SEER_BILLING_FEATURE_MALICIOUS_ISSUE_DETECTION" => { + Some(Self::MaliciousIssueDetection) + } + "SEER_BILLING_FEATURE_CODE_REVIEW" => Some(Self::CodeReview), + "SEER_BILLING_FEATURE_PR_METRICS" => Some(Self::PrMetrics), + "SEER_BILLING_FEATURE_ASSISTED_QUERY" => Some(Self::AssistedQuery), + "SEER_BILLING_FEATURE_EVALS" => Some(Self::Evals), + "SEER_BILLING_FEATURE_AI_MONITORING" => Some(Self::AiMonitoring), + "SEER_BILLING_FEATURE_INBOUND_FILTERS" => Some(Self::InboundFilters), + "SEER_BILLING_FEATURE_SEVERITY" => Some(Self::Severity), + "SEER_BILLING_FEATURE_GROUPING" => Some(Self::Grouping), + "SEER_BILLING_FEATURE_MODEL_TRAINING" => Some(Self::ModelTraining), + _ => None, + } + } +} /// Card payment method details. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct Card { From e7cb6b1be59c1bae6a4cc6e2cf09b507500e5134 Mon Sep 17 00:00:00 2001 From: "getsantry[bot]" <66042841+getsantry[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 21:29:26 +0000 Subject: [PATCH 2/5] chore: Regenerate Rust bindings --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 21e07476..002045c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -717,7 +717,7 @@ checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "sentry_protos" -version = "0.112.0" +version = "0.114.0" dependencies = [ "prost", "prost-types", From 91ae02b5c7ecdf1bfb17c21184557f6773f0a66c Mon Sep 17 00:00:00 2001 From: Sehr <58871345+sehr-m@users.noreply.github.com> Date: Tue, 10 Nov 2026 14:13:56 -0800 Subject: [PATCH 3/5] add comment --- rust/src/sentry_protos.billing.v1.common.v1.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rust/src/sentry_protos.billing.v1.common.v1.rs b/rust/src/sentry_protos.billing.v1.common.v1.rs index 5a39e76b..bd566650 100644 --- a/rust/src/sentry_protos.billing.v1.common.v1.rs +++ b/rust/src/sentry_protos.billing.v1.common.v1.rs @@ -820,6 +820,8 @@ pub enum SeerBillingFeature { SeerAgent = 6, SeerAgentSlack = 7, SeerAgentSuggestions = 8, + /// Refers to the actual triage process whereas AutofixAgenticTriage + /// is the Autofix run started after triaging AgenticTriage = 9, RunQuestions = 10, Investigations = 11, From 9854adb8c6e6dd4126ed8538a39bc517ab13f5e5 Mon Sep 17 00:00:00 2001 From: "getsantry[bot]" <66042841+getsantry[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 22:14:54 +0000 Subject: [PATCH 4/5] chore: Regenerate Rust bindings --- rust/src/sentry_protos.billing.v1.common.v1.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/rust/src/sentry_protos.billing.v1.common.v1.rs b/rust/src/sentry_protos.billing.v1.common.v1.rs index bd566650..5a39e76b 100644 --- a/rust/src/sentry_protos.billing.v1.common.v1.rs +++ b/rust/src/sentry_protos.billing.v1.common.v1.rs @@ -820,8 +820,6 @@ pub enum SeerBillingFeature { SeerAgent = 6, SeerAgentSlack = 7, SeerAgentSuggestions = 8, - /// Refers to the actual triage process whereas AutofixAgenticTriage - /// is the Autofix run started after triaging AgenticTriage = 9, RunQuestions = 10, Investigations = 11, From 139701c6d3c42840f504a951749222815e295572 Mon Sep 17 00:00:00 2001 From: sehr-m <58871345+sehr-m@users.noreply.github.com> Date: Tue, 10 Nov 2026 14:21:26 -0800 Subject: [PATCH 5/5] docs(billing): document agentic triage attribution in schema --- .../billing/v1/common/v1/seer_billing_feature.proto | 2 ++ rust/src/sentry_protos.billing.v1.common.v1.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/proto/sentry_protos/billing/v1/common/v1/seer_billing_feature.proto b/proto/sentry_protos/billing/v1/common/v1/seer_billing_feature.proto index 02bfe889..99df442e 100644 --- a/proto/sentry_protos/billing/v1/common/v1/seer_billing_feature.proto +++ b/proto/sentry_protos/billing/v1/common/v1/seer_billing_feature.proto @@ -23,6 +23,8 @@ enum SeerBillingFeature { SEER_BILLING_FEATURE_SEER_AGENT = 6; SEER_BILLING_FEATURE_SEER_AGENT_SLACK = 7; SEER_BILLING_FEATURE_SEER_AGENT_SUGGESTIONS = 8; + // Refers to the actual triage process, whereas AUTOFIX_AGENTIC_TRIAGE + // is the Autofix run started after triaging. SEER_BILLING_FEATURE_AGENTIC_TRIAGE = 9; SEER_BILLING_FEATURE_RUN_QUESTIONS = 10; SEER_BILLING_FEATURE_INVESTIGATIONS = 11; diff --git a/rust/src/sentry_protos.billing.v1.common.v1.rs b/rust/src/sentry_protos.billing.v1.common.v1.rs index 5a39e76b..a329dbac 100644 --- a/rust/src/sentry_protos.billing.v1.common.v1.rs +++ b/rust/src/sentry_protos.billing.v1.common.v1.rs @@ -820,6 +820,8 @@ pub enum SeerBillingFeature { SeerAgent = 6, SeerAgentSlack = 7, SeerAgentSuggestions = 8, + /// Refers to the actual triage process, whereas AUTOFIX_AGENTIC_TRIAGE + /// is the Autofix run started after triaging. AgenticTriage = 9, RunQuestions = 10, Investigations = 11,