🚧 Under construction — I'm migrating this site from Framer to Next.js and publishing it early for testing, so a lot of the content is still in flux.🚧 Under construction — I'm migrating this site from Framer to Next.js and publishing it early for testing, so a lot of the content is still in flux.🚧 Under construction — I'm migrating this site from Framer to Next.js and publishing it early for testing, so a lot of the content is still in flux.🚧 Under construction — I'm migrating this site from Framer to Next.js and publishing it early for testing, so a lot of the content is still in flux.🚧 Under construction — I'm migrating this site from Framer to Next.js and publishing it early for testing, so a lot of the content is still in flux.🚧 Under construction — I'm migrating this site from Framer to Next.js and publishing it early for testing, so a lot of the content is still in flux.
Open menu
Switch to Darkhello@product.inc
AIUX patterns

Design the failure state first

Tags: errors, empty states, trust

In a product built on a model, the interface is decided by what happens when the answer is wrong — not by what happens when it's right. So draw that screen first. The same input can produce a different output tomorrow, so there is no single correct screen to design: there is a distribution, and the job is to make the whole distribution survivable.

Design the happy path first and bolt error handling on afterwards, and you get a product that is confident exactly when it shouldn't be.

Wrong is not one thing

"The model failed" collapses at least five different situations that need different interfaces. Treating them as one error state is why so many AI features have a single grey box.

FailureWhat the user actually getsThe design that holds
Confidently wrongA plausible, well-formed, incorrect answerMake checking cheaper than trusting — citations that resolve, the source passage inline
Nothing to sayAn empty or refused resultAn empty state that says why and offers the next move, not a shrug
SlowA long wait with no signalStream partial output; always offer cancel
Did more than askedAn unrequested change to their workUndo, not a confirmation dialog
Saw what it shouldn'tSensitive data sent to a modelPrevent at the input, never at the output

The last row is the one people get wrong most often, and it is where this stops being a slogan.

The decision

Two questions, in order. The first sorts recoverable failures from the one kind that isn't. The second stops the cure being worse than the disease.

Rendering diagram…

The failure you cannot undo

Most failure states are recoverable. A wrong answer can be corrected, a slow one waited out, an unasked change reversed. Data leaving the machine is not in that category — once a confidential document has been sent to a third-party model, no interface fixes it afterwards.

That is why the fifth row says prevent at the input. For an unrecoverable failure the design work happens before the model is reached, not in the presentation of what it returned.

Grounded in

DocRobot, an enterprise AI workspace for teams working with confidential documents. The blocker to adoption was never accuracy or speed — legal and security would not permit the documents anywhere near a hosted model. The failure state the model sees something it must not had to be impossible rather than merely handled.

So redaction became the first step in the flow rather than a setting somewhere in preferences. In the first working version that was manual search-and-replace, which is slow and unglamorous, and it was still the thing that let a security review pass. Designing that failure first produced a different product, not a safer version of the same one: from the happy path — upload, ask, get an answer — redaction would have arrived late as a settings toggle, and the review would have killed it.

How you know it worked

Failure design is the part most likely to be quietly wrong, because nobody demos it. Two habits keep it honest.

Anti-patterns

The test

Does the failure design cost anything when the model is right? Undo is nearly free. Confirmation is a tax on the common case. Design the failure state first — then make sure it disappears when nothing has failed.

The full argument: Design the failure state first.