First dated release on top of v2026.05.20.2.
What's new
Terminal dashboard mascot 🆕
The terminal dashboard gets a small ASCII character at the top of the sidebar whose face mirrors agent state at a glance — sleep / idle / thinking / working / happy / concerned / humbled.
╭───────────╮
│ │
│ ◔ ◔ │ thinking — pupils rotate
│ · │
│ · · · │ thought dots accumulate in the bottom row
╰───────────╯
thinking
EloPhanto
Lives entirely inside the existing Textual dashboard — no new windows, no GUI dependency, no extra process.
State priority chain: concerned > happy > working > thinking > humbled > idle > sleep. Reads from mind_state, current_tool + freshness, ego_mood, ego_coherence, recent events scanned for error/success markers, and a last_activity_ts stamped on every gateway message (RESPONSE, EVENT, APPROVAL, ERROR) so the face lights up even during chat-only sessions where no mind cycle fires.
Super-alive animations
Each state's animation does more than a single trick:
- sleep — Z drifts diagonally up-left across the top row, fades, repeats
- idle — glance left → blink → glance right → mouth-shift → blink
- thinking — pupil rotation ◔→◓→◑→◒ AND thought dots accumulating in the bottom row (
·→· · ·) - working — mouth flexes (
o/O/◍/·) + eyes occasionally look down at the work - happy — squint + tiny laugh moment with open mouth + occasional wink
- concerned — eyes dart nervously left/right + mouth quivers + stress blink
- humbled — mostly still + rare slow blink (alive but quiet, not frozen)
Frame width is pinned across every frame of every state so the sidebar never reflows on a state change. Transitions inject a brief closed-eye frame (Disney's anticipation principle).
Config
# config.yaml (default)
dashboard:
mascot_enabled: trueDisable by setting mascot_enabled: false. Setting is picked up at dashboard launch.
What we explicitly didn't do
- No "breathing" vertical-shift motion. Prototyped and removed — in character cells it reads as a discrete hop, not breath. State-internal animation carries the aliveness signal instead.
- No floating overlay window. Would contradict EloPhanto's TUI-first positioning.
Tests
32 tests covering state priority chain, rendering invariants (frame-width consistency, color contract, transition anticipation), and panel-side event scanning. All green; ruff + mypy clean.
Updating
./update.shThe migrator does not need to touch your config.yaml for the mascot — it's enabled by default and reads dashboard.mascot_enabled if you've explicitly added the key. Set to false to opt out.
Commits
61b38eaDashboard mascot: 7-state ASCII face in sidebar with animationf5760f7Mascot: richer per-state animation (Z drift, glances, thought dots, wink, eye-darts)7968e53Release v2026.05.22
Full diff: v2026.05.20.2...v2026.05.22