feat(ui,rest,observability): Subscriptions operator page — read-only dashboard over the live engine - #585
Merged
Merged
Conversation
…dashboard The sidebar's Subscriptions placeholder becomes a real page (#580), following Brett's design: four status cards (failing / idle / active / notifications since registration) over a table of every registered subscription — channel and endpoint, a status chip, the event counter, and the consecutive-failure streak. Sort is a plain-links menu (status default: worst first; most sent; fail streak). Read-only throughout. The read path mirrors the dashboard chart's: a plain-data provider in helios-observability, implemented in helios-rest over the live engine (its in-memory inventory plus the WebSocket manager's connection counts) and registered where the engine is built. Registration doubles as the 'subscriptions advertised' signal — the nav entry and the page only appear when the engine runs; otherwise the entry hides and the route renders an explained unavailable state, per the design note. Honest by construction: a websocket subscription with no connected clients shows the 0-clients state even while its resource says active (its notifications go nowhere), and the design's 24-hour delivery figures are deliberately absent until the engine grows delivery instrumentation — real numbers or none (#555's rule). All strings in en/es/de.
Rust drives the full state machine over the mounted router with an injected provider — unavailable (nav hidden) → live dashboard (cards summed, worst-first order, chips, streaks, the idle websocket's 0-clients state) → link-based re-sort. Playwright covers the advertised-but-empty engine the e2e server now runs (cards at zero, empty table, sort as plain links, the nav entry), skipping gracefully on a local binary built without the subscriptions feature — which CI ui-test builds now enable. The route joins the shared guard list, so a11y in both themes, no-cdn, and the design-system guard cover the page from day one.
…ubscriptions-ui Union merge: both export routes join the guard list alongside the subscriptions page, the locale catalogs keep both new key blocks, and the .tag status-pill family carries the subscription states next to the export job states — one vocabulary, as #572 intends.
…s-ui # Conflicts: # crates/ui/assets/app.css # crates/ui/e2e/pages/routes.ts # locales/de/main.ftl # locales/en/main.ftl # locales/es/main.ftl
Two call sites exceeded rustfmt's default fn_call_width (60) and were left on one line, failing `cargo fmt --all -- --check`: * crates/fhir-validator/src/editor.rs — arrived on main with #573 and is already breaking main's Linting job at 9636888; the merge inherited it. * crates/ui/tests/subscriptions_http.rs — predates the merge on this branch. Pure formatting; no behavior change. Claude-Session: https://claude.ai/code/session_0197k7pHRnRPd2TaDjibNSDJ
Both main catch-ups landed in parallel again; content-identical, only block ordering differed (the .tag family and the locale key blocks). Resolved to the locally validated layout — the tree is byte-for-byte the one the full suite passed at 140.
…feat/580-subscriptions-ui
Contributor
Author
|
Coordination note: we were both pushing main catch-ups to this branch at the same time — everything is reconciled as of |
smunini
approved these changes
Aug 19, 2026
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.
Closes #580. The sidebar's Subscriptions placeholder becomes the read-only operator dashboard from Brett's design.
Stacked on #572 — based on
fix/543-stylesheet-unificationfor the shared vocabulary and guards, targetingmainso the Development link on #580 is live from day one; the diff shrinks to just this feature when #572 merges.What renders
—where there is no delivery to fail).The read path
Mirrors the dashboard chart's pattern: a plain-data
SubscriptionsProviderinhelios-observability, implemented inhelios-restover the live engine (the manager's in-memory inventory plus the WebSocket manager's connection counts) and registered exactly where the engine is built. Registration doubles as the "subscriptions advertised" signal from the design note: the nav entry and the page only exist when the engine runs; otherwise the entry hides and the route renders an explained unavailable state.Honesty rules (same as #555)
active— its notifications go nowhere, and that outranks the stored status.Verified against the live engine
Manual end-to-end on a running server: an R4 backport topic (
Basic), a rest-hook whose endpoint rejects the handshake (405) lands inerror— consistently across the UI chip, the persisted resource (status write-back, #357), and$status— while a rest-hook against a real sink handshakesrequested → activeand delivers notification Bundles that the sink actually receives, with the row's SENT counter matching. The idle websocket accumulates SENT with 0 clients, exactly the design's third example row.Tests
subscriptions_http.rs): the full state machine over the mounted router with an injected provider — unavailable (nav hidden) → live dashboard (cards summed, worst-first order, chips, streaks, the 0-clients state) → link-based re-sort. Plus a provider unit test in observability.subscriptionsfeature, which the ui-test workflows now enable. The route joins the shared guard list (a11y both themes, no-cdn, design-system).