Skip to content

fix(chat): sanitize agent/cron failures and add user-safe error fallback with Sentry reporting#1332

Merged
senamakel merged 6 commits intotinyhumansai:mainfrom
YellowSnnowmann:feat/error-abstraction
May 7, 2026
Merged

fix(chat): sanitize agent/cron failures and add user-safe error fallback with Sentry reporting#1332
senamakel merged 6 commits intotinyhumansai:mainfrom
YellowSnnowmann:feat/error-abstraction

Conversation

@YellowSnnowmann
Copy link
Copy Markdown
Contributor

@YellowSnnowmann YellowSnnowmann commented May 7, 2026

Summary

  • Replaced raw technical agent failure text in chat with a user-friendly fallback message

  • Added consistent error UX:

    • “Something went wrong…”
    • “This error has been reported…”
    • “Report on Discord” action
  • Sanitized web-channel chat_error payloads:

    • Prevent internal URLs and transport details from leaking to users
  • Added structured observability reporting:

    • Web-channel inference failures
    • Cron agent job failures
    • Includes Sentry context/tags
  • Updated cron agent job failures:

    • Return sanitized user-safe content
    • Avoid raw transport/infrastructure errors
  • Added/updated tests:

    • Prevent regression of technical error leakage in user-visible chat surfaces

Problem

  • Agent and cron failures could expose:

    • Internal API URLs
    • Transport-layer errors
    • Raw infrastructure/debug strings
  • Resulted in:

    • Poor UX
    • Unnecessary internal detail exposure
    • Weak incident visibility
  • Needed:

    • Safe user-facing messaging
    • Preserved developer diagnostics

Solution

  • Introduced user-facing fallback error messaging:

    • Applied in chat runtime
    • Applied in web-channel error publishing
  • Standardized fallback copy:

    • Includes Discord escalation path via:
      • <openhuman-link path="community/discord">Report on Discord</openhuman-link>
  • Added backend observability reporting:

    • core::observability::report_error(...)
    • Used for:
      • failed web-channel turns
      • cron agent execution failures
  • Improved cron scheduler behavior:

    • Failed jobs now emit sanitized output
    • Prevent raw error sending request for url (...) exposure
  • Added regression coverage:

    • Chat error sanitization
    • Discord link presence
    • Generic fallback message contract
    • Cron failure sanitization

Tradeoffs

  • Existing historical chat messages are not rewritten
  • Sanitization applies only to new events and future runs

Submission Checklist

  • Tests

    • Added/updated per docs/TESTING-STRATEGY.md
    • Includes:
      • happy paths
      • failure/edge cases
  • Coverage

    • Diff coverage ≥ 80%
    • Enforced via:
      • .github/workflows/coverage.yml
    • Commands:
      • pnpm test:coverage
      • pnpm test:rust
  • Coverage Matrix

    • Updated in:
      • docs/TEST-COVERAGE-MATRIX.md
    • Or marked N/A where appropriate
  • Feature IDs

    • Listed under ## Related
  • Network Dependencies

    • No new external dependencies
    • Uses mock backend per testing strategy
  • Manual Smoke Checklist

    • Updated if release surfaces affected:
      • docs/RELEASE-MANUAL-SMOKE.md
  • Linked Issues

    • Added via:
      • Closes #NNN

Impact

  • Platform / Runtime

    • Affects:
      • desktop chat UX
      • cron-delivered chat notifications
    • No protocol/schema breaking changes
  • Security

    • Reduces exposure of:
      • internal URLs
      • technical error strings
  • Observability

    • Improves production debugging:
      • structured reporting
      • tags/context in Sentry
  • Compatibility

    • Backward compatible
    • Existing historical messages unchanged
  • Performance

    • Negligible overhead
    • Small formatting/reporting cost on failure paths only

Related

Summary by CodeRabbit

  • Bug Fixes

    • Standardized and sanitized user-facing error messages across chat, web channel, and scheduled agent jobs to remove raw/internal transport details.
    • Prevented duplicate fallback error bubbles from being appended.
    • Added a “Report on Discord” action and confirmation in user-facing failure copy.
  • Tests

    • Added tests for sanitized error messages, deduplication behavior, and scheduler/agent failure messaging.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 7, 2026

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0822d4ce-c819-4a5d-8b18-b2f6bbd2ddc0

