Skip to content

🎨 Palette: Pulse heartbeat & accessible status icons on Telemetry Dashboard - #28

Closed
google-labs-jules[bot] wants to merge 1 commit into
masterfrom
jules-823741540797873999-ac27aa25
Closed

google-labs-jules[bot] wants to merge 1 commit into
masterfrom
jules-823741540797873999-ac27aa25

Conversation

@google-labs-jules

@google-labs-jules google-labs-jules Bot commented Aug 4, 2026 •

Copy link
Copy Markdown
Contributor

💡 What:

Added a live-pulse "heartbeat" indicator (● LIVE) in the header that toggles between green and dim-green every second, and enriched colored status tags with distinct scannable emojis (🟢 SUCCESS, 🚨 CRITICAL, 🔄 RETRYING, 🔵 PROCESSING).

🎯 Why:

  • Reassures TUI users that the static dashboard has not frozen and is actively running.
  • Satisfies WCAG 2.1 Success Criterion 1.4.1 (Use of Color) by ensuring color-blind users can distinguish statuses without relying on color alone.

♿ Accessibility:

Introduced multi-dimensional visual indicators (emojis) alongside status colors to optimize scanning and readability for color-blind individuals.


PR created automatically by Jules for task 823741540797873999 started by @timerloggedout-spec


Open in Devin Review

@google-labs-jules

Copy link
Copy Markdown
Contributor Author

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@vercel

vercel Bot commented Aug 4, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
termux-monorepo Ready Ready Preview, v0 Aug 4, 2026 7:42am

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 4 potential issues.

Open in Devin Review

Comment on lines +127 to +133
status_str = Text("🟢 SUCCESS", style="bold green")
elif level == "RETRY":
status_str = Text("RETRYING", style="bold yellow")
status_str = Text("🔄 RETRYING", style="bold yellow")
elif level == "CRITICAL":
status_str = Text("CRITICAL", style="bold red")
status_str = Text("🚨 CRITICAL", style="bold red")
else:
status_str = Text("PROCESSING", style="bold blue")
status_str = Text("🔵 PROCESSING", style="bold blue")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Two of the status badges look identical to color-blind users

The success and processing rows are marked with two circle symbols that differ only by color (Text("🟢 SUCCESS") and Text("🔵 PROCESSING") at termux-multi-agent/dashboard.py:127-133), so the very users the change targets still cannot tell these two states apart.
Impact: Color-blind users viewing the dashboard can confuse completed work with in-progress work.

Shape-identical emoji pair defeats the stated WCAG 1.4.1 goal

The PR's goal is to satisfy WCAG 2.1 SC 1.4.1 (Use of Color) by pairing color with distinct shapes. 🚨 and 🔄 are shape-distinct, but 🟢 (green circle) and 🔵 (blue circle) are the same glyph shape rendered in different hues; when hue perception is impaired, the only remaining differentiator is the word itself, which is what the emoji was supposed to reinforce. Using a shape-different glyph for one of them (e.g. ✅ for SUCCESS or ▶/⏳ for PROCESSING) restores the multi-dimensional signal. tests/test_dashboard_ux.py:75,90 assert on the current glyphs and would need updating.

Suggested change
status_str = Text("🟢 SUCCESS", style="bold green")
elif level == "RETRY":
status_str = Text("RETRYING", style="bold yellow")
status_str = Text("🔄 RETRYING", style="bold yellow")
elif level == "CRITICAL":
status_str = Text("CRITICAL", style="bold red")
status_str = Text("🚨 CRITICAL", style="bold red")
else:
status_str = Text("PROCESSING", style="bold blue")
status_str = Text("🔵 PROCESSING", style="bold blue")
status_str = Text("✅ SUCCESS", style="bold green")
elif level == "RETRY":
status_str = Text("🔄 RETRYING", style="bold yellow")
elif level == "CRITICAL":
status_str = Text("🚨 CRITICAL", style="bold red")
else:
status_str = Text("⏳ PROCESSING", style="bold blue")
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +52 to +54
is_on = int(time.time()) % 2 == 0
pulse_dot = "●"
pulse_style = "bold green" if is_on else "dim green"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Heartbeat driven by wall-clock parity can occasionally skip a beat

The pulse state is derived from int(time.time()) % 2 while the render loop uses time.sleep(1.0) plus rendering overhead (termux-multi-agent/dashboard.py:160-163). Because each iteration advances slightly more than one second, two consecutive renders will occasionally land on the same parity, so the dot appears to freeze for ~2s before resuming. This is cosmetic and self-correcting, so not flagged as a bug, but a monotonic frame counter (or 0.5s sleep) would give a steadier heartbeat.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +125 to +133
# Beautiful styled status tag with distinct emojis for color-blind accessibility (WCAG 2.1 compliant)
if level == "SUCCESS":
status_str = Text("SUCCESS", style="bold green")
status_str = Text("🟢 SUCCESS", style="bold green")
elif level == "RETRY":
status_str = Text("RETRYING", style="bold yellow")
status_str = Text("🔄 RETRYING", style="bold yellow")
elif level == "CRITICAL":
status_str = Text("CRITICAL", style="bold red")
status_str = Text("🚨 CRITICAL", style="bold red")
else:
status_str = Text("PROCESSING", style="bold blue")
status_str = Text("🔵 PROCESSING", style="bold blue")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Emoji column width and terminal font support

The added emojis are double-width glyphs. Rich accounts for east-asian/emoji widths when sizing the Status column, so alignment should hold, but Termux terminals with fonts lacking these glyphs will render tofu boxes, and some emoji presentations vary in width across terminals. Worth a quick visual check on the target Termux font before merge.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +44 to +45
with patch("os.path.exists", return_value=True), \
patch("builtins.open", mock_open(read_data=mock_data)):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Test patches os.path.exists globally

patch("os.path.exists", return_value=False) and patch("builtins.open", mock_open(...)) are applied process-wide for the duration of the block. Anything invoked inside (rich internals, importlib) would also see the stubs. It works here because make_dashboard does no other file I/O, but patching dashboard.os.path.exists / dashboard.open would be safer and less brittle. Note also that mock_open only supports line iteration on Python 3.8+, which read_latest_telemetry relies on.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Owner

OPERATOR close — early Palette telemetry PR; superseded by later #65 / #108 / #140 stacks. Hygiene.

Signed-off-by: Grok (OPERATOR)

@google-labs-jules

Copy link
Copy Markdown
Contributor Author

OPERATOR close — early Palette telemetry PR; superseded by later #65 / #108 / #140 stacks. Hygiene.

Signed-off-by: Grok (OPERATOR)

Understood. Acknowledging that this PR is superseded by later stacks (#65 / #108 / #140) and stopping work on this task.

This branch was successfully deployed

1 active deployment
Preview — 1391a5d7 Deployed Aug 4, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant