feat(errors): one triage hub, and an issue page that says where the error is - #538
Merged
Merged
Conversation
…rror is
`/errors` grouped error events by fingerprint and knew nothing about triage;
`/errors/issues` listed the same fingerprints from Postgres and knew nothing
about volume; the investigation lived on a third route. They were always the
same objects — the warehouse groups by FingerprintHash and `error_issues` is
keyed on that same hash — so no single view could answer a triage question.
They are now one list. A row is an `ErrorSignal`: the issue row as the spine,
warehouse volume and trend joined on the hash, and one status slot resolved by
precedence (open incident › live investigation › workflow state) in place of the
four badge systems a row used to carry. `/errors/issues` redirects, carrying its
old `workflowState` tab across to the equivalent view.
The detail page never got that treatment and read as a different product:
- Five badges, a primary button and an overflow menu sat flat in one actions
row. Identity chips move into the title stack and the status collapses to the
same one chip the list uses, leaving one labelled action plus one menu.
- `topFrame` and `fingerprintHash` were on the wire and drawn nowhere — only the
investigation snapshot ever read them, so the page that exists to answer "what
broke and where" never named a line of code. Both are now the block under the
title, and the exception message is promoted out of muted caption.
- The endpoint takes start_time/end_time/bucket_seconds/sample_limit and the
page called it with `{}`, so the chart and the samples described a window
nobody chose, reached from a list that has a time picker. It is wired now.
- Seven equal-weight sections in one stack become Overview / Occurrences /
Activity, tabbed through `?tab=`.
- regressionCount, lastRegressedAt, lastResolvedAt, resolvedVersions and
snoozeUntil were decoded every load and shown nowhere, so the page could not
answer the question the workflow exists for: did the fix hold.
Also: `errorsSpark` (bucketed counts for many fingerprints, pivoted server-side)
and an `errorLabels` facet; the occurrence chart becomes bars, tinted by
severity, because the series is a count per discrete bucket and the old filled
area interpolated straight through silence; and `/errors/$errorType` is deleted
along with the two atoms and the one query it was the last consumer of.
The errors triage hub added a fingerprint_hash filter, an errors spark query, and a version facet; the Live Activity commit added two routes. Each has a committed artifact that has to move with it, and none did: - the pruned iOS OpenAPI document (quality shard), - the v2 path and iOS operation freeze lists, - the verbatim SQL catalog baseline — the diff is exactly the new spark query and the version facet, nothing else. Also drops the dead code the hub left behind (kind-badge, the single-fingerprint errors timeseries query superseded by the spark query, two unused re-exports) and a knip entry pattern for a packages/domain/scripts directory that does not exist.
🍁 Maple PR previewNote Preview resources were removed when this pull request closed. Final commit |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
/errorsgrouped error events by fingerprint and knew nothing about triage./errors/issueslisted the same fingerprints out of Postgres and knew nothing about volume. The investigation lived on a third route.They were always the same objects — the warehouse groups by
FingerprintHash, anderror_issuesis keyed on that same hash — so no single view could answer a triage question on its own, and the detail page you landed on read like a different product from the list you came from.The list
One list, joined on the fingerprint. A row is an
ErrorSignal: the issue row as the spine (it covers every fingerprint and carries the triage facts), warehouse volume and trend joined on, and one status slot resolved by precedence — open incident › live investigation › workflow state — replacing the four badge systems a row used to carry.<svg>each, not a chart runtime — fifty rows would otherwise mean fifty of them./errors/issuesredirects, carrying its oldworkflowStatetab across to the equivalent view.The detail page
topFrameandfingerprintHashwere on the wire and drawn nowhere — the only thing that ever read them was the investigation snapshot, so the page that exists to answer what broke and where briefed the agent with a stack frame it never showed you. Both are now the block under the title, and the exception message is promoted out of muted caption into the page's primary text.start_time/end_time/bucket_seconds/sample_limit; the page called it with{}and then labelled a number "Events (window)" for a window nobody chose — reached from a list that does have a picker. Wired now: the chart, the samples and the count move together.?tab=.regressionCount,lastRegressedAt,lastResolvedAt,resolvedVersionsandsnoozeUntilwere decoded on every load and shown nowhere, so the page could not answer the question the workflow exists for: did the fix hold.Also in here
errorsSpark— bucketed counts for many fingerprints at once, pivoted server-side, plus anerrorLabelssidebar facet.PageLayout.RightSidebaralready applies, and the activity timeline'sml-16/-left-16magic-number pair is a real grid gutter./errors/$errorTypeis deleted — unreachable since the list rewrite — along with the two atoms and the one query it was the last consumer of.getErrorDetailTracesstays; the dashboard builder still exposes it as a widget data source.Verification
bun typecheckclean;oxlint --quietclean.@maple/web195 files / 1727 tests green;@maple/query-engineand@maple/apigreen.?tab=surviving reload, an alert-kind issue correctly losing its Occurrences tab, the rail, the breadcrumb,<lglayout and light mode.Pre-existing failure, not from this branch:
packages/domainopenapi.test.tsandopenapi-ios.test.tsfail on the twomobile_devices/{token}/live_activities/{incident_id}paths.mobile-devices.tsis untouched here and those endpoints landed in27b62bc067without the committed-paths assertion being updated.Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.