📥 Commits

Reviewing files that changed from the base of the PR and between 343a087 and 1379ec8.

📒 Files selected for processing (1)
  • src/openhuman/channels/providers/web_tests.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/openhuman/channels/providers/web_tests.rs

📝 Walkthrough

Walkthrough

Agent execution failures now report full internal error context to observability while emitting sanitized user-facing messages; shared message constants/helpers were added; frontend appends and deduplicates the shared sanitized bubble; backend and frontend tests validate sanitization and deduplication.

Changes

Error message sanitization and structured reporting

Layer / File(s) Summary
User-facing error message contracts
app/src/providers/ChatRuntimeProvider.tsx, src/openhuman/channels/providers/web.rs, src/openhuman/cron/scheduler.rs
User-facing error message strings and helpers added: USER_FACING_AGENT_ERROR_MESSAGE, generic_inference_error_user_message(), AGENT_JOB_USER_FAILURE_MESSAGE, and agent_session_target_tag.
Structured error reporting and event handling
src/openhuman/channels/providers/web.rs, src/openhuman/cron/scheduler.rs
Error paths report full error context via report_error() and publish sanitized user messages; web provider adds test-only forced-error slot and setter.
Frontend error handling and deduplication
app/src/providers/ChatRuntimeProvider.tsx
ChatRuntimeProvider appends the shared sanitized error bubble on non-cancelled errors and deduplicates by comparing the last thread message to the shared constant.
Frontend error handling tests
app/src/providers/__tests__/ChatRuntimeProvider.test.tsx
Tests assert sanitized inference error bubbles include a Discord report action and that duplicate fallback bubbles are not appended.
Backend error message and reporting tests
src/openhuman/channels/providers/web_tests.rs, src/openhuman/cron/scheduler_tests.rs
Tests verify web channel emits sanitized inference error messages (no raw transport/URL details) and scheduler tests verify user-facing agent job message content, session target tag mapping, and that raw error is preserved separately for reporting.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant WebChannel
  participant Observability
  participant EventBus
  Client->>WebChannel: start_chat / run_chat_task
  WebChannel->>Observability: report_error(internal details + metadata)
  WebChannel->>EventBus: publish(chat_error with generic_inference_error_user_message)
  EventBus->>Client: chat_error (sanitized message + Discord link)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • tinyhumansai/openhuman#587: Both PRs modify ChatRuntimeProvider and related chat error handling (introducing/using a standardized user-facing inference error message and dedupe logic).

Suggested reviewers

  • senamakel
  • graycyrus

"I hopped in with a gentle cheer,
No raw errors for users here.
We log the details where teams can see,
And show a friendly note to thee.
With Discord links, the bugs come near."

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main objective: sanitizing agent/cron failures and adding user-safe error fallbacks with Sentry reporting.
Linked Issues check ✅ Passed The PR comprehensively addresses all requirements from #1319: sanitizes technical errors, adds Sentry reporting, provides user-friendly fallback messages, and prevents internal URLs from leaking.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the objectives: chat error sanitization, error reporting, fallback messaging, and test coverage for these features.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

Warning

Review ran into problems

🔥 Problems

Timed out fetching pipeline failures after 30000ms


Comment @coderabbitai help to get the list of available commands and usage tips.

@YellowSnnowmann YellowSnnowmann marked this pull request as ready for review May 7, 2026 11:57
@YellowSnnowmann YellowSnnowmann requested a review from a team May 7, 2026 11:57
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
app/src/providers/ChatRuntimeProvider.tsx (1)

718-729: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Guard the fallback bubble with a synchronous per-thread dedupe.

