coerce(): when the code overrules the model

coerce() is the last word on every decision. It drops forbidden actions, enforces gates and confidence floors, refuses moves the character cannot afford, and puts every override on screen in amber.

The model answers; coerce() decides whether that answer survives contact with the rules. It sits between the call and the effect, and everything it changes is recorded instead of swallowed.

What it checks

  • Forbidden actions. A class rig may simply not have a move: Bo cannot expose, and Quill cannot whip, leak or undercut.
  • Gates. A move may be locked until a beat (Nyx before 12) or by state.
  • Confidence floors. Below a character's floor, their own read does not count and they fall back.
  • Empty tanks. You cannot spend energy you do not have, and a rig may have made the move cost more than it looks.
  • Targets. The target must still be reachable and still in play by the time the answer lands.

Overrides are the show, not the plumbing

"The code overruled the model" is the most interesting event on the screen, so the guest's board prints it in amber: what was chosen, what happened instead, and which rule did it. A simulation that hides its overrides is asking to be taken on trust.

It is also how a watcher learns the rules without reading any. Watch Nyx's reads get thrown away three times and you have learned her floor.

Why not constrain the prompt instead

Partly because it is not reliable, and partly because the override is worth having. A prompt that forbids a move produces a model that mostly avoids it. A rule that forbids a move produces a character who wanted to and could not, which is both more interesting and more legible.

The legal option set is narrowed before the call too. Coercion catches what remains: state that moved while the call was in flight, and anything the rig prices out.

Read next

More on the mechanics