Files
cameleer-server/UI_FINDINGS.md
hsiegeln 673f0958c5
All checks were successful
CI / cleanup-branch (push) Has been skipped
CI / build (push) Successful in 1m4s
CI / docker (push) Successful in 58s
CI / deploy-feature (push) Has been skipped
CI / deploy (push) Successful in 38s
revert: temporarily revert EIP_CIRCUIT_BREAKER compound rendering
Reverting e8039f9 to diagnose compound rendering regression affecting
all compound types (SPLIT, CHOICE, LOOP, DO_TRY) and error handlers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 18:15:10 +02:00

18 KiB

UI/UX Evaluation Report — Cameleer3 Server

Date: 2026-03-25 Evaluated URL: http://192.168.50.86:30090/ Methodology: Playwright-driven navigation of all major pages (14 screenshots), evaluated by 3 specialist agents: Visual Design, Information Architecture & Usability, Readability & Accessibility.


Executive Summary

The Cameleer3 dashboard has a distinctive, well-crafted warm amber design language that stands out in the observability space. The core monitoring pages (Dashboard, Exchange Detail, Routes, Agents) are polished and consistent. The design system provides a solid foundation.

Key strengths: KPI strip pattern, command palette (Ctrl+K), agent card grouping, dark mode token system, cohesive brand identity.

Critical gaps to address:

  1. Font sizes too small — pervasive 10-11px text for critical data impairs reading under stress
  2. Color contrast failures--text-muted and --text-faint fail WCAG AA in both themes
  3. Status indicators rely on color alone — not accessible for color-blind users
  4. Admin infrastructure pages lag in polish — Database/OpenSearch use ad-hoc styling
  5. Dashboard is a monitoring display, not yet an incident response tool — missing error highlighting, per-route error breakdowns, actionable status pages

Overall Score: 7/10 — Strong foundation, needs targeted fixes for production readiness under stress.


Pages Evaluated

# Page Screenshot
1 Login screenshots/14-login-page.png
2 Dashboard (light) screenshots/01-dashboard.png
3 Dashboard + Detail Panel screenshots/02-dashboard-detail-panel.png
4 Exchange Detail screenshots/03-exchange-detail.png
5 Routes Metrics screenshots/04-routes-metrics.png
6 Agent Health screenshots/05-agents.png
7 Agent Instance screenshots/06-agent-instance.png
8 Admin RBAC screenshots/07-admin-rbac.png
9 Admin Audit Log screenshots/08-admin-audit.png
10 Admin OIDC screenshots/09-admin-oidc.png
11 Admin Database screenshots/10-admin-database.png
12 Admin OpenSearch screenshots/11-admin-opensearch.png
13 Command Palette screenshots/12-command-palette.png
14 Dashboard (dark) screenshots/13-dashboard-dark-mode.png

Page-by-Page Findings

