Impossible Intents

Designing a "no" that happens in front of everyone

Company

Hidden Door

Role

Product design, UI, prototyping

Timeline

2023

Team

Only product designer

Collaborators

Game design, art direction, founders

Status

Shipped

Overview

When a player asked for the impossible, the story just ignored them

Hidden Door is a shared, AI-driven storytelling game, played live or asynchronously. Any player can type any action, including ones the world can't allow. When someone entered an impossible intent, like "I destroy the universe", the story engine didn't refuse. It ignored the input and generated something anyway, pulling everyone into a turn nobody chose.

“I tried to kick down the door but… the game just ignored it and now I'm talking to a munchkin instead?”

The player looked confused, tried the action again and got nowhere.

Playtesting kept surfacing it. Players expected the game to acknowledge what they said, or at least answer it. When the story moved on with something they hadn't chosen or done, it broke the promise the whole game rests on: player agency.

The initial version of the story log: the intent Marie destroys the universe sits between story blocks while the narrator carries on about a squirrel's tail. A note reads: the impossible request wasn't the failure; the failure was the system improvising over the player's intent instead of honestly saying no

My role

I designed how an AI game says no

As the only product designer at Hidden Door, I created the UI and flows and prototyped the interactions in Figma. Our game designer set the strategy, and our art director made the art assets I designed with. Most often, my job was working out how complex, novel game mechanics shaped by AI should look and behave. This was one of those mechanics.

The question wasn't whether to block the action. It was how an AI system refuses an action while keeping people's trust and immersion intact.

Process

A refusal in a multiplayer game is social, not just functional

Being told no in front of other players is a different experience from being told privately. The strongest version protects the player's standing with the group, not only the integrity of the story.

I explored three directions across two axes: how gracefully the refusal reads, and how feasible it is to build.

Exploration

Three ways to say no

The player's intent, Marie destroys the universe, struck through with a small info icon

Lightweight block

Most feasible

The struck-through intent with an info icon. It meets the safety need, but it hides the why and reads colder.

The struck-through intent above a pink narrator callout: Yeah so you're not actually strong enough to destroy the universe. I honestly don't know why you'd want to do that anyway?

In-character refusal

My recommendation

The narrator denies the action in voice, strikes the impossible intent and redirects with humor, keeping the moment inside the story instead of breaking it.

A private message from the narrator, with its avatar: Psssst. It's me. You can't actually destroy the universe. Why don't you try doing something else?

Private "why"

Future state

The narrator delivers the reason as a private message, so a player learns the limit without being corrected in front of the group.

The Hidden Door story screen: the party illustrated on the left, and on the right the story log, where Marie's struck-through intent to destroy the universe is answered by the narrator in a pink callout

The in-character refusal in the full story screen

Outcome

The lightest version shipped, and the richer ones became the path forward

I presented the range and the trade-offs to the founders. We shipped the lightweight block, and I documented the in-character and private-message versions as the path forward.

In the next round of playtests, the moment stopped tripping people up. Players didn't need to see their impossible action play out. They needed to see that the game had heard it and struck it from the record.

Reflection

What I learned

Sometimes the best feedback is silence

The struck-through intent didn't earn praise in playtesting. It just stopped disrupting anyone, and that's how I knew it worked: a fix for frustration succeeds when people stop running into the problem.

Fixing the loudest problem lets you hear the next one

I'd have loved to take this further. But once players stopped getting stuck here, the next round of playtests could surface the bigger questions: how to make the game board compelling, how multiplayer actions should work, and how players can truly collaborate in a game that might be asynchronous.

Next case study

CanWe