fix(composio/triage): demote provider-config-rejection rollups (Sentry TAURI-RUST-1V)#2689
fix(composio/triage): demote provider-config-rejection rollups (Sentry TAURI-RUST-1V)#2689oxoxDev wants to merge 2 commits into
Conversation
…r provider" (Sentry TAURI-RUST-1V) Add the canonical phrase from `reliable.rs:332` to the ProviderConfigRejection classifier. `reliable.rs` rolls every exhausted fallback into `All providers/models failed. Attempts:\n…\nThe model `<id>` may not be available on your provider. Configure a fallback chain via `reliability.model_fallbacks` in …`, which the composio triage subscriber re-reports to Sentry. The remediation lives entirely in the user's `reliability.model_fallbacks` config; Sentry has no remediation path. Drops the bulk of self-hosted Sentry TAURI-RUST-1V (10,692 events / 14d on `tauri-rust` project, dominated by `gemini-3-flash-preview`-style ProviderConfigRejection rollups). Sentry-Issue: TAURI-RUST-1V
…sifier (Sentry TAURI-RUST-1V) Swap the raw `tracing::error!` at memory_sync/composio/bus.rs:354 with `crate::core::observability::report_error_or_expected` so user-config / budget-exhausted rollups from the upstream provider chain get demoted to info-level breadcrumbs instead of surfacing as Sentry errors. Pairs with the new `may not be available on your provider` anchor in `is_provider_config_rejection_message` — together they neutralise the self-hosted Sentry TAURI-RUST-1V noise (10,692 events / 14d) whose inner attempts the provider layer already correctly demoted but whose outer rollup escaped via this raw error emit. Genuine triage runtime bugs that don't classify still reach Sentry unchanged. Sentry-Issue: TAURI-RUST-1V
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThis PR extends provider config-rejection message detection to classify model-fallback exhaustion remediation as user-config state, and updates Composio triage error handling to route through the centralized observability system instead of direct logging. ChangesError Classification and Observability
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Possibly related PRs
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
There was a problem hiding this comment.
LGTM — clean, surgical fix with good test coverage.
Nice work routing the composio triage error path through report_error_or_expected instead of the raw tracing::error!. The new phrase anchor in config_rejection.rs is well-scoped (sole producer at reliable.rs:332) and the cross-referencing comments will help catch drift.
Both changes follow the established pattern used across ~10 other call sites in the codebase. Tests cover the multi-line rollup and bare phrase cases. The {e:#} alternate Display for the error chain in the detail string is correct.
CI note: all failures are Docker login (GHCR auth) issues for the contributor's fork — unrelated to these changes. The Tauri build, E2E suites, and core image build all pass.
Summary
[composio][triage] run_triage failedthrough the central observability classifier instead of rawtracing::error!— so user-config / budget-exhausted rollups from the upstream provider chain get demoted to info-level breadcrumbs."may not be available on your provider"tois_provider_config_rejection_message— the canonical phrase emitted byreliable.rs:332when the user'sreliability.model_fallbackschain is misconfigured.Problem
Self-hosted Sentry
tauri-rustproject's #4 unresolved by event count (14d, sort=freq) is[composio][triage] run_triage failedat 10,692 events. Breadcrumbs show every event boils down to:The reliable-provider stack and the inference observability layer already classify these as user-config — but the bus-level re-emit at
memory_sync/composio/bus.rs:354used a rawtracing::error!that bypassed the classifier entirely.Root cause is user-side: the user's
reliability.model_fallbacksconfig doesn't list a model the provider actually serves. Remediation = fix that config. Sentry has no remediation path.Solution
Two surgical changes, kept as separate micro-commits for review:
src/openhuman/inference/provider/config_rejection.rs— append"may not be available on your provider"to thePHRASEStable feedingis_provider_config_rejection_message. Canonical phrase, anchored toreliable.rs:332(the sole producer in-tree). Comment cross-links the call site so future drift of that wording is caught at review.src/openhuman/memory_sync/composio/bus.rs— swap the rawtracing::error!at L354 withcrate::core::observability::report_error_or_expected(..., "composio", "trigger_triage", &[("label", …)]). Same structured fields as before, but now the classifier runs. Genuine runtime bugs that don't classify still surface as full Sentry errors.The two changes are additive; either landed alone would partially help, but only the pair fully closes the loop.
Submission Checklist
diff-cover) meet the gate enforced by.github/workflows/coverage.yml. Runpnpm test:coverageandpnpm test:rustlocally; PRs below 80% on changed lines will not merge.docs/TEST-COVERAGE-MATRIX.mdreflect this change (orN/A: behaviour-only change)## Relateddocs/RELEASE-MANUAL-SMOKE.md)Closes #NNNin the## Relatedsection## Relatedinstead.Impact
info!breadcrumbs in local trace, so support can still inspect them. Sustained outages — were they ever to indicate a real triage bug — would surface via separate health/escalation paths.Related
tauri-rustproject, 10,692 events / 14d)OPENHUMAN-(TAURI|REACT|CORE)-…andBACKEND-ALPHAHUMAN-…shapes; self-hosted prefix isTAURI-RUST-…. Widen the regex (separate workflow-tooling PR) so the post-merge Sentry resolve sweep finds these IDs.AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
Validation Run
Validation Blocked
Behavior Changes
Parity Contract
Duplicate / Superseded PR Handling
Summary by CodeRabbit
Bug Fixes
Chores