Conversation
…voir purgeProject
Documents the AuthProvider interface, ProviderRegistry, database schema, session model, and a worked end-to-end example of a minimal custom provider. Closes #215.
Resolves conflicts in projects restore flow: incorporates upstream name/slug conflict pre-check in restoreProject() and corresponding 409 error handlers in the restore route.
complete scheduled email digest reports (#154)
ux/qol audit sweep: data-correctness fixes, consistency, and QOL
There was a problem hiding this comment.
Pull request overview
Release 1.2.0 roll-up that bumps versions and ships several cross-cutting UX, ingestion health, digest-email, auth hardening, and error-grouping improvements across the frontend and backend.
Changes:
- Add scheduled email digests with unsubscribe flow, dispatch cron, templates, and capability limits.
- Add clock-skew detection for logs/spans/metrics and surface health in admin + per-project UI.
- Improve UX consistency (time range controls, persisted selections, command palette search, theme “System”, dashboard auto-refresh) and error-group handling (auto-merge + merge UI, regression reopen).
Reviewed changes
Copilot reviewed 123 out of 124 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Update version badge/text to 1.2.0 |
| packages/shared/package.json | Bump package version to 1.2.0 |
| packages/reservoir/package.json | Bump package version to 1.2.0 |
| packages/frontend/tests/journeys/search.spec.ts | Update journey assertion for new custom range UI |
| packages/frontend/src/routes/unsubscribe/+page.svelte | Add unsubscribe confirmation page (public token) |
| packages/frontend/src/routes/register/+page.svelte | Handle successful registration without session (fallback to login) |
| packages/frontend/src/routes/dashboard/traces/+page.svelte | Persist project/time-range; add traceId URL param handling |
| packages/frontend/src/routes/dashboard/settings/usage/+page.svelte | Replace ad-hoc range buttons with shared component |
| packages/frontend/src/routes/dashboard/settings/pii-masking/+page.svelte | Add success toasts for rule enable/action changes |
| packages/frontend/src/routes/dashboard/settings/members/+page.svelte | Use shared date formatting helpers; tooltip time-ago |
| packages/frontend/src/routes/dashboard/settings/+layout.svelte | Add Settings nav item for Email Digests |
| packages/frontend/src/routes/dashboard/security/+page.svelte | Replace ad-hoc time-range buttons with shared component |
| packages/frontend/src/routes/dashboard/projects/+page.svelte | Fix page title to “Projects” |
| packages/frontend/src/routes/dashboard/projects/[id]/overview/+page.svelte | Surface ingestion skew banners; improve stats trend labels/units |
| packages/frontend/src/routes/dashboard/metrics/+page.svelte | Persist selected project; simplify filters (project/time moved to header) |
| packages/frontend/src/routes/dashboard/errors/[id]/+page.svelte | Create-alert shortcut; duplicate-group discovery + merge action |
| packages/frontend/src/routes/dashboard/alerts/+page.svelte | Support alert builder prefill (create-from-error, duplicate) |
| packages/frontend/src/routes/dashboard/admin/+page.svelte | Display timestamp skew counters in ingestion health stats |
| packages/frontend/src/routes/dashboard/+page.svelte | Add dashboard auto-refresh control + persistence |
| packages/frontend/src/lib/utils/datetime.ts | Add formatDateShort helper |
| packages/frontend/src/lib/stores/time-range.ts | New persisted time-range store |
| packages/frontend/src/lib/stores/theme.ts | Add “system” theme preference that tracks OS changes |
| packages/frontend/src/lib/stores/organization.ts | Cache selected organization (avoid org-name flash) |
| packages/frontend/src/lib/stores/current-project.ts | New persisted “current project” store |
| packages/frontend/src/lib/components/ui/range-calendar/range-calendar.svelte | Add range calendar wrapper component |
| packages/frontend/src/lib/components/ui/range-calendar/index.ts | Export range calendar root |
| packages/frontend/src/lib/components/TimeRangePicker.svelte | Replace datetime-local with calendar + time inputs for custom range |
| packages/frontend/src/lib/components/TimeRangeButtons.svelte | New shared segmented button control |
| packages/frontend/src/lib/components/ThemeToggle.svelte | Switch to dropdown theme picker (light/dark/system) |
| packages/frontend/src/lib/components/projects/IngestionSkewBanner.test.ts | Add unit tests for ingestion skew banner copy/formatting |
| packages/frontend/src/lib/components/projects/IngestionSkewBanner.svelte | New skew warning banner component |
| packages/frontend/src/lib/components/metrics/ServiceSelector.svelte | Use shared TimeRangeButtons for consistency |
| packages/frontend/src/lib/components/metrics/OverviewPanel.svelte | Use shared EmptyMetrics empty-state component |
| packages/frontend/src/lib/components/Footer.svelte | Bump displayed version to 1.2.0 |
| packages/frontend/src/lib/components/EmptyTraces.svelte | Update OTLP Go snippet (context/background + insecure hint) |
| packages/frontend/src/lib/components/dashboard/StatsCard.svelte | Support trend label/unit formatting |
| packages/frontend/src/lib/components/CreateAlertDialog.svelte | Apply initial builder values when opened (prefill/duplicate) |
| packages/frontend/src/lib/components/CommandPalette.svelte | Add query-driven search actions (logs/errors/traceId) |
| packages/frontend/src/lib/api/projects.ts | Add ingestion health API + export singleton instance |
| packages/frontend/src/lib/api/fetch-interceptor.ts | Don’t log out user on 401s from telemetry/ingest endpoints |
| packages/frontend/src/lib/api/exceptions.ts | Add duplicates + merge endpoints client helpers |
| packages/frontend/src/lib/api/digests.ts | Add digest settings + public unsubscribe API client |
| packages/frontend/src/lib/api/auth.ts | Allow register response without session |
| packages/frontend/src/lib/api/alerts.ts | Add AlertBuilderPrefill type |
| packages/frontend/src/lib/api/admin.ts | Extend ingestion health stats type with skew counters |
| packages/frontend/src/hooks.server.ts | Bump release tag fallback to 1.2.0 |
| packages/frontend/src/hooks.client.ts | Bump client release tag fallback to 1.2.0 |
| packages/frontend/package.json | Bump to 1.2.0; add @internationalized/date; bump echarts |
| packages/backend/src/worker.ts | Enable digest dispatch + generation workers and cron registration |
| packages/backend/src/utils/internal-logger.ts | Bump release tag fallback to 1.2.0 |
| packages/backend/src/tests/setup.ts | Re-seed local auth provider in test DB setup |
| packages/backend/src/tests/queue/jobs/exception-parsing.test.ts | Add regression + auto-merge ingestion tests |
| packages/backend/src/tests/queue/jobs/digest-dispatch.test.ts | Add digest dispatch processor tests |
| packages/backend/src/tests/modules/users/users-service.test.ts | Remove redundant login tests; use provider/auth service paths |
| packages/backend/src/tests/modules/traces/service.test.ts | Add span clock-skew metering tests (post-masking) |
| packages/backend/src/tests/modules/metrics/service.test.ts | Add metric clock-skew metering tests |
| packages/backend/src/tests/modules/metering/recorder.test.ts | Ensure ingestion.* counters bypass metering gate |
| packages/backend/src/tests/modules/ingestion/skew.test.ts | Add skew tracker unit tests |
| packages/backend/src/tests/modules/ingestion/ingestion-service.test.ts | Add log skew metering tests |
| packages/backend/src/tests/modules/exceptions/service.test.ts | Add service attribution + mergeErrorGroups tests |
| packages/backend/src/tests/modules/exceptions/routes.test.ts | Add duplicates/merge route tests |
| packages/backend/src/tests/modules/exceptions/detection.test.ts | Treat node: frames as library; prevent error group splitting |
| packages/backend/src/tests/modules/digests/scheduler.test.ts | Update scheduler tests for single dispatch cron |
| packages/backend/src/tests/modules/digests/generator-integration.test.ts | Digest now includes multiple sections + HTML/unsubscribe |
| packages/backend/src/tests/modules/dashboard/dashboard-service.test.ts | Ensure “today” stats include earlier-today logs |
| packages/backend/src/tests/modules/capabilities/digest-recipients-limit.test.ts | Enforce digests.max_recipients capability |
| packages/backend/src/tests/modules/auth/local-provider.test.ts | Add SSO_REQUIRED code; enumeration hardening; emailVerified |
| packages/backend/src/tests/modules/auth/external-routes.test.ts | Preserve migration-seeded local provider in cleanup |
| packages/backend/src/tests/modules/auth/authentication-service.test.ts | Use typed AuthError codes; preserve local provider row |
| packages/backend/src/tests/modules/audit-log/record-integration.test.ts | Audit typed login-failure reasons + provider unavailable |
| packages/backend/src/tests/modules/admin/routes.test.ts | Add admin skew counter reporting tests |
| packages/backend/src/tests/lib/email-templates.test.ts | Add digest email template coverage + escaping assertions |
| packages/backend/src/tests/helpers/factories.ts | Support SSO-only + disabled users in test factory |
| packages/backend/src/server.ts | Register digests routes + public unsubscribe routes |
| packages/backend/src/queue/jobs/exception-parsing.ts | Add auto-merge (merge_key), reopen regressions, pass service/topFrame |
| packages/backend/src/queue/jobs/error-notification.ts | Add regression-aware notification titles/severity/flags |
| packages/backend/src/queue/jobs/digest-dispatch.ts | Add hourly dispatch job that enqueues due digest generations |
| packages/backend/src/modules/users/service.ts | Remove redundant UsersService.login implementation |
| packages/backend/src/modules/users/routes.ts | Route login/register through provider registry; typed AuthError handling |
| packages/backend/src/modules/traces/service.ts | Add span end-time skew metering |
| packages/backend/src/modules/projects/service.ts | Add per-project ingestion health read model (skew aggregation) |
| packages/backend/src/modules/projects/routes.ts | Add /projects/:id/ingestion-health endpoint |
| packages/backend/src/modules/metrics/service.ts | Add metric skew metering |
| packages/backend/src/modules/metering/types.ts | Add ingestion timestamp skew metering event types |
| packages/backend/src/modules/metering/recorder.ts | Let ingestion.* bypass METERING_ENABLED gate |
| packages/backend/src/modules/ingestion/skew.ts | New skew tracker utility + thresholds |
| packages/backend/src/modules/ingestion/service.ts | Record log skew metrics during ingest (never reject) |
| packages/backend/src/modules/exceptions/types.ts | Extend CreateExceptionParams with service/topFrame |
| packages/backend/src/modules/exceptions/service.ts | Add duplicate discovery + merge logic |
| packages/backend/src/modules/exceptions/routes.ts | Add duplicates + merge endpoints |
| packages/backend/src/modules/exceptions/fingerprint-service.ts | Add topAppFrame helper for coarse merge key |
| packages/backend/src/modules/exceptions/detection.ts | Classify node: runtime frames as library code |
| packages/backend/src/modules/digests/service.ts | Digest config/recipient CRUD + token unsubscribe service |
| packages/backend/src/modules/digests/scheduler.ts | Switch to static hourly dispatch cron registration |
| packages/backend/src/modules/digests/public-routes.ts | Add public unsubscribe endpoint (token-based) |
| packages/backend/src/modules/digests/index.ts | Export digests module surface |
| packages/backend/src/modules/dashboard/service.ts | Fix low-volume “today” stats to use raw logs when aggregate stale |
| packages/backend/src/modules/auth/providers/types.ts | Add AuthError + SSO_REQUIRED error code |
| packages/backend/src/modules/auth/providers/local-provider.ts | Enumeration hardening; SSO_REQUIRED; emailVerified |
| packages/backend/src/modules/auth/providers/index.ts | Export AuthError |
| packages/backend/src/modules/auth/authentication-service.ts | Throw typed AuthError codes end-to-end |
| packages/backend/src/modules/audit-log/actions.ts | Add digest config/recipient audit actions |
| packages/backend/src/modules/admin/service.ts | Include skew counters in admin ingestion health stats |
| packages/backend/src/database/types.ts | Add new DB fields for exceptions/error_groups/digests tables |
| packages/backend/src/capabilities/registry.ts | Add digests.max_recipients capability |
| packages/backend/package.json | Bump backend package version to 1.2.0 |
| packages/backend/migrations/055_error_group_auto_merge.sql | Add merge_key + trigger updates + backfill |
| packages/backend/migrations/054_exception_service_attribution.sql | Carry exception.service for engine-independent attribution |
| packages/backend/migrations/053_digest_last_sent.sql | Add digest_configs.last_sent_at |
| package.json | Bump repo version and security override ranges |
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
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.
Release 1.2.0. Rolls up everything merged to
developsince 1.1.0 (103 commits) plus the version bump and two Dependabot security fixes.Highlights
Added / Changed (UX & QOL audit sweep)
datetime-local)Fixed
node:frames treated as library code)Digests (#154)
Ingestion clock skew (#279 + follow-up)
ingestion.*counters bypass the metering toggleAuth (#266 + follow-ups)
AuthErrorcode, not message strings; user-enumeration hardeningSecurity
echarts-> 6.1.0 (GHSA-fgmj-fm8m-jvvx/ CVE-2026-45249)protobufjs-> 7.6.5 (GHSA-j3f2-48v5-ccww, DoS via infinite loop in.protooption parsing)brace-expansion-> 5.0.7 (GHSA-3jxr-9vmj-r5cp/ CVE-2026-13149, exponential-time expansion DoS)Full detail in
CHANGELOG.mdunder[1.2.0].