Claude Sonnet Council
Judge 1: CLI UX JUDGE
-
[HIGH]
casectl topis completely absent from the CLI reference page and Getting Started. It exists inmain.pyat line 592 with--interval/--onceoptions, interactive keys (m/+/-/q), and terminal size checking – all undocumented. -
[HIGH]
greenandlimeare both mapped to(0, 255, 0)in_COLOR_NAMES. Identical colours with different names. The error message lists all 16 names including this duplicate. -
[MEDIUM]
config setrequires raw integers (casectl config set fan mode 0) whilefan modeaccepts names (casectl fan mode follow-temp). The asymmetry is a discoverability trap. No warning is issued. -
[MEDIUM]
casectl top --interval 0is silently clamped rather than rejected. The help text says(0.5-60)which looks like a hint rather than a constraint. -
[LOW]
fan speedoutputs raw hardware duty (0-255) in its confirmation message after the user supplied a 0-100 percentage. -
[LOW] Help text on
led colorshowscasectl led color #FF0080without quoting. On bash/zsh,#begins a comment. The site docs correctly quote it, but--helpoutput does not.
Judge 2: WEB DASHBOARD REVIEWER
-
[HIGH] The OLED rotation dropdown has no
hx-*attributes. If WebSocket is unavailable and HTMX fallback fires, rotation changes are silently lost. The HTMX fallback inws-controls.jsworks, but the HTML element itself is not fallback-safe. -
[HIGH] The OLED preview shows hardcoded static content:
12:34:56andCPU: --.-deg.C. This is mockup data, not live temperature. Users cannot tell it doesn’t reflect actual values. -
[MEDIUM] Fan “All fans” slider and per-channel sliders can desync visually. The unified slider updates per-channel values but not the reverse.
-
[MEDIUM]
base.htmlfooter hardcodes"Freenove FNK0107B case controller". FNK0107B is one specific model; the hardware matrix covers A through L. -
[MEDIUM] SSE connection in
realtime.jshas no visible UI indicator. Users on intermittent networks won’t know if live updates are flowing. -
[LOW] All four dashboard cards show “Live” badge unconditionally, even when WebSocket is disconnected and SSE has failed.
-
[LOW] Google Fonts loaded from CDN. On isolated LAN setups, fonts will fail silently. A headless-first product should handle offline.
Judge 3: ERROR MESSAGE CRITIC
-
[HIGH] All connection-error handlers print
"Cannot connect to casectl daemon."without showing which host was attempted. If--hostis set wrong, the message gives no hint. -
[HIGH] For a 401 Unauthorized, users see raw status code with no hint they need a token. For 422, they see raw FastAPI validation JSON which is not human-friendly.
-
[MEDIUM] The
doctorcommand I2C probe failures say"Check expansion board connection"without suggestingi2cdetect -y 1, which the troubleshooting section recommends. -
[MEDIUM]
led colorvalidation for wrong argument count is helpful but the inline list of all 16 names wraps messily in narrow terminals. -
[LOW]
config setshows coerced Python value (Truefortrue). No error shown for invalid section/key – that comes as raw JSON from the 422 response.
Judge 4: ONBOARDING EXPERIENCE JUDGE
-
[HIGH]
casectl top– the most visually engaging v0.2 feature – appears nowhere in Getting Started, CLI reference, or architecture page. -
[HIGH] API reference shows
POSTfor all mutation endpoints, but CLI and web dashboard both usePUT. Developers copying curl examples get405 Method Not Allowed. -
[HIGH] Architecture diagram shows TUI as
"TUI (soon)".casectl topshipped in v0.2. The diagram actively misinforms new users. -
[MEDIUM] Getting Started doesn’t guide users to
casectl service installfor autostart. The happy path ends abruptly at “Basic CLI”. -
[MEDIUM] Getting Started shows
casectl config set fan mode 0with comment about integer enums, right after demonstratingcasectl fan mode follow-temp. The inconsistency is unexplained.
Judge 5: ACCESSIBILITY JUDGE
-
[HIGH]
greenandlimeLED swatches display the same colour (#00FF00) with different labels. Creates a false choice that misleads all users – sighted, colour-blind, and screen-reader alike. -
[HIGH] The
whiteswatch on a dark card background may need a visible border to distinguish it from surrounding UI. Thenavyswatch is very dark and hard to distinguish from the off/dark card areas. -
[MEDIUM] Status dot uses colour alone to convey system health (green/amber/red). The blinking animation on error is suppressed by
prefers-reduced-motion, leaving no non-colour distinguisher for colour-blind users. -
[MEDIUM] HTMX’s
hx-swap="innerHTML"partial replacements do not manage focus. After a partial refresh, interactive controls lose focus state, potentially interrupting screen reader or keyboard users. -
[LOW] OLED preview is a purely visual mockup with
aria-label="OLED display preview"but contains static fake data. A screen reader will read it as if it’s live state.
Consolidated Report
Critical Issues (must fix)
- API docs use POST; code uses PUT. Every mutation curl example will return 405.
casectl topis undocumented everywhere on the site.- Architecture diagram marks TUI as “soon” after it shipped.
pyproject.tomlversion is still0.1.0.
Important Issues (should fix)
greenandlimeare the same colour(0, 255, 0)– should differentiate- MQTT, automation, and alerting plugins not documented
- Hex colour in CLI
--helpis unquoted (breaks on bash) - Connection error messages omit the URL attempted
- OLED preview shows hardcoded static content
- Getting Started doesn’t guide to
casectl service install
Positive Observations
- CLI has genuinely excellent error messages in
casectl doctor– actionable fix commands embedded in failure output casectl tophas well-thought-out defensive checks: TTY detection, terminal size validation, interval clamping,--onceescape hatch- Web dashboard accessibility fundamentals are solid: skip link, ARIA progress bars, form labels, status dot aria-label, live regions,
aria-current - Dual SSE + HTMX polling architecture with exponential backoff is well-engineered
- Named colour support has full CLI-to-web parity across all three input methods