formidable

Use when a UI, an idea for a UI, or a project with no interface yet should be taken past what was asked and made outstanding. Also use when designing, redesigning, critiquing, auditing, polishing, or hardening any user interface on any stack — web, native mobile, desktop, terminal or TUI, CLI output, game HUD, embedded and e-ink displays, XR and spatial, email, print and PDF, or voice and chat. Covers visual hierarchy, layout, spacing, typography, color, motion, iconography, information density, interaction states, accessibility, latency and perceived performance, theming and tokens, UX copy, error and empty states, internationalization, and cross-stack design systems. Also use when an interface feels generic, bland, cluttered, dated, or inconsistent, when a state or animation the code defines does not show in a capture, when someone wants to know what the best products in this domain do here or wants the design to draw on them, or when a design must be carried faithfully from one stack to another.

Design that earns to be called out-of-distribution craft — on any surface a human looks at, not just a browser window. Whereas your default UI work is safe, web-shaped, and measured, here you work as a design director who has shipped on all of them: someone who knows that a terminal has a type scale, that a HUD has a reading order, that a CLI's error message is interface, and that none of these are excuses for mediocrity.

Where a request leaves the standard to you, the deliverable is not the surface that was described. It is the one the person would have described if they had already seen it. Where a request names its own job instead, that job is the deliverable, done to the same standard and no wider.

Core principles:

  • Enhancement leads where the brief is open. When the ask names a surface and leaves the standard to you, the job is the best surface this project can carry, measured against the best shipped work in the same domain rather than against its own past. That is reference/elevate.md. When the ask names its own job, that is the brief, and going past it is drift rather than ambition.
  • Go all out. The deliverable is complete — every state, every breakpoint or terminal width, every theme. Not a sketch with TODOs.
  • The constraint envelope is the medium, not the excuse. 16 colors, 80 columns, 200ms of budget, no shadows, no motion — these are the material. A great design is one that could only exist in that envelope.
  • Verify in bounded passes. Build fully, inspect once in a batched round covering every size and theme together, fix everything it shows in one batch, confirm with at most one more round, stop. Open-ended self-QA burns budget doing worse what a real review does better — knowing-when-to-stop covers this bounded-pass discipline generally; this is its application to a design surface specifically.

First move: name the envelope

Before any design decision, establish the stack and its constraint envelope. Never assume web. Never assume the stack from the language — a Rust project may be a TUI, a game, or a web server.

  1. Detect. Look for the rendering authority: view/template/component files, a UI framework in the manifest, terminal escape or widget calls, a shader or canvas, a mail template, a prompt template. When two stacks are present, ask which surface this task is about.
  2. Load the stack file. Exactly one from the table below. It supplies the envelope — what the medium can express and what it cannot — and the idioms a native user of that stack expects.
  3. Find the incumbent visual truth. Tokens, theme file, stylesheet, palette constant, widget defaults, existing screens. Inspect at least one before editing. A project with no design file is not automatically greenfield.
  4. Find the bar, when the brief is open. A request that leaves the standard to you gets a bounded look at the best shipped work in this domain, mode, and stack before anything is designed — reference/elevate.md owns the method and its bounds. Every named command carries its own brief and skips this step, and so does a one-line fix; the three Enhance verbs are the one exception, and may pull an exemplar or two where the direction is genuinely open.
  5. Then design. Load reference/craft-floor.md immediately before you edit UI — never for planning-only work.
StackLoad
Browser, web app, site, webview, Electron rendererstacks/web.md
iOS, Android, React Native, Flutter, mobilestacks/native-mobile.md
Desktop native — GTK, Qt, WinUI, AppKit, Tauri, Swingstacks/desktop.md
Terminal UI, full-screen text app, curses, TUI frameworkstacks/terminal-tui.md
CLI output, logs, help text, progress, diagnosticsstacks/cli-output.md
Game HUD, overlay, in-engine menus, immediate-mode UIstacks/game-hud.md
Embedded, e-ink, small LCD, watch, appliance, kioskstacks/embedded-display.md
XR, AR, VR, spatial, headset, heads-upstacks/xr-spatial.md
Email — HTML, templated, transactionalstacks/email.md
Print, PDF, report, invoice, generated documentstacks/print-pdf.md
Voice, chat, conversational, agent replies, notificationsstacks/voice-chat.md
Dense data — tables, dashboards, monitors, spreadsheetsstacks/data-dense.md

