carlos / platform Public

console: the dashboard's domain attention dot predates the derived states Issue open

Migrated from github.com/carlosframework/platform issue #360, opened 2026-08-28. GitHub issues are closed for this repo; see AGENTS.md, "Work is tracked on amadan, not GitHub".

Still outstanding: The dashboard's domain attention dot predates the derived states and branches on raw strings.

---

Found while moving the app Settings page onto the derived domain states (#299, PR #357).

The Settings page now derives state/reason/detail through domainState() over the fleet-wide alias readings — the same inputs and the same function carlos domains list and the API doors use. The dashboard does not.

domainNeedsAttention (internal/console/overview.go) reads DomainView.TLS and DomainView.Guidance, which the shared view builder (view.go's domainView) fills in from this box's own registry copy of a route — rt.Status, rt.DNSStatus, rt.CertExpiresAt. That is the pre-#299 story, and it can disagree with the Settings page about the same hostname at the same moment.

Two concrete divergences:

  • A domain whose certificate has been failing for hours now reads failed on Settings (from the warm-outcome records, #299 §3e / PR #356). The dashboard has no idea: the local registry row carries no attempt history, so the dot stays green.
  • A custom domain homed on another box has no local registry row here at all, so the dashboard reads it from nothing while Settings reads it from the box that actually serves it.

Not fixed in PR #357 deliberately, and I would rather name the reason than bury it: the state is threaded at settingsDomains, which is the Settings page's own assembly point and already has the bucket. domainView is called from the shared view builder, which has no fleet fold behind it, so threading it there pulls in the overview and dashboard paths together — a wider change than the one that was asked for, and one that wants its own review.

Fix shape: fold the readings and warm records once in assembleOverview, hand them to domainView, and give domainNeedsAttention a State-aware branch (failed, misdirected and pending-dns are attention; checking, issuing-cert and live are not — issuing is patience, which is the rule the current function already tries to express). DomainView already carries the three fields.

🤖 Written by an LLM (Claude), while implementing #299 §3e.