This check reads lastMsg before the async addInferenceResponse(...) thunk updates the store, so two non-cancelled onError events that land back-to-back can both enqueue the same user-facing error bubble. That misses the new dedupe contract for repeated failures. A small useRef/seenChatEventsRef guard keyed by thread_id and set before dispatching would make this atomic enough for the error path.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/providers/ChatRuntimeProvider.tsx` around lines 718 - 729, The
fallback error bubble dispatch can race because you read lastMsg from
store.getState() then asynchronously dispatch addInferenceResponse, allowing
duplicate bubbles on back-to-back non-cancelled errors; fix by adding a
synchronous per-thread dedupe map (e.g. seenChatEventsRef keyed by
event.thread_id) checked and set immediately before calling
dispatch(addInferenceResponse(...)) so the check-and-set is atomic for that
thread; reference and update the same key when the thread recovers/receives a
new non-error message to allow future real messages to show.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@app/src/providers/__tests__/ChatRuntimeProvider.test.tsx`:
- Around line 432-441: The test uses an unreliable setTimeout(0) to wait for the
thunk + mocked threadApi.appendMessage to resolve; replace that timer flush with
a proper waitFor assertion (imported from testing-library) that polls until the
expected call appears. Specifically, remove the await new Promise(resolve =>
setTimeout(resolve, 0)) and wrap the matchingCalls check inside waitFor(() => {
... }) so the code that filters vi.mocked(threadApi.appendMessage).mock.calls
for 't-err-dedupe' and the error string runs repeatedly until it passes.

In `@src/openhuman/channels/providers/web_tests.rs`:
- Around line 62-97: The test
start_chat_emits_sanitized_chat_error_on_inference_failure is nondeterministic
because it waits for a real provider failure; instead inject a deterministic
failure by making run_chat_task (or the agent/provider used by start_chat)
return an error in the test scope and then assert the emitted chat_error;
specifically, modify the test to configure/start the chat with a test-only
failing provider or mock implementation (or patch the agent construction path
used by start_chat) so run_chat_task immediately yields a controlled error, then
subscribe_web_channel_events() and assert the sanitized message equals
generic_inference_error_user_message() and contains no raw transport details.

In `@src/openhuman/channels/providers/web.rs`:
- Around line 274-279: The call to report_error in run_chat_task currently
buries request_id and thread_id inside the formatted error string; update the
report_error invocation to pass request_id and thread_id as structured
tags/extra context instead of only in detailed.as_str(). Locate the report_error
call (the one using detailed.as_str(), "web_channel", "run_chat_task", and the
tags slice with ("channel","web"), ("error_type","inference")) and add
request_id and thread_id to that tags/extra parameters (ensuring you convert
Options or Strings to &str as required by report_error) so Sentry/correlation
can index them directly.

In `@src/openhuman/cron/scheduler.rs`:
- Around line 261-276: The current observability call in the Err(e) branch of
run_agent_job() causes reporting on every retry; move Sentry reporting out of
run_agent_job() so it only happens when execute_job_with_retry() exhausts
retries, or change run_agent_job() to return Result<(bool, String),
anyhow::Error> (i.e., include the raw error alongside the sanitized
AGENT_JOB_USER_FAILURE_MESSAGE) so the caller (execute_job_with_retry() / its
caller) can log/report exactly once on final failure; update call sites to
handle the new return type and perform
crate::core::observability::report_error(...) only when retries are exhausted.

---

Outside diff comments:
In `@app/src/providers/ChatRuntimeProvider.tsx`:
- Around line 718-729: The fallback error bubble dispatch can race because you
read lastMsg from store.getState() then asynchronously dispatch
addInferenceResponse, allowing duplicate bubbles on back-to-back non-cancelled
errors; fix by adding a synchronous per-thread dedupe map (e.g.
seenChatEventsRef keyed by event.thread_id) checked and set immediately before
calling dispatch(addInferenceResponse(...)) so the check-and-set is atomic for
that thread; reference and update the same key when the thread recovers/receives
a new non-error message to allow future real messages to show.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4a696c23-1a28-4f91-a1e8-3ff0242df43f

📥 Commits

Reviewing files that changed from the base of the PR and between ca8e4f6 and 3c1e8f1.

📒 Files selected for processing (6)
  • app/src/providers/ChatRuntimeProvider.tsx
  • app/src/providers/__tests__/ChatRuntimeProvider.test.tsx
  • src/openhuman/channels/providers/web.rs
  • src/openhuman/channels/providers/web_tests.rs
  • src/openhuman/cron/scheduler.rs
  • src/openhuman/cron/scheduler_tests.rs

