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>
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:
- Font sizes too small — pervasive 10-11px text for critical data impairs reading under stress
- Color contrast failures —
--text-mutedand--text-faintfail WCAG AA in both themes - Status indicators rely on color alone — not accessible for color-blind users
- Admin infrastructure pages lag in polish — Database/OpenSearch use ad-hoc styling
- 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-bodycream 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 (
.durFastgreen,.durSlowamber,.durBreachred) — 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-mutedis 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-mutedinstead 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-surfaceand--bg-raised --text-faint: essentially invisible at 1.4:1 contrast--text-muted: 2.9:1 — below AA minimum