Skip to content

fix: improve error labelling, grouping, and stack traces in the Errors feature#4225

Merged
matt-aitken merged 1 commit into
mainfrom
fix/errors-message-fallback
Jul 10, 2026
Merged

fix: improve error labelling, grouping, and stack traces in the Errors feature#4225
matt-aitken merged 1 commit into
mainfrom
fix/errors-message-fallback

Conversation

@matt-aitken

@matt-aitken matt-aitken commented Jul 10, 2026

Copy link
Copy Markdown
Member

Problem

Several display/grouping issues in the Errors feature, all rooted in how the ClickHouse error materialized views (errors_mv_v1, error_occurrences_mv_v1) read the stored error JSON produced by parseError:

  1. Messageless errors show "Unknown error". An empty message falls straight through coalesce(nullIf(message,''), 'Unknown error') to the literal, even though the error's class name is available (e.g. an Effect tagged error ListMessagesError with no message).
  2. Unrelated errors collapse into one group. calculateErrorFingerprint keys on type : message : stack, where type is always the union tag (BUILT_IN_ERROR, …), message is empty, and the stack isn't read — so every messageless built-in error (and every string/custom error) hashes to the same constant input → one fingerprint.
  3. error_type shows the internal tag. coalesce(type, name, …) always resolves to type (always present), so the column shows BUILT_IN_ERROR instead of the real class name.
  4. Stack traces never populate. The MVs read error.data.stack, but the serializer stores the trace under stackTrace — so the column is always empty.

Fix

All display changes are ALTER TABLE … MODIFY QUERY on the two views (migration 035); the fingerprint change is in the webapp.

  • Fingerprint (errorFingerprinting.ts): fall back message → name → raw. Messageless errors now group by class name (or raw value for non-Error throws); message-bearing errors are unchanged (short-circuits at message), so existing groups don't split — only currently-messageless errors get their own group going forward.
  • error_message: same message → name → raw fallback before 'Unknown error'.
  • error_type: coalesce name → code → 'Error' (drops the reliance on the union tag). Built-in → class name, internal → code, string/custom → Error.
  • stack trace: read error.data.stackTrace. Bounded as before (serializer caps 50 frames / 1024 chars per line; MV clips to 2000 chars).

Migration notes

  • MODIFY QUERY swaps the view query in place (no drop/recreate gap); Down restores the previous query.
  • Existing rows are left unchanged — changes apply only to rows inserted after the migration. No backfill.

Tests

errorFingerprinting.test.ts — 57 pass, incl. new cases for messageless class names, string/custom raw values, and stability of message-bearing fingerprints.

Fixes the display-derivation half of TRI-11938 (error_type + stack trace); relates to TRI-9254 and TRI-9250.

@changeset-bot

changeset-bot Bot commented Jul 10, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: b7efc4e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: d8aa4f3d-53f1-4ab6-acbe-a4fbb586a32c

📥 Commits

Reviewing files that changed from the base of the PR and between e524cce and b7efc4e.

📒 Files selected for processing (4)
  • .server-changes/errors-message-fallback.md
  • apps/webapp/app/utils/errorFingerprinting.ts
  • apps/webapp/test/errorFingerprinting.test.ts
  • internal-packages/clickhouse/schema/035_fix_error_display_derivation.sql
✅ Files skipped from review due to trivial changes (2)
  • .server-changes/errors-message-fallback.md
  • apps/webapp/app/utils/errorFingerprinting.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/webapp/test/errorFingerprinting.test.ts
  • internal-packages/clickhouse/schema/035_fix_error_display_derivation.sql
📜 Recent review details
⏰ Context from checks skipped due to timeout. (24)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (9, 12)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (12, 12)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (10, 12)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (11, 12)
  • GitHub Check: webapp / 🧪 Unit Tests: Webapp (1, 10)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (5, 12)
  • GitHub Check: webapp / 🧪 Unit Tests: Webapp (7, 10)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (8, 12)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (1, 12)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (4, 12)
  • GitHub Check: webapp / 🧪 Unit Tests: Webapp (10, 10)
  • GitHub Check: webapp / 🧪 Unit Tests: Webapp (4, 10)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (7, 12)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (2, 12)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (6, 12)
  • GitHub Check: webapp / 🧪 Unit Tests: Webapp (8, 10)
  • GitHub Check: webapp / 🧪 Unit Tests: Webapp (5, 10)
  • GitHub Check: webapp / 🧪 Unit Tests: Webapp (2, 10)
  • GitHub Check: webapp / 🧪 Unit Tests: Webapp (9, 10)
  • GitHub Check: internal / 🧪 Unit Tests: Internal (3, 12)
  • GitHub Check: webapp / 🧪 Unit Tests: Webapp (6, 10)
  • GitHub Check: webapp / 🧪 Unit Tests: Webapp (3, 10)
  • GitHub Check: e2e-webapp / 🧪 E2E Tests: Webapp
  • GitHub Check: typecheck / typecheck