Comment thread app/src/providers/__tests__/ChatRuntimeProvider.test.tsx Outdated
Comment thread src/openhuman/channels/providers/web_tests.rs
Comment thread src/openhuman/channels/providers/web.rs
Comment thread src/openhuman/cron/scheduler.rs Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/openhuman/channels/providers/web_tests.rs`:
- Around line 64-105: The test must always reset the forced error state; wrap
the setup call to set_test_forced_run_chat_task_error(Some(...)).await with a
RAII guard that ensures cleanup in Drop: create a small guard type (e.g.,
TestForcedRunChatTaskErrorGuard) constructed immediately after setting the
forced error and implement Drop to spawn an async task (tokio::spawn) that calls
set_test_forced_run_chat_task_error(None).await so the async reset runs even if
the test panics or an assert/expect aborts; replace the manual trailing cleanup
call with this guard to guarantee reset.

In `@src/openhuman/cron/scheduler.rs`:
- Around line 114-128: The retry-exhaustion reporting currently sends only the
sanitized AGENT_JOB_USER_FAILURE_MESSAGE (in the Err(_) arm), losing the raw
error; update the logic around the match that checks matches!(job.job_type,
JobType::Agent) so that you preserve the original Err(e) (e.g., capture e before
replacing last_output with AGENT_JOB_USER_FAILURE_MESSAGE) and pass the raw
error details into crate::core::observability::report_error when retries are
exhausted (include the raw error string or its debug display alongside the
existing metadata fields), while continuing to use
AGENT_JOB_USER_FAILURE_MESSAGE for any user-facing output; ensure the change is
applied both at the shown block and the other occurrence around line 278 that
mirrors this behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1b646ac5-6492-4e20-a9c1-b1adea61074c

📥 Commits

Reviewing files that changed from the base of the PR and between 3c1e8f1 and 85458be.

📒 Files selected for processing (4)
  • app/src/providers/__tests__/ChatRuntimeProvider.test.tsx
  • src/openhuman/channels/providers/web.rs
  • src/openhuman/channels/providers/web_tests.rs
  • src/openhuman/cron/scheduler.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/openhuman/channels/providers/web.rs

Comment thread src/openhuman/channels/providers/web_tests.rs
Comment thread src/openhuman/cron/scheduler.rs
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/openhuman/channels/providers/web_tests.rs`:
- Around line 76-79: The test embeds a real internal staging URL in the forced
error string; update the call to set_test_forced_run_chat_task_error in
web_tests.rs to use a placeholder/dummy URL (e.g.,
"https://example.invalid/openai/v1/chat/completions" or any non-sensitive
domain) so the test still simulates a URL-containing transport error but does
not leak internal infrastructure; keep the rest of the assertion logic unchanged
so the code paths in set_test_forced_run_chat_task_error and the chat task error
stripping logic are exercised as before.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0252b32f-3cd9-42aa-bbf4-df00910ce129

📥 Commits

Reviewing files that changed from the base of the PR and between 85458be and 343a087.

📒 Files selected for processing (3)
  • src/openhuman/channels/providers/web_tests.rs
  • src/openhuman/cron/scheduler.rs
  • src/openhuman/cron/scheduler_tests.rs

