feat(hub): say what the services report, and how old that is - #29
Merged
Merged
Conversation
The map and sidebar counted how much is instrumented, never what the
services said: a service declaring itself down left every number unchanged
and turned one 6 px dot red, colour-only, with the legend hidden on phones.
A sweep that read nothing kept the last snapshot on screen forever, green and
breathing, with no age anywhere. A failed first registry read meant ten
minutes of "Loading registry…". A streaming service whose API stopped
answering just lost its LIVE badge, and one whose stats failed kept showing
old figures beside LIVE.
- A status tally (ok / off-contract / degraded / down / unmeasured, services
only, archived counted by their reading) and the names of non-ok services,
in the map HUD and the sidebar; text chips on non-ok rows, a DOWN/DEGRADED
tag on the body's label, and the counts in document.title.
- The reading's age ("health checked HH:MM:SS") in the HUD and tooltip. After
150 s without a landed sweep the reading is stale: bodies dim and stop
breathing, the tally says "as of HH:MM", colours are kept. Time spent in a
hidden tab, or a resumed sweep still in flight, does not flash stale.
- The registry retries at 5 s, 15 s, 30 s, then 60 s until it first loads,
and the map and sidebar say "unreachable — retrying" instead of loading.
- Service I/O cards show CONNECTING / LIVE / OFFLINE, and figures from a
stats read that failed this poll show "—" with when they were last read.
- "Signals ingested this session" starts from each origin's first read, so
it no longer depends on whether the first poll beats the first frame.
Counting and wording live in a Phaser-free src/ui/ecosystem-status.ts with
tests.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Sep 21, 2026
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.
Stacked on #28 (← #27 ← #26) — merge in order. This PR's diff is only its own commit.
The codebase's own rule is that a body may only look as alive as the data behind it. Before this PR, the map broke that rule in five ways.
What the page could not say
down(e.g. signalmap's deliberate 503 with a body)13 ok · 1 off-contract · 0 degraded · 1 down · 0 unmeasured, followed bydown: Signal Map. The body's label gets a[DOWN]tag, the sidebar row adownchip, and the tab title(1 down) Mossland Space Hub ….health checked HH:MM:SS. After 150 s with no landed sweep the reading is stale: bodies dim and stop breathing, the tally readsas of HH:MM, and the title says stale. Colours are kept; a stale reading is never counted as a currentok.Registry unreachable — retrying, and the page recovers by itself.CONNECTINGbefore the first verdict, thenLIVEorOFFLINE(red badge and border, "no response this poll").—withno stats this poll · last read HH:MM:SS.Also: "signals ingested this session" (and its motes) now counts from each origin's first successful read. It used to depend on whether the first poll finished before the first 500 ms frame.
Rules the new states follow
off-contractis never merged intook, andunmeasurednever intodown(deliberate behaviours 2 and 3). Archived services are counted by their reading and tagged where named (algora is archived and off-contract).healthCheckedAt), never a service's owntimestamp. For static artifacts that timestamp is the build time.down · also on its label,archived · in place of its health).src/ui/ecosystem-status.ts, shared by HubMap, Sidebar and the scene, with unit tests.Between 768 and 1100 px, where the map HUD is short on room, the tally sits at the top of the sidebar's Ecosystem panel instead, and that panel now leads the tablet row so the tally is in view.
What is verified, and what is not
{status:"down"}, and Passportdegradedat the same time🤖 Generated with Claude Code