Walkthrough

Error fingerprinting now falls back from an error message to its name or raw value, with tests covering grouping and precedence behavior. ClickHouse materialized views now derive error types, messages, and stack traces from updated error JSON fields, while migration down steps restore the previous derivation rules. A changelog entry documents the resulting Errors-page behavior.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is informative, but it does not follow the required template or include the issue link, checklist, testing steps, changelog, and screenshots sections. Reformat the PR description to match the template and add Closes #, the checklist, testing steps, a short changelog, and a screenshots section.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately summarizes the main Errors feature change.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/errors-message-fallback

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

devin-ai-integration[bot]

This comment was marked as resolved.

@matt-aitken matt-aitken force-pushed the fix/errors-message-fallback branch from 72e1c07 to e524cce Compare July 10, 2026 14:51
@matt-aitken matt-aitken changed the title fix: label and group errors without a message by their name fix: improve error labelling, grouping, and stack traces in the Errors feature Jul 10, 2026
devin-ai-integration[bot]

This comment was marked as resolved.

Errors thrown without a message (e.g. tagged errors) and non-Error
throws (strings, plain objects) were all shown as "Unknown error" and
collapsed into a single fingerprint, so unrelated failures across
different tasks shared one group.

Fall back message -> name -> raw when computing both the error
fingerprint and the displayed message. Message-bearing errors are
unaffected, so existing groups don't split; only errors that currently
have no message get a meaningful title and their own group going forward.

Also fix two display-derivation bugs in the same error materialized
views (via MODIFY QUERY, existing rows unchanged):
- error_type now shows the real class name / internal code instead of
  the generic serialization tag (BUILT_IN_ERROR, STRING_ERROR, ...).
- stack traces now read the stored stackTrace field, not the always-empty
  error.data.stack, so they populate again.
@matt-aitken matt-aitken force-pushed the fix/errors-message-fallback branch from e524cce to b7efc4e Compare July 10, 2026 15:48
@pkg-pr-new

pkg-pr-new Bot commented Jul 10, 2026

Copy link
Copy Markdown

Open in StackBlitz

@trigger.dev/build

npm i https://pkg.pr.new/@trigger.dev/build@b7efc4e

trigger.dev

npm i https://pkg.pr.new/trigger.dev@b7efc4e

@trigger.dev/core

npm i https://pkg.pr.new/@trigger.dev/core@b7efc4e

@trigger.dev/python

npm i https://pkg.pr.new/@trigger.dev/python@b7efc4e

@trigger.dev/react-hooks

npm i https://pkg.pr.new/@trigger.dev/react-hooks@b7efc4e

@trigger.dev/redis-worker

npm i https://pkg.pr.new/@trigger.dev/redis-worker@b7efc4e

@trigger.dev/rsc

npm i https://pkg.pr.new/@trigger.dev/rsc@b7efc4e

@trigger.dev/schema-to-json

npm i https://pkg.pr.new/@trigger.dev/schema-to-json@b7efc4e

@trigger.dev/sdk

npm i https://pkg.pr.new/@trigger.dev/sdk@b7efc4e

commit: b7efc4e

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Devin Review found 1 new potential issue.

Open in Devin Review

@matt-aitken matt-aitken merged commit 2cac63f into main Jul 10, 2026
53 checks passed
@matt-aitken matt-aitken deleted the fix/errors-message-fallback branch July 10, 2026 17:30
@github-actions github-actions Bot mentioned this pull request Jul 10, 2026
ericallam pushed a commit that referenced this pull request Jul 14, 2026
## Summary
2 new features, 11 improvements, 5 bug fixes.