Comment thread src/openhuman/channels/providers/web_tests.rs
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 7, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/tinyhumansai/openhuman/issues/comments/4396548731","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/tinyhumansai/openhuman/pull/1332)\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> <details>\n> <summary>⚙️ Run configuration</summary>\n> \n> **Configuration used**: Organization UI\n> \n> **Review profile**: CHILL\n> \n> **Plan**: Pro\n> \n> **Run ID**: `0822d4ce-c819-4a5d-8b18-b2f6bbd2ddc0`\n> \n> </details>\n> \n> <details>\n> <summary>📥 Commits</summary>\n> \n> Reviewing files that changed from the base of the PR and between 343a0874028064033fabfc1ef8821246ac0e2032 and 1379ec88620a140a58c5623ffb85decb96f21692.\n> \n> </details>\n> \n> <details>\n> <summary>📒 Files selected for processing (1)</summary>\n> \n> * `src/openhuman/channels/providers/web_tests.rs`\n> \n> </details>\n> \n> ```ascii\n>  ___________________________________________\n> < Buckle up! It's going to be a buggy ride. >\n>  -------------------------------------------\n>   \\\n>    \\   (\\__/)\n>        (•ㅅ•)\n>        /   づ\n> ```\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nAgent execution failures now report full internal error context to observability while emitting sanitized user-facing messages; shared message constants/helpers were added; frontend appends and deduplicates the shared sanitized bubble; backend and frontend tests validate sanitization and deduplication.\n\n## Changes\n\n**Error message sanitization and structured reporting**\n\n|Layer / File(s)|Summary|\n|---|---|\n|**User-facing error message contracts** <br> `app/src/providers/ChatRuntimeProvider.tsx`, `src/openhuman/channels/providers/web.rs`, `src/openhuman/cron/scheduler.rs`|User-facing error message strings and helpers added: `USER_FACING_AGENT_ERROR_MESSAGE`, `generic_inference_error_user_message()`, `AGENT_JOB_USER_FAILURE_MESSAGE`, and `agent_session_target_tag`.|\n|**Structured error reporting and event handling** <br> `src/openhuman/channels/providers/web.rs`, `src/openhuman/cron/scheduler.rs`|Error paths report full error context via `report_error()` and publish sanitized user messages; web provider adds test-only forced-error slot and setter.|\n|**Frontend error handling and deduplication** <br> `app/src/providers/ChatRuntimeProvider.tsx`|ChatRuntimeProvider appends the shared sanitized error bubble on non-cancelled errors and deduplicates by comparing the last thread message to the shared constant.|\n|**Frontend error handling tests** <br> `app/src/providers/__tests__/ChatRuntimeProvider.test.tsx`|Tests assert sanitized inference error bubbles include a Discord report action and that duplicate fallback bubbles are not appended.|\n|**Backend error message and reporting tests** <br> `src/openhuman/channels/providers/web_tests.rs`, `src/openhuman/cron/scheduler_tests.rs`|Tests verify web channel emits sanitized inference error messages (no raw transport/URL details) and scheduler tests verify user-facing agent job message content, session target tag mapping, and that raw error is preserved separately for reporting.|\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~25 minutes\n\n## Possibly related PRs\n\n- [tinyhumansai/openhuman#1095](https://github.com/tinyhumansai/openhuman/pull/1095): Modifies `run_chat_task` in the web channel provider and touches the same function as this PR.  \n- [tinyhumansai/openhuman#369](https://github.com/tinyhumansai/openhuman/pull/369): Updates web channel provider error emission and routing, related to sanitized messages.  \n- [tinyhumansai/openhuman#514](https://github.com/tinyhumansai/openhuman/pull/514): Also changes web.rs run_chat/start_chat error handling and emitted inference error messages.\n\n## Suggested reviewers\n\n- senamakel\n- graycyrus\n\n> \"I hopped in with a gentle cheer,  \n> No raw errors for users here.  \n> We log the details where teams can see,  \n> And show a friendly note to thee.  \n> With Discord links, the bugs come near.\"\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 4 | ❌ 1</summary>\n\n### ❌ Failed checks (1 warning)\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n<details>\n<summary>✅ Passed checks (4 passed)</summary>\n\n|         Check name         | Status   | Explanation                                                                                                                                                                                         |\n| :------------------------: | :------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|      Description Check     | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                                                         |\n|         Title check        | ✅ Passed | The title accurately summarizes the main change: sanitizing agent/cron failure messages and adding user-safe error fallback with Sentry reporting.                                                  |\n|     Linked Issues check    | ✅ Passed | All coding requirements from `#1319` are met: technical details are sanitized, Sentry reporting is implemented, user-friendly fallback messages are displayed, and Discord reporting links are added. |\n| Out of Scope Changes check | ✅ Passed | All changes are directly related to sanitizing error messages and implementing observability reporting as specified in `#1319`; no unrelated modifications detected.                                  |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- tips_start -->\n\n---\n\n\n\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"signal":{},"retries":3,"retryAfter":16}}}

@senamakel senamakel merged commit 694ae4e into tinyhumansai:main May 7, 2026
21 checks passed
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.

Agent error messages expose raw technical details to users

2 participants