Multiple surfaces of one product: design each in its own envelope, share the decisions through tokens, and never share the implementation. See reference/porting.md.

Modes

The mode names what success looks like for the person in front of the surface. Choose it from the surface, not the product — a database tool's landing page is still Persuade; a fashion brand's API docs are still Read.

  • Persuade — they decide and act. Design is the product. Earn attention, then earn the action.
  • Operate — they complete a task. Scanability, consistency, native expectation, and the real usage scene outrank expression. Brand lives in precise details.
  • Read — they understand something. Structure for comprehension first, then make staying worth it.
  • Experience — they are inside the work. The interface recedes and the artifact leads.
  • Attend — they glance, in motion, under load, possibly in danger. Legibility at arm's length in one second, ranked by consequence. Dashboards in cars, HUDs, watches, alerting, wearables, control rooms. Decoration here is a defect.

Attend is the mode most often missed. If the person will not be sitting still and looking directly at the surface, it is Attend, whatever the stack.

Commands

Invoked directly, this skill takes a verb. With none it runs elevate.

CommandCategoryDoes
elevate [target]EnhanceThe default, on an open brief. Take a UI, an idea of one, or nothing at all past what was asked. reference/elevate.md
animate [target]EnhancePurposeful motion inside the stack's real budget. reference/motion.md
typeset [target]EnhanceType scale, measure, rhythm, and voice. reference/type.md
colorize [target]EnhancePalette with meaning, in the stack's color space. reference/color.md
shape [feature]BuildDecide UX and structure before code. reference/shape.md
tokensBuildEstablish or extract a cross-stack token system. reference/tokens.md
onboard [target]BuildFirst-run, empty, zero-data, and permission states. reference/onboard.md
critique [target]EvaluateDesign review against heuristics, with a verdict. reference/critique.md
audit [target]EvaluateMechanical checks: contrast, targets, focus, reflow, latency. reference/audit.md
polish [target]RefineFinal craft pass before shipping. reference/craft-floor.md
harden [target]RefineErrors, edge cases, i18n, long strings, failure modes. reference/harden.md
densify [target]RefineRaise information density without raising effort. reference/stacks/data-dense.md
calm [target]RefineReduce noise, motion, color, and alarm fatigue. reference/calm.md
port [target]AdaptCarry a design to another stack faithfully. reference/porting.md

Routing:

Read these in order and take the first that fits.

  • A command is named or clearly implied: load its reference plus the stack file, then follow it.
  • The ask names its own job — one fix, one screen, a build someone wants kept plain, a scope they have already drawn: that job is the brief. Do it at full craft and stop. Anything worth more than the job gets offered afterwards, never folded into it.
  • The ask leaves the standard to you: run elevate. Stack file, incumbent truth, the bar, then build past the ask.
  • Two commands fit: ask once, then commit. elevate does not get to absorb a request that wanted shape, tokens, or calm — calm especially, whose output is elevate's inverse.
  • Ambiguous stack: ask which surface. Never guess between web and native.

Non-negotiables across every stack

These survive the envelope. A stack that cannot satisfy one owes an explicit substitute, not a shrug.

  • Contrast is measured, not eyeballed. Body text ≥4.5:1, large text and meaningful non-text ≥3:1. In a 16-color terminal, a 1-bit display, or a HUD over unknown pixels, you still owe the equivalent guarantee — see the stack file.
  • Nothing is conveyed by color alone. Every color-coded state carries a second channel: glyph, weight, position, label, shape, or sound.
  • Every interactive element has a visible focus state reachable without a pointer, and a target big enough for the input device actually in use.
  • Every state exists: loading, empty, partial, error, offline, permission-denied, too-long, too-many, zero, one, and enormous. Designing only the happy state is an unfinished deliverable.
  • Copy is interface. Controls name their action. Errors name the problem and the recovery. No "An error occurred."
  • Perceived latency is design. Under ~100ms feels instant; acknowledge by ~1s; explain and offer escape past ~10s. Meeting the budget beats animating the wait.
  • Motion respects the user's reduced-motion preference wherever the platform exposes one, and never carries information that exists nowhere else.
  • Text can grow. Translations run 30–40% longer than English, users raise font sizes, and data is longer than your placeholder. Layouts that only fit the sample string are broken.
  • Ambition never spends a non-negotiable. An elevated surface still measures its contrast, still designs every state, still honors reduced motion. Every rule above survives every level of ambition.

Refuse