## Breaking changes
- Trigger.dev v3 is no longer supported. For self-hosted deployments,
4.5.0 is the last version we officially support for running v3; stay on
4.5.0 or upgrade to v4. v3 triggers, batch triggers, reschedules, and
deploys now return a clear upgrade message instead of running.
([#4236](#4236))

## Improvements
- You can now mark environment variables synced via the `syncEnvVars`
build extension as secrets. Return `{ name, value, isSecret: true }`
from your callback and those variables are stored redacted in the
dashboard, just like manually created secret env vars.
([#4203](#4203))
- Remove the legacy `--mcp` and `--mcp-port` options from the `dev`
command. Run the dedicated `trigger mcp` command to start the
Trigger.dev MCP server.
([#4246](#4246))
- Removed the unused `ResourceMonitor` export from
`@trigger.dev/core/v3/serverOnly`. It was a server-side logging helper
with no remaining consumers.
([#4244](#4244))
- Removed the unused `@trigger.dev/core/v3/zodNamespace` export and the
legacy v3 socket message schemas. These were only used by the
now-retired v3 engine and have no v4 consumers.
([#4236](#4236))

## Bug fixes
- Fix a `chat.agent` message-loss race where sending a message right
after an action (such as an undo) could drop the follow-up's response
from the UI until a refresh.
([#4234](#4234))

## Server changes

These changes affect the self-hosted Docker image and Trigger.dev Cloud:

- Added `EVENT_REPOSITORY_POSTGRES_WRITES_DISABLED` to skip all
PostgreSQL task-event writes for deployments that store task events in
ClickHouse. Leave it off unless `EVENT_REPOSITORY_DEFAULT_STORE` is
`clickhouse_v2`, otherwise task events are lost.
([#4242](#4242))
- Promo credits: a /promo signup landing page, redeeming a promo code
when a new org selects a plan, and showing remaining credits on the
usage page.
([#4138](#4138))
- Speed up retrieving a background worker by version. The endpoint no
longer runs a slow lookup that scanned the full task table for large
deployments; it now reuses data it already loads, so the response is the
same but returns much faster.
([#4245](#4245))
- Clearer login error when an email address is blocked by the
WHITELISTED_EMAILS setting: the message now explains the address isn't
allowed on this instance instead of the ambiguous "This email is
unauthorized".
([#4220](#4220))
- Make the native build server the default in project build settings.
It's now opt-out, stored as a new `disableNativeBuildServer` key. Also
clarifies in the UI that build settings apply to GitHub-triggered and
native build server deployments.
([#3980](#3980))
- Optionally process high-volume telemetry ingestion in parallel for
higher throughput under heavy load by setting
`OTEL_TRANSFORM_WORKER_POOL_ENABLED=1`. Off by default.
([#4232](#4232))
- Add a `REALTIME_BACKEND_DEFAULT` env var to choose the default
realtime backend (`electric`, `native`, or `shadow`) for environments
whose org has no per-org override. Defaults to `electric`, so existing
behavior is unchanged.
([#4231](#4231))
- Clarified on the Regions page that a region only affects where your
runs execute, not where your data is stored. This shows as a tooltip on
the Location column and in the confirmation dialog when you change your
default region.
([#4226](#4226))
- Improved the reliability of how run data is read and written.
([#4237](#4237))
- Fixed stale login errors: an error from a previous login attempt (for
example a rejected email address) no longer keeps reappearing on the
login page and no longer makes later, successful attempts look like they
failed.
([#4220](#4220))
- The Errors page now shows better details for each error. Errors that
don't carry a message — such as errors thrown without a message, or
values thrown that aren't `Error` objects — get a meaningful title
instead of all reading "Unknown error", and are grouped by their name
(or value) rather than collapsed into a single group. The error type now
shows the actual error name, and stack traces now appear where
previously they were missing.
([#4225](#4225))
- Return a clear client error when SSO form submissions use an
unsupported content type
([#4238](#4238))
- Query page: extracting fields from a run's output with JSON functions
(such as JSONExtractString or JSONExtractInt) no longer fails with an
"illegal type: JSON" error.
([#4221](#4221))

<details>
<summary>Raw changeset output</summary>

# Releases
## @trigger.dev/build@4.5.4

### Patch Changes

- You can now mark environment variables synced via the `syncEnvVars`
build extension as secrets. Return `{ name, value, isSecret: true }`
from your callback and those variables are stored redacted in the
dashboard, just like manually created secret env vars.
([#4203](#4203))
- Updated dependencies:
  - `@trigger.dev/core@4.5.4`
## trigger.dev@4.5.4

### Patch Changes

- Remove the legacy `--mcp` and `--mcp-port` options from the `dev`
command. Run the dedicated `trigger mcp` command to start the
Trigger.dev MCP server.
([#4246](#4246))
- Updated dependencies:
  - `@trigger.dev/core@4.5.4`
  - `@trigger.dev/build@4.5.4`
  - `@trigger.dev/schema-to-json@4.5.4`
## @trigger.dev/core@4.5.4

### Patch Changes

- Removed the unused `ResourceMonitor` export from
`@trigger.dev/core/v3/serverOnly`. It was a server-side logging helper
with no remaining consumers.
([#4244](#4244))
- Removed the unused `@trigger.dev/core/v3/zodNamespace` export and the
legacy v3 socket message schemas. These were only used by the
now-retired v3 engine and have no v4 consumers.
([#4236](#4236))
## @trigger.dev/python@4.5.4

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/sdk@4.5.4`
  - `@trigger.dev/core@4.5.4`
  - `@trigger.dev/build@4.5.4`
## @trigger.dev/react-hooks@4.5.4

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.5.4`
## @trigger.dev/redis-worker@4.5.4

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.5.4`
## @trigger.dev/rsc@4.5.4

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.5.4`
## @trigger.dev/schema-to-json@4.5.4

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.5.4`
## @trigger.dev/sdk@4.5.4

### Patch Changes

- Fix a `chat.agent` message-loss race where sending a message right
after an action (such as an undo) could drop the follow-up's response
from the UI until a refresh.
([#4234](#4234))
- Updated dependencies:
  - `@trigger.dev/core@4.5.4`

</details>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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.

2 participants