UAT: TUI MainScreen missing Throbber widget (rainbow gradient bar for actor processing state) #1331

Open
opened 2026-04-02 16:52:31 +00:00 by freemo · 0 comments
Owner

Bug Report: [tui] — Throbber widget is not implemented in MainScreen

Severity Assessment

  • Impact: Medium. Users have no visual feedback when the actor is processing. The spec defines this as a key layout element visible in all sidebar states.
  • Likelihood: 100% reproducible — the throbber widget does not exist.
  • Priority: Medium

Location

  • File: src/cleveragents/tui/app.pycompose() method (lines 107–120)
  • Directory: src/cleveragents/tui/widgets/ — no throbber widget file exists

Description

The specification defines a Throbber as a required element in the MainScreen layout for all sidebar states:

"Throbber (top edge): rainbow gradient bar, visible only when the actor is processing. Collapses to zero height when idle."

The spec also describes it in detail (§Throbber):

"A rainbow gradient animated bar spans the full width at the top, visible only when the actor is processing"

The throbber should:

  1. Span the full terminal width at the top of the screen
  2. Display a rainbow gradient animation while the actor is processing
  3. Collapse to zero height when idle (not just hidden — zero height so layout doesn't shift)
  4. Be visible in all three sidebar states (hidden, visible, fullscreen)

Actual Behavior

The compose() method does not yield any throbber widget:

def compose(self) -> Any:
    yield _Header(show_clock=True)  # Textual's built-in Header, not a throbber
    with _Vertical(id="main-column"):
        yield _Static("CleverAgents TUI", id="conversation")
        # ... no throbber

The src/cleveragents/tui/widgets/ directory contains only:

  • help_panel_overlay.py
  • persona_bar.py
  • prompt.py
  • reference_picker.py
  • slash_command_overlay.py

No throbber widget exists anywhere in the codebase.

Expected Behavior (from spec)

A Throbber widget should be yielded at the top of the screen layout, before the main content area. It should:

  • Use CSS height: 1 when active, height: 0 when idle
  • Display a rainbow gradient (cycling through ROYGBIV or Dracula palette colors)
  • Subscribe to A2A actor processing events to toggle its active state

Steps to Reproduce

  1. Run the TUI
  2. Send a message to the actor
  3. Observe: no rainbow gradient bar appears at the top during processing
  • #694 (feat(tui): Textual MainScreen with sidebar states and Dracula theme)
  • #1315 (Refactor TUI to Align with ADR-44 and ADR-45)

References

  • Spec §MainScreen Layout — Sidebar Hidden (key elements list)
  • Spec §MainScreen Layout — Sidebar Visible (key elements list)
  • Spec §Throbber
## Bug Report: [tui] — Throbber widget is not implemented in MainScreen ### Severity Assessment - **Impact**: Medium. Users have no visual feedback when the actor is processing. The spec defines this as a key layout element visible in all sidebar states. - **Likelihood**: 100% reproducible — the throbber widget does not exist. - **Priority**: Medium ### Location - **File**: `src/cleveragents/tui/app.py` — `compose()` method (lines 107–120) - **Directory**: `src/cleveragents/tui/widgets/` — no throbber widget file exists ### Description The specification defines a **Throbber** as a required element in the MainScreen layout for all sidebar states: > "**Throbber** (top edge): rainbow gradient bar, visible only when the actor is processing. Collapses to zero height when idle." The spec also describes it in detail (§Throbber): > "A rainbow gradient animated bar spans the full width at the top, visible only when the actor is processing" The throbber should: 1. Span the full terminal width at the top of the screen 2. Display a rainbow gradient animation while the actor is processing 3. Collapse to zero height when idle (not just hidden — zero height so layout doesn't shift) 4. Be visible in all three sidebar states (hidden, visible, fullscreen) ### Actual Behavior The `compose()` method does not yield any throbber widget: ```python def compose(self) -> Any: yield _Header(show_clock=True) # Textual's built-in Header, not a throbber with _Vertical(id="main-column"): yield _Static("CleverAgents TUI", id="conversation") # ... no throbber ``` The `src/cleveragents/tui/widgets/` directory contains only: - `help_panel_overlay.py` - `persona_bar.py` - `prompt.py` - `reference_picker.py` - `slash_command_overlay.py` No throbber widget exists anywhere in the codebase. ### Expected Behavior (from spec) A `Throbber` widget should be yielded at the top of the screen layout, before the main content area. It should: - Use CSS `height: 1` when active, `height: 0` when idle - Display a rainbow gradient (cycling through ROYGBIV or Dracula palette colors) - Subscribe to A2A actor processing events to toggle its active state ### Steps to Reproduce 1. Run the TUI 2. Send a message to the actor 3. Observe: no rainbow gradient bar appears at the top during processing ### Related Issues - #694 (feat(tui): Textual MainScreen with sidebar states and Dracula theme) - #1315 (Refactor TUI to Align with ADR-44 and ADR-45) ### References - Spec §MainScreen Layout — Sidebar Hidden (key elements list) - Spec §MainScreen Layout — Sidebar Visible (key elements list) - Spec §Throbber
freemo self-assigned this 2026-04-02 18:45:22 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cleveragents/cleveragents-core#1331
No description provided.