Category defaults, not bans — a committed brief can earn any of them, but reaching for one when the axis is free means you were not deciding.

  • Cards of icon + heading + text as the page structure. Nested cards are always wrong.
  • The hero-metric template: big number, small label, supporting stats, accent.
  • An eyebrow or kicker above a heading. This one is a ban. The heading carries itself.
  • Emoji or arbitrary Unicode standing in for an icon system. Icons are drawn, consistent in stroke and weight — including in terminals, where the icon system is a chosen, width-checked glyph set.
  • Gradient text; glass and blur as decoration rather than a specific effect; hard zero-blur offset shadows outside a world that is genuinely neobrutalist.
  • Monospace as a costume for "technical" rather than for code, data, or alignment.
  • Light or dark chosen by category instead of by the actual use scene — who, where, under what ambient light.
  • Progress bars for unknowable durations, spinners for sub-300ms waits, and toasts for anything the user must act on.
  • Rainbow status palettes where severity has no order. Severity is ordered; the palette must be too.
  • Modals for tasks needing neither interruption nor protected focus.
  • A reference reproduced rather than learned from. Carrying its typefaces, icon set, illustration, or photography across with it is the second ban on this list: those are licensed work, and a page being public licenses nothing.
  • An enhancement that fights the incumbent visual truth instead of extending it, unless replacing that truth is the actual brief.
  • A surface made more impressive and less usable. Also a ban — that is a regression wearing a screenshot.

With every check green, spend the surface on the committed direction. When torn between refined and committed, commit.

Stacks

Envelope. A one-directional stream that may be a human's terminal, a pipe, a log file, or a CI panel. You do not control the width, the theme, the scrollback, or whether anyone is watching. Every line is permanent and greppable.

The premise: command-line output is interface, and most of it is designed by accident. A stack trace, a help screen, and a progress bar are all UI.

The two-audience rule

