A refusal is an event

When somebody is turned down in public it costs them standing for every witness, warm people move toward them and cold people away, the room can see it on them for two beats, and the ticker names the rule that said no.

AWKWARD_BEATS
2, which is how long it shows
Cost
standing, per witness
Undercut on the awkward
half again as effective

The easy implementation of a failed ask is nothing: the action does not fire, the beat passes. That is a bug in disguise. In a room, being turned down in front of people is one of the loudest things that can happen to you.

What embarrass() does

  • Standing is lost per witness. The same refusal in an empty corner barely registers.
  • Warm bystanders move toward you and cold ones move away. A refusal sorts the room.
  • For AWKWARD_BEATS (2) the room can see it on you, and isAwkward is readable by the rules.
  • Somebody standing in a fresh no is half again as easy to knife, and everybody warm in earshot notices that you took the easy target.

Say which rule said no

whyRefused() prints the actual reason on the ticker: Bel has barely said two words to Mara all night. The specific rule, not a generic failure.

Every one of those lines is a rule you can watch working, which is how a watcher learns that cold asks fail without anybody explaining it. Explainability here is the content, not a debugging feature bolted on.

The general version

Give every failure a social consequence and a stated cause. A simulation where nothing happens on failure teaches its watchers nothing and gives its characters no reason to be careful.

Read next

More on the mechanics