Design: The TUI
Contextโ
The client surface of Harness: a keyboard-driven ops cockpit for autonomous
agents with scary permissions โ it must feel trustworthy and clear about
state. Governing spec: SPEC-0001. Related ADRs: ๐ ADR-0001 (Charm stack),
๐ ADR-0002 (thin client), ๐ ADR-0003 (embedded x/vt terminal pane), ๐ ADR-0006
(profiles), ๐ ADR-0007 (scrollback). The full visual exploration (screenshots,
design system, themes) lives in docs/design/ โ open
docs/design/Harness.dc.html in a browser.
Goals / Non-Goalsโ
Goalsโ
- A glance answers "which of my agents are healthy, which need me."
- The hop between harnesses is instant and physical โ the signature moment.
k9s/lazygitrestraint with Charm's warmth; dense but legible.
Non-Goalsโ
- Tiled multi-pane in v1 (single-attach + fast hop).
- Mouse-first interaction.
- Web/HTML surfaces โ this design language is the terminal dialect only.
Decisionsโ
Split cockpit as the canonical dashboard layoutโ
Choice: Left: Bubbles list of harnesses. Right: live read-only peek pane
- config summary for the selection. Header: app ยท profile ยท daemon identity.
Footer: key bar.
Rationale: "Glance before you hop" โ the peek pane lets you confirm state
without committing attention (see
docs/design/screenshots/day.png).
Attach chrome: thin ribbon, bleed to edgeโ
Choice: In attached mode the terminal takes the full body; only a thin status ribbon (harness, state, detach hint) frames it. Rationale: You're driving a live agent โ chrome competes with the PTY. The ribbon exists so you never forget which agent you're inside.
Motion via spring physicsโ
Choice: The hop animates with harmonica springs (slide + ribbon flash),
respecting reduced-motion sensibilities and degrading to instant swap.
Rationale: Linear easing feels mechanical; the hop should feel physical
because it is the product's whole promise.
Architectureโ
Visual directionโ
From the Claude Design exploration (docs/design/):
- Palette: ANSI neon on blue-black void โ Charm purple
#7D56F4, hot pink#FF5FA2, cyan#4EE6FF, mint#00F0A8; amber/coral for degraded/failed. Day theme: lavender-paper with the same hues deepened. Both themes degrade viacolorprofile(256/16/mono), and color never carries meaning without its glyph. - State rows: degraded rows expand in place (last exit + backoff
countdown); "needs you" harnesses escalate visually (see
docs/design/screenshots/01-g_and_c.pngfleet view). - Type discipline: one glyph size; hierarchy from weight and color;
box-drawing borders (
โญ โฎ โฐ โฏ) as the Lip Gloss signature. - Deliverables pending from design: final palette tokens for Lip Gloss
adaptive colors, degraded/flapping row treatment,
vhsdemo tape of the hop,freezestills for docs.
Key filesโ
Greenfield. Expected home: a tui package (Bubble Tea model per mode,
overlays as nested models), a theme package (Lip Gloss adaptive styles +
colorprofile degradation), and the client half of the protocol package
(SPEC-0002).
Related Artifactsโ
Direct relationships declared in YAML frontmatter (per ADR-0023 / SPEC-0018). Run /sdd:graph chain SPEC-0001 for the transitive view.