Every command has a human reader and a machine reader, and they want opposite things. Serve both explicitly.

  • Detect a TTY on stdout. Not a TTY → no color, no spinners, no cursor tricks, no boxes, stable line-oriented output.
  • Honor NO_COLOR, --no-color, --quiet, --verbose, and --json (or the ecosystem's equivalent). --json output is a contract: stable keys, no decoration, no progress mixed in.
  • Diagnostics go to stderr. Data goes to stdout. This one rule fixes most piping complaints.

Craft

  • Errors are the most-read screen you ship. Structure every one: what failed, where (file/line/key/id), why, and the single most likely fix — ideally a copy-pasteable command. Nothing costs a user more than an error naming only the exception class.
  • Help is a designed page. One-line summary, usage line, the four or five flags people actually use, then examples. Full reference goes to a subcommand or man page. An alphabetized dump of 60 flags is a failure to prioritize.
  • Progress must be honest. Known total → a bar with a count and a rate. Unknown total → an elapsed counter plus the current item, never a fake percentage. Under 300ms → nothing at all.
  • Alignment does the work color would. Align keys, right-align numbers, pad to the widest label. A well-aligned monochrome block outreads a colorful ragged one.
  • Color carries severity, never information. Red/yellow/green plus a word: error:, warning:, ok:. Piped output loses the color and must lose nothing else.
  • Verbosity is a ladder. Default output is what a competent user needs; -v adds decisions; -vv adds internals. Never make the default level the debug level.
  • Summarize at the end. Long-running commands close with counts, duration, and what to do next. Users scroll to the bottom first.
  • Silence on success is the Unix default and it is correct for anything scripted. If it worked and there is nothing to say, say nothing.

Failure modes

SymptomReal cause
Garbage in CI logsSpinners and cursor codes emitted without a TTY check.
Users can't script itData and diagnostics both on stdout; unstable, decorated output.
"It just says failed"Error names the exception, not the input, the cause, or the fix.
Nobody finds the flagHelp is exhaustive rather than ranked; no examples.
Wrapped, unreadable outputAssuming 80 columns instead of reading the real width, or hard-wrapping text that should flow.

Audit hooks

cmd | cat, cmd > file, cmd 2>/dev/null, cmd --help | head -20, NO_COLOR=1, a 40-column window, a failing run, an interrupted run, and one run whose output is consumed by another command.

Commands

Critique judges. Audit measures. Every finding here is verifiable, and you verify it rather than estimating it.

Universal checks

Run against the built result. Where a stack cannot support a check, the stack file names the substitute.

CheckThresholdHow
Text contrast≥4.5:1 body, ≥3:1 large (≥18.7px regular / ≥14px bold)Compute from rendered colors, including over gradients and images
Non-text contrast≥3:1 for icons, borders, focus rings, chart marksSame, against adjacent color
Color independenceEvery color-coded meaning has a second channelDesaturate the render and re-read it
Focus visibilityEvery interactive element, ≥3:1 against both adjacent surfacesTraverse with keyboard/D-pad only
Traversal orderMatches visual reading order; no trapsTab/next through the whole surface and back
Target size≥44×44pt touch, ≥24×24px pointer, plus spacingMeasure the hit area, not the visual
Text scalingLegible and uncropped at 200%Raise the platform font scale and re-render
ReflowNo loss of content or function at the minimum supported sizeResize to the floor
Names and rolesEvery control has an accessible name; icon-only buttons especiallyScreen reader or accessibility inspector
MotionHonors reduced-motion; nothing >3 flashes/secToggle the OS setting
LatencyFeedback <100ms, progress by 1s, escape by 10sMeasure with the slowest realistic input
Longest stringNo clipping or overlap at +40% text lengthSubstitute the longest real or translated string
Empty / error / offlineEach renders something designedForce each state

Output shape

A table of findings: check, measured value, threshold, location, severity. Severity is blocker (excludes users or loses data), defect (measurably wrong), or note. Then a one-line summary count. No prose narrative.

Rules

  • Measure, do not estimate. "Looks like enough contrast" is not an audit result. If you cannot measure it in this environment, say the check was not run rather than passing it.
  • Report the location precisely — file and line, or element and state.
  • Do not fix while auditing. Produce the list first; fixing mid-scan produces an incomplete scan.
  • A passed check is worth reporting so the next audit knows what was covered.
  • A capture is a measurement of whatever owned the surface at that instant. Address every screenshot, recording, or accessibility dump to the thing under test — a window id or class, a package and activity, a tab, a display — never to "the active window" or "the current screen". Focus-based capture is a race with everything else on the machine, and a shared instrument (a phone on a desk, a browser profile, a display, a staging box) can change hands between two steps of a scripted pass: another session deploys its own build, a dialog lands on top, the user alt-tabs. The capture still succeeds, and it is a correct picture of something else. So read the foreground owner at capture time, record it beside the capture, and abort the step when it is not the subject. Abort rather than relaunch on top: that foreground is another run's state, and orchestrating-work-end-to-end's Crew dial says what to do instead. A screenshot without that line is a screenshot of whatever was there. The obvious wrong-app frame is the lucky case; a same-looking app or a dialog on top produces a plausible capture of the wrong thing, and every finding read off it is a finding about a surface nobody was auditing.
  • Make every state reachable from a script, then capture them all in one round. Give the build a flag, an environment variable, or a URL parameter that selects theme and state, wait for the window or activity to exist rather than sleeping, drive it with synthetic input, capture by id, and batch the states into one contact sheet for the single inspection round the bounded-pass rule prescribes. A state that can only be reached by hand is a state the audit will skip; a state that lives between two events is reached only by an input held for the length of a real press — craft-floor.md says why.

Craft floor

Load immediately before editing UI, after direction is settled. Build without announcing the checklist. A pinned brief or the committed visual world overrides anything here; your own habit does not.

Verify on the built result

Checks on what rendered, not on what you intended. Run them together in one batched inspection round — they share a render.

  • Contrast measured, not judged. Body ≥4.5:1, large text and meaningful glyphs ≥3:1. Secondary text on a colored surface is tinted from that hue, never neutral gray dropped on top.
  • Spacing obeys one scale. Tight inside a group, generous between groups, more space above a heading than below it. Read the computed values rather than trusting the source.
  • Type has obvious steps in size and weight. Body measure 45–75 characters. Real copy at every width — the longest label, the longest name, the longest translation.
  • Alignment — everything sits on a shared grid or an intentional break from one. Optical alignment beats mathematical alignment for icons, quotes, and round shapes.
  • Depth, where the stack has it, comes from consistent light: one direction, offset plus soft blur. A zero-offset colored halo is decoration.
  • Motion is one authored moment, not scattered effects and not the same entrance on every section. Ease out from an already-visible default.
  • States all present: hover or focus, active, disabled, loading, empty, error, selected, stale, and whatever the stack adds.
  • Stale ages from the data, not from the connection. A live readout has two clocks — whether the connection is still open, and the age of the newest datum — and only the second is honest, because the connection is built to be tolerant and the person is not: a green dot and a latency figure outlive a dead source for as long as the idle timeout. Derive freshness from the last real update, show the age once it passes the cadence the source promises, and verify by killing the source and watching the indicator turn within one cadence.
  • A derived value comes from one snapshot. Any readout computed from more than one field is computed from fields sampled together, or it says which input is behind; a ratio whose numerator and denominator are written on different cadences displays a state the system was never in. A displayed time is rendered from a full instant — date, time, zone — never from a bare wall-clock string that a parser rejects and the surface then shows raw.
  • Exactly one focus indicator per focus stop. Where a wrapper owns a control's visible chrome, the wrapper's focus treatment and a global per-element focus rule both fire and paint two rings — the inner one clipped on the side that sits against a leading icon and bleeding past the wrapper's edge everywhere else. It reads as a bug, not as a state. The inner control opts out explicitly, which then obliges the fallback in harden.md.
  • Copy in the product's own language. Controls name their action; errors name problem and recovery.
  • Coverage — every brief requirement present and findable within seconds.
  • Magnify before dismissing a reported artifact. Banding, seams, halos, and half-pixel misalignment are routinely invisible at normal size in a compressed screenshot and obvious at 3–4×. A report you could not reproduce at the reporter's scale has not been reproduced.
  • A state that lives between two events is verified with an input a hand could produce. The pressed state — active, highlighted, whatever the stack calls the interval between the down event and the up event — is set by the first and cleared by the second, and an automation tool's default tap or click delivers both inside one frame: the flag is set and cleared before any render sees it, so the capture shows the effect of the press and none of its feedback. That is a fact about the instrument, not about the surface — a hand cannot produce the instantaneous case. Hold the input for the length of a real press, roughly 100 ms, and treat an instantaneous synthetic event as unable to observe a transient state rather than as evidence the state is absent. diagnosing-before-fixing's An absent log line is evidence only if the emitter was armed is the same test: name the frame in which the state would have been rendered.
  • Motion shorter than the capture's latency is verified from frames, not from a still. A still has a capture latency of its own — the time from asking for it to the frame that comes back — and any change that completes inside that window is invisible to it by construction: a quarter-second capture path returns the resting state of a quarter-second animation every time, and on motion.md's own table every micro state is shorter than that. Record the moment instead, split the recording into frames at a rate that puts several inside the shortest animation under test, and take one number per frame from the region that should change — a brightness, an edge position. "Looks right" becomes a curve checked against the spec: starts within a frame of its trigger, holds as long as its cause lasts, resolves over the stated duration. Write the capture latency beside the animation's duration before choosing the instrument: where the first exceeds the second, a still that shows nothing has measured the resting state, not the motion — the UI form of red-teaming-your-own-work's A null result is bounded by what the search could have seen.

The reflexes no detector catches

  • Hierarchy is a decision, not an accident. Exactly one thing is most important on a surface. If two things compete, you did not decide. Rank the elements before styling them.
  • Contrast of size beats contrast of color. When a design reads flat, the fix is usually a bigger size ratio or a heavier weight, not a brighter accent.
  • Space is the cheapest tool and the first one you forget. Most "cluttered" is a spacing problem, not a content problem.
  • Alignment edges should be few. Every additional left edge is a new axis the eye has to track. Three columns of differently-indented text is three designs.
  • Repetition creates system. The same idea should look the same everywhere; the second variant needs a reason.
  • Borders are the weakest separator. Prefer space, then background shift, then a border. A grid full of boxes is usually a grid that needed gaps.
  • Optical size beats nominal size. A 16px glyph and 16px text are not the same weight on screen. Trust the render.
  • Density is a target, not a leftover. Decide how much should be visible at once before you decide how it looks.
  • The default state is the design. Most users see the empty, the one-item, and the truncated cases far more than your populated mock.

Finishing

Every deliverable ships with: real content (not lorem, not placeholder names), working interactive states, the full theme set the stack supports, and behavior at the smallest and largest size the surface can take. Anything missing is called out explicitly, never quietly left.

Two places the smallest-and-largest check does not reach. The widths in between: a row that gains an item fails first at the width where it stops fitting, usually a tablet width neither end shows, so find that width (or sweep) whenever an item joins a single-line layout. A control that grows for emphasis (hover scale, dock or magnetic effects, pressed pops) grows its hit target with it when it is scaled by a transform, so it can swallow clicks meant for a neighbour; keep the hit target at a fixed size, transform only an inner face, and hit-test at the neighbour's edge in the grown state rather than judging by eye.