Login Page

  • [Important] No brand identity — missing camel logo/icon from sidebar. First impression feels generic.
  • [Important] Sign-in button color mismatch — uses washed-out gold, not the saturated --amber (#C6820E) used throughout the app.
  • [Important] No SSO/OIDC button visible — system supports OIDC but login page only shows username/password.
  • [Important] Subtitle text --text-muted (#9C9184) on white fails WCAG AA (~2.8:1, needs 4.5:1).
  • [Important] White text on amber button fails WCAG AA for normal text (~3.2:1).
  • [Nice-to-have] Card has no shadow/border against the --bg-body cream background — minimal separation.

Dashboard

  • [Important] Errors KPI card uses red/orange accent border even when errors = 0. Zero-error state should feel reassuring (green/neutral), not alarming. Creates false alarm fatigue.
  • [Important] Table lacks visible sort indicators — no arrows showing current sort direction.
  • [Important] Duration column uses color alone (.durFast green, .durSlow amber, .durBreach red) — not color-blind safe.
  • [Important] Status dots are ~6px — too small to reliably identify, especially for color-blind users.
  • [Critical] Table meta text at 11px with --text-muted is borderline illegible for fatigued users.
  • [Critical] KPI stat labels at 10px with --text-muted — below recommended 12px minimum.
  • [Nice-to-have] Exchange ID column too wide — truncate to 8 chars with copy-on-click.

Dashboard — Detail Panel

  • [Important] Panel lacks clear visual separation from main table — needs left border accent or different background.
  • [Important] Processor timeline preview in panel is too small to read — adds visual noise without utility.
  • [Critical] Overview labels at 10px with --text-muted — nearly invisible.
  • [Critical] Panel section meta at 10px with --text-faint (#C4BAB0) on white — contrast ratio ~1.9:1, severely fails WCAG AA.
  • [Nice-to-have] No quick actions (copy exchange ID, view logs, view route diagram).

Exchange Detail

  • [Critical] Processor timeline label column too narrow — processor names are truncated/illegible. This is the page's primary visualization.
  • [Critical] No error highlighting in processor timeline — failed processors need red bars/icons. During incidents, engineers must instantly see WHICH processor failed.
  • [Important] No linkage to route diagram — "View in Route Diagram" would overlay execution on the visual route graph.
  • [Important] Long exchange ID in breadcrumb is visually heavy — truncate with copy button.
  • [Important] Header stat labels at 10px uppercase with --text-muted — same contrast issue.

Routes Metrics

  • [Important] KPI number formatting inconsistent — Dashboard shows "11.742 ms" (decimal + space), Routes shows "11742ms" (no decimal, no space).
  • [Important] No per-route error rate column — error rate in KPI strip but not broken down per route.
  • [Important] Charts disconnected from table — clicking a route should filter/highlight its chart data.
  • [Nice-to-have] No visual comparison between routes (bar chart or heatmap for quick identification of slowest).

Agent Health

  • [Critical] Stale/Dead agent visual distinction is too subtle — at 3am, the difference between LIVE and DEAD must scream. Dead agents should have prominent red background or strikethrough, not just --text-muted.
  • [Critical] Agent state dots (green live, amber stale, gray dead) use color alone — no shape variation for color-blind users.
  • [Important] "2/26" active routes KPI is ambiguous — unit and meaning need to be explicit.
  • [Nice-to-have] Timeline at bottom takes significant space — consider making it collapsible.

Agent Instance Detail

  • [Important] Charts lack threshold/alert lines — CPU at 2% is fine, but where is "concerning"? Configurable thresholds (CPU > 80%, Memory > 90%) would make charts actionable.
  • [Important] Chart axis labels appear too small.
  • [Nice-to-have] GC Pauses uses area fill while others use line charts — minor inconsistency.
  • [Nice-to-have] Six charts in 2x3 grid can create cognitive overload — consider collapsible groups.

Admin — RBAC

  • [Important] KPI strip for "Users: 1, Groups: 2, Roles: 4" has too much visual weight — these low-value numbers don't need full stat-card treatment.
  • [Important] "ADMIN" role badge vs "ADMINS" group badge look identical — different badge styles needed (outlined for groups, filled for roles).
  • [Nice-to-have] Empty detail panel ("Select a user to view details") needs icon/illustration.

Admin — Audit Log

  • [Important] "no data" empty state is uninformative — should explain "No audit events match your filters" with guidance.
  • [Important] No export functionality — audit logs need CSV/JSON export for compliance.
  • [Important] Date range filters use raw datetime inputs — inconsistent with dashboard's polished time range pills.

Admin — OIDC Config

  • [Critical] "Delete OIDC Configuration" is a destructive action without confirmation dialog — could lock out all SSO users.
  • [Important] No inline validation — Issuer URL should validate format on blur, required fields need indicators.
  • [Nice-to-have] No connection test result display area.

Admin — Database

  • [Important] Visual treatment inconsistent with rest of app — "Connected" status and pool stats use ad-hoc text, not design system components.
  • [Important] Page title "Database Administration" implies actions, but page is read-only — rename to "Database Status" or add operations.
  • [Nice-to-have] Table row counts should be right-aligned for numerical scanning.

Admin — OpenSearch

  • [Critical] "Disconnected" status displayed as plain text — needs error styling (red text, error badge, or status banner). Infrastructure disconnection is a critical state.
  • [Important] "Yellow" cluster health displayed as plain text with no visual hierarchy — same size/weight as version number and node count.
  • [Important] Indexing pipeline stats use ad-hoc inline format — should use consistent stat-card pattern.
  • [Important] "Disconnected" + "Yellow" health shown simultaneously is contradictory — if disconnected, clarify whether data is stale.

Command Palette

  • [Nice-to-have] No visible keyboard navigation hint for currently selected item.
  • [Nice-to-have] Empty palette should show recent/frequent items instead of requiring typing.
  • Overall well-executed — categories, counts, keyboard hints in footer.

Dark Mode

  • [Critical] --text-muted (#7A7068) on --bg-surface (#242019) is ~2.9:1 — fails WCAG AA. Affects ALL muted labels across every page.
  • [Critical] --text-faint (#4A4238) on --bg-surface (#242019) is ~1.4:1 — catastrophically fails WCAG AA. Essentially invisible.
  • [Important] --amber (#D4941E) on --bg-surface (#242019) is ~3.6:1 — amber links/active text fail AA.
  • [Important] KPI sparkline chart lines are harder to read — thin strokes need increased width or brightness.
  • [Important] Sidebar boundary contrast drops significantly (--sidebar-bg #141210 vs --bg-body #1A1714 is only ~6 units apart).
  • [Important] Table row alternation contrast near zero in dark mode.
  • [Nice-to-have] Amber accent color shift from #C6820E to #D4941E is well-handled.
  • [Nice-to-have] Semantic colors (success, error, warning) appropriately increase luminance.

Cross-Cutting Issues

1. Color Contrast (WCAG AA Failures)

Light Mode:

Element Foreground Background Ratio Required Verdict
StatCard labels, table meta, section headers --text-muted #9C9184 #FFFFFF ~3.0:1 4.5:1 FAIL
Panel meta, overview hints --text-faint #C4BAB0 #FFFFFF ~1.9:1 4.5:1 FAIL
Sign-in button text #FFFFFF --amber #C6820E ~3.2:1 4.5:1 FAIL
Sidebar muted text #9C9184 --sidebar-bg #2C2520 ~3.1:1 4.5:1 FAIL

Dark Mode:

Element Foreground Background Ratio Required Verdict
All muted labels #7A7068 #242019 ~2.9:1 4.5:1 FAIL
All faint hints #4A4238 #242019 ~1.4:1 4.5:1 FAIL
Amber links/active text #D4941E #242019 ~3.6:1 4.5:1 FAIL

Fix: Change --text-muted to #766A5E (light) / #9A9088 (dark). Restrict --text-faint to decorative use only or lighten dark variant to #6A6058.

2. Font Size Floor

10px text is used for: StatCard labels, overview labels, chain labels, section meta, error class names, detail labels, sidebar tree labels. 11px is used for: table meta, error messages, pagination, toggle buttons, chart titles.

Fix: Establish --font-size-min: 12px as a design system floor. Update all 10px instances to 12px, all 11px instances to 12px.

3. Number/Unit Formatting

Inconsistent across pages:

  • Dashboard: "11.742 ms" (decimal + space)
  • Routes: "11742ms" (no decimal, no space)
  • Dashboard: "1.1 msg/s" vs Agent Instance: "0.1/s"

Fix: Create a shared formatting utility enforcing: consistent decimal precision, space before unit, consistent abbreviations.

4. KPI Strip Inconsistency

Used on Dashboard, Routes, Agents, Agent Instance (consistent). But RBAC uses oversized cards for trivial counts, and Database/OpenSearch use ad-hoc text rendering.

Fix: Admin infra pages should adopt KPI stat strip or a compact-stat component.

5. Empty States

Inconsistent handling:

  • Audit Log: "no data" in plain gray
  • RBAC detail: "Select a user to view details" in gray
  • No consistent empty state component with icon + message + CTA

Fix: Design system EmptyState component with icon, message, and optional action.

6. Status Indicator Accessibility

Color-only status encoding throughout:

  • Duration: green (fast), amber (slow), red (breach) — no icons
  • Status dots: green (live), amber (stale), gray (dead) — no shapes
  • Agent dead state uses --text-muted instead of --error

Fix: Add shape variation (checkmark/triangle/X), increase dot size to 10px minimum, always render text label alongside.

7. Sidebar Structure

Same apps listed 3x (under Applications, Agents, Routes) — triples sidebar length and scales poorly.

Fix: Unified application-centric tree where expanding an app shows its agents and routes as children.


Prioritized Recommendations

Critical (fix now)

# Recommendation Impact
1 Bump --text-muted to WCAG AA compliance — #766A5E (light) / #9A9088 (dark). Single highest-impact fix across all pages. Fixes majority of contrast failures
2 Establish 12px minimum font size — update all 10px and 11px instances. Especially StatCard labels, overview labels, table meta. Readable under stress
3 Add error highlighting to processor timeline — red bars, error icons for failed processors. Core debugging view. Incident response speed
4 Make Stale/Dead agent states unmistakable — full card background color (yellow stale, red dead), prominent badge. Change dead from --text-muted to --error. Prevents missed outages
5 Fix OpenSearch "Disconnected" status — use error badge/banner, add "Reconnect" action, clarify stale data. Actionable admin page
6 Add confirmation dialog for OIDC deletion — type-to-confirm to prevent locking out SSO users. Prevents lockout
7 Color Errors KPI card conditionally — green/neutral at 0, red only when > 0. Prevents false alarm fatigue. Reduces noise

Important (next sprint)

# Recommendation Impact
8 Add secondary encoding to status indicators — shapes (checkmark/triangle/X) alongside color dots. Increase dot size to 10px+. Accessibility compliance
9 Standardize number/unit formatting — shared utility for decimals, spacing, unit abbreviations. Visual consistency
10 Add per-route error rate to Routes table — essential for isolating failing routes. Incident triage
11 Add visible sort indicators to data tables — arrows on column headers. Data exploration
12 Bring admin infra pages to design system quality — replace ad-hoc text with KPI strips/stat cards. Professional polish
13 Fix login page brand identity — add camel logo, use correct --amber for button, add SSO button when OIDC configured. First impression
14 Fix dark mode specifics — increase sidebar boundary contrast (add 1px border), boost chart stroke width, fix amber link contrast. Dark mode usability
15 Widen processor timeline label column — prevent name truncation, add tooltips for long names. Core visualization
16 Add detail panel visual separation — 2px left border accent. Layout clarity
17 Pin Admin/API Docs to sidebar footer — accessible without scrolling. Navigation
18 Audit log improvements — informative empty state, CSV/JSON export, date picker consistent with dashboard. Admin usability
19 OIDC form validation — inline URL validation, required field indicators, test result display. Configuration safety
20 Fix amber button text contrast — darken button to #8B5A06 or use dark text on amber. Accessibility

Nice-to-have (backlog)

# Recommendation Impact
21 Unify sidebar into single application-centric tree (Applications > agents + routes) Scalability
22 Truncate Exchange IDs to 8 chars with copy-on-click Table space
23 Add threshold/alert lines to agent metric charts Actionable monitoring
24 Link charts to table selection on Routes Metrics Data exploration
25 Add clickable KPI cards navigating to filtered views Navigation shortcuts
26 Add prefers-reduced-motion support for StatusDot pulse animation Accessibility
27 Add tooltips to sparkline charts showing value on hover Data context
28 Replace hardcoded #5db866 in Dashboard.module.css with var(--success) Token compliance
29 Add keyboard navigation indicators to command palette (selected item highlight) Power user UX
30 Show recent/frequent items in empty command palette Discoverability
31 Consolidate duplicated table-header CSS into design system component Maintainability
32 Login page card shadow for visual lift Polish
33 Collapsible agent event timeline Space efficiency
34 Dark mode --text-faint increase to #6A6058 for 3:1 minimum Accessibility
35 Increase DataTable row height to 44px (touch target minimum) Accessibility

Dark Mode Assessment

Grade: Good foundation, specific contrast concerns.

What works well:

  • Token system remaps all semantic colors without introducing cold blue-grays — warm brand preserved
  • Amber accent brightens appropriately (#C6820E → #D4941E)
  • Error/warning/success colors increase luminance correctly
  • Shadows shift from warm semi-transparent to opaque — correct for dark backgrounds

What needs fixing:

  • Sidebar contrast: --sidebar-bg #141210 vs --bg-body #1A1714 only ~6 units apart (was ~50 in light mode)
  • Chart line visibility: thin 1-2px strokes need increased width
  • Table row alternation: near-zero contrast between --bg-surface and --bg-raised
  • --text-faint: essentially invisible at 1.4:1 contrast
  • --text-muted: 2.9:1 — below AA minimum