Files
pulse/internal/api
rcourtman 880498df97 Make scheduled report delivery visible and recoverable (#3035)
Scheduled reports could appear successful when email was unconfigured,
and a temporary delivery failure had no durable retry or clear recovery
path. Reports now checks email configuration, records
running/saved/accepted/failed/unconfirmed outcomes, and exposes
actionable errors and Run/Retry controls at desktop and mobile widths.

Temporary mail failures receive at most three attempts with one- and
five-minute delays. Retries survive restart and preserve resource-report
windows. Lost completed-message acknowledgements and interrupted email
runs remain unconfirmed until a deliberate retry, preventing automatic
duplicate sends. Edits, disablement and deletion cancel pending retries.
Every attempt rechecks the existing entitlement.

This implements the scheduled-report delivery slice of L6. Pricing,
feature gates, retention limits and existing customer entitlements are
unchanged. SMTP acceptance is distinguished from inbox receipt.

The schedule editor loads when creating or editing a schedule, with a
visible loading state and initial keyboard focus. The reporting screen
stays within its existing bundle budget without raising limits.

Validation:

- Full configuration and notifications Go suites, reporting API race
tests.
- 301 targeted frontend and architecture tests, TypeScript, full
frontend lint and production frontend/private-runtime builds.
- Existing bundle-size, total JS/CSS and preload checks passed.
ReportingPanel is 10.94 kB gzip against its 11.63 kB limit.
- Playwright on `/settings/support/reporting` and
`/alerts/notifications` at 1440, 820 and 390 pixels: configuration
failure, disabled draft, real CSV attachment, disk PDF, persisted retry
across a process restart, permanent rejection, uncertain
acknowledgement, deliberate retry and delete/disable recovery.
- Controlled-response browser matrix for running, loading/error,
polling, keyboard focus, details and responsive layouts. Final pixels
reviewed separately from delivery assertions.
- Release-control status, ownership, contract, completion and browser
guards.

Browser delivery uses synthetic infrastructure, a disposable signed Pro
grant and local SMTP only. This source change does not publish a release
or alter customer installations.
2026-10-17 11:42:27 +01:00
..
2026-10-11 22:20:25 +01:00
2026-10-11 22:20:25 +01:00
2026-10-11 22:20:25 +01:00
2026-10-11 22:20:25 +01:00
2026-10-11 22:20:25 +01:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-08-31 19:47:01 +01:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-04-26 17:26:16 +01:00
2026-01-22 00:30:15 +00:00
2026-10-11 22:20:25 +01:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-09-01 01:02:17 +01:00
2026-03-18 16:06:30 +00:00

Internal API Package

This directory contains the API server implementation for Pulse.

Important Note About frontend-modern/

The frontend-modern/ subdirectory that appears here is:

  • AUTO-GENERATED during builds
  • NOT the source code - just a build artifact
  • IN .gitignore - never committed
  • REQUIRED BY GO - The embed directive needs it here

Frontend Development Location

👉 Edit frontend files at: ${PULSE_REPOS_DIR}/pulse/frontend-modern/src/

Why This Structure?

Go's //go:embed directive has limitations:

  1. Cannot use ../ paths to access parent directories
  2. Cannot follow symbolic links
  3. Must embed files within the Go module

This is a known Go limitation and our structure works around it.