← the Atlas

ChromeBar declutter — show the commit once

feature · budding ·implemented ·

The srv·client·kaval identity rail printed the same commit three times in the happy path. Keep the three familiar columns, but show the shared commit once (in srv), collapse client to a muted ≡ when it matches, and move kaval's duplicate commit + closure-hash into its panel — so the rail stays recognizable while the redundancy is gone, and divergence still spells itself out inline.

The rail is too crowded — and most of it is the same fact, repeated. In a clean deploy the server, this browser’s bundle, and the kaval daemon are all built from one HEAD, so the rail prints d07ea54 three times behind three labels. packages/client/src/ui/IdentityRail.tsx Shipped in #1359 .

The crowding — three SHAs for one bit

srvv1.1.0d07ea54clientd07ea54kavald07ea5498eeac01h 50m
Before — d07ea54 printed three times (highlighted), plus a closure hash and three labels: ~10 tokens to say in sync · alive.

The three columns exist to flag disagreementclient ≠ srv (a stale cached bundle), kaval ⬆ update (the daemon a build behind). When everything agrees — the ~95% case — that machinery just repeats one identity. Only 98eeac0 (kaval’s nix closure hash) is genuinely distinct, and it’s a content hash, not a GitHub-navigable commit.

Show the commit once

Keep the three familiar columns and the labeled kaval panel button — just stop repeating the commit. It shows once, in srv (the canonical identity). client collapses to a muted (“same build as the server”), and kaval drops its duplicate commit + closure-hash down into its panel, keeping only its live dot · uptime on the strip.

srvv1.1.0d07ea54clientkaval1h 50m
After — the commit shows once. = client matches srv; kaval stays the labeled button (shaded) → its panel (build commit · 98eeac0 · restart · kaval-tui). One dot per axis: srv’s carries data-ws-status, kaval’s data-daemon-state.

No new affordance, no hover-to-reveal, no disclosure triangle — the rail reads the same as before, just without the echo. Every dropped fact stays reachable: the client commit in the About dialog, kaval’s commit + closure-hash in its panel.

Divergence spells itself out

The dedup only collapses what’s redundant. The moment a column actually disagrees it expands back to its own commit + an actionable chip — automatically, nothing to click. These are the signals the three columns existed for.

client behind server

srvv1.1.0d07ea54clienta1b2c3d≠ srv
≠ srv — the gives way to the client’s own SHA + a one-click reload nudge. clientStale()

kaval a build behind

srvv1.1.0d07ea54kaval1h 50m⬆ update
⬆ update on the kaval button — click it → panel with running-vs-expected + Restart. kavalUpdatePending()

daemon stopped

srvv1.1.0d07ea54kavalnot running
red dot + state label replace the uptime; pairs with the degraded canvas. DAEMON_STATE_PRESENTATION[state].label

server unreachable

srvv1.1.0d07ea54client
red srv dot — the WS liveness dot (the e2e data-ws-status hook), distinct from a red kaval dot. wsDot(props.status)

What moves where — nothing is lost

srv column — wsDot dot · version · Commit (the ONE commit)client column — clientStale()?≡ (matches srv)client's own Commit + ≠ srv badgekaval column (button) — kavalDot dot · uptime · ⬆update?KavalInfoDialog — build commit · 98eeac0 · restart · kaval-tuiwsDot — shared by srv dot + mobile connection dot falsetrue (clientStale)click
The same per-column accessors the rail reads today. The server commit is the one shown; clientStale() decides whether client renders a muted ≡ or fans out to its own commit + ≠srv badge; the kaval column stays a button onto KavalInfoDialog, which is now the home for kaval's build commit + closure-hash (its dot + uptime stay on the strip, with ⬆update / a state label when it diverges). srvDot/statusStyles are deduped behind one shared wsDot helper used by both the desktop rail and the mobile connection dot.
Current elementWhere it lives now
server committhe one shown (srv column), a GitHub link
client commit (when it matches)a muted — its real SHA is in the About dialog
client commit (when stale)inline, beside the ≠ srv chip
kaval commitKavalInfoDialog (off the strip)
kaval closure hash 98eeac0KavalInfoDialog (it’s a content hash, not navigable)
kaval dot · uptime · ⬆ updateinline on the kaval button (unchanged)
srv WS-tone map (was duplicated in mobile chrome)one shared wsDot in useDaemonStatus.ts

What we tried first — and backed off

The first cut went further: collapse to a single worst-of health dot + one commit, with the per-source split behind a hover tooltip and a disclosure that opened the kaval panel. Driving it live killed it on two counts:

So the shipped design keeps the familiar columns and the labeled kaval button, and just deletes the echo. Two further-out options, for the record: