Codewhale visual + interaction contract

A normal coding workbench.
One unmistakable whale.

Conversation stays primary. A pod, receipts, context, and settings are there when the work needs them. The surface inherits the terminal that brought it; Deepsea is an explicit atmosphere, not a default wallpaper.

Build target
Ratatui shell + CWC parity
Deepsea is opt-in.

screen
skin
view
Click any bordered surface to inspect its owner, typed state, action, and hitbox contract.
host terminal simulation · background is reset in Ratatui wide 140 × 40
USER
Make release 0.9.12 ready.
CODEWHALE
I’ll prepare release 0.9.12. Spawning a pod to run checks in parallel.
Plan: fix CI, audit contributor ancestry, draft release notes.

Caution: PR #1427 is marked do-not-merge and is in the integration ancestry.

POD LEDGER launch pod3/3 active
whaleassignmentstateelapsedreceiptslast update
▸ Scoutaudit contributor PRs● working3m 02s214:44:05
  Builderrepair CI○ waiting2m 51s114:43:54
  Verifierexact-head checks✓ done3m 18s314:44:05
›
↵ send   ⇧↵ new line   esc interrupt

What are we working on?

Folder and tool access are asked when needed.

Quick actions · tab actions · enter choose · esc back
›
↵ send   ⇧↵ new line
Appearance

Match Terminal is the default. Dark and Light keep a reset background; Deepsea is the only theme that paints water.

Notifications

History is inspectable. Banner, sound, and in-app delivery are separate choices.

What makes it Codewhale

It should feel as legible as Codex, Claude Code, or a sober native workbench before it feels branded. The terminal uses timing, language, a small current of cyan, and a restrained wordmark; surfaces that can render the canonical raster use that exact asset.

Host first

Match Terminal, Dark, and Light use Color::Reset for the background. Their foreground palette adapts; the user’s terminal remains the surface.

Conversation first

The transcript is the default lens. The rail and ledger can fold; receipts are quiet until a person asks for evidence.

One fact, one owner

Context lives in the header. Work lives in the top/rail. Receipts remain at their event. Route, cost, and phase live in the footer.

Deepsea is consent

Only Deepsea paints a deep blue field and underwater points. It stays still when low motion is selected, and it never becomes default wallpaper.

Glow means live

Cyan/gold bloom is a bounded working or completion transition. Settled output is still; color never invents a state without typed evidence.

Everything navigates

Any selectable row has visible focus, a recorded hitbox, keyboard and mouse parity, and an inspect action. No decorative glyph asks to be clicked.

Small whale grammar

The canonical raster mark has no approved terminal-glyph substitute. These glyphs are working notation rather than brand assets, and all retain an ASCII fallback.

⌁
Pod formation

Parallel work beginning. Never a generic button icon.

◌
Wake / live work

Active receipt or a running worker. Static in low-motion and ANSI.

◆
Spout / attention

A real user decision is needed. Gold and words; not an error.

✓ ! ×
Outcome

Passed, caution, failure. Failure red stays reserved for actual failure.

Brand asset rule: the graphic app consumes approved source assets through the brand manifest. Ratatui consumes a tested cell projection from the same manifest. This HTML intentionally does not invent an SVG substitute.

Ratatui wiring manifest

This maps the visual system to the current implementation owners and marks the necessary new projection types. It is deliberately a concrete migration path, not a second runtime or a new turn loop.

surface / factownertyped state / contractstatus
Header, context %, phase, route/cost footercrates/tui/src/tui/underwater.rsShellPhase, ContextBudgetSnapshot, OceanTreatment; use palette::grammar::ChromeInkexisting owner; compose new layout
Foldable work rail, runs, workerstui/sidebar.rs + tui/work_surface/SidebarAgentRow, SidebarSubagentSummary, WorkSurfaceStateexisting owner; promote pod hierarchy
Transcript, receipts, composertui/ui.rs + tui/app/composer.rsUiSnapshot (proposed projection), existing transcript records and composer stateadd projection only; preserve engine
Pod command + legacy fleet migrationtui/views/fleet_setup.rs + protocol/subagent ownersexternal /pod; /fleet alias; internal FleetRole migrates behind compatibility boundaryone-way product migration
Settings truth and live previewtui/views/mod.rs::ConfigView + tui/theme_picker.rsSettingFact proposed: current, effective, startup, saved, authority, apply semantics, editor, availabilityreplace ambiguous Saved/Session claims
Notifications + settingstui/notifications.rs, notification_payload.rs, sound_policy.rsNotificationRecord + DeliveryPlan proposed; existing NotificationPayload/NotificationKind retainedin-app, banner, sound independent
Click / keyboard / inspecttui/mouse_ui.rs + each viewInteractionTarget proposed registry; every selectable target records Rect, focus, action, inspect detailno visual-only controls
Theme + motiontui/theme_picker.rs, tui/ocean.rs, tui/motion/ThemeId, OceanTreatment, MotionPolicy::from_settings(low_motion, fancy_animations,…)add Deepsea treatment; retain presets
Brand marktui/glyphs.rs + tui/underwater.rsBrandMark/CellProjection proposed; approval-gated source asset manifest; ASCII projectionasset approval before full fan-out
Turn lifecyclecore/engine/turn_loop.rsEngine::run_turn remains the sole turn loop; no new loopguarded; do not change
Promptcrates/tui/src/prompts/text.rsBASE_PROMPT untouchedout of scope
CWC parity: the web app shares the information architecture, terms, state grammar, typed notification facts, provider truth, and current-mark asset manifest. It does not imitate a terminal. Web controls render as normal app controls; the TUI renders the same contracts as cells.

Visual acceptance before “matches”

Use this as the release checklist. Passing a unit test alone is not visual evidence.