# Common mistakes

Every item here is silent. None of them produce an error; all of them produce a rule that
looks right and does nothing.

## `$.stat('might')` instead of `$.stat('might')`

Reads by display name, so it breaks the moment anyone renames the stat. A stat nobody has
reads `0`, so the rule keeps running with a wrong number.

→ [Reading values](/docs/reading-values)

## A `var` in a rule body

Not a step, and it takes **the whole body** with it. The rule does not partially run; it
does not run.

→ [Rule bodies](/docs/rule-bodies)

## Treating a missing field as `0`

It is `null`, and `null` loses every comparison including `<`. A rule gated on
`infection < 5` fires on nobody who lacks the field.

→ [Missing values](/docs/missing-values)

## Reading `$.player` when you meant the party

`$.player` is the **host only**. A rule about everyone uses `$.party` — otherwise the engine
can refuse a sleep while a companion starves and your plugin cannot tell.

## Pricing a per-turn system off `$.event.minutes`

In a clockless game those minutes are the narrator's estimate. A wordy turn becomes seven
times more expensive than a terse one.

→ [Minutes are not time](/docs/minutes-are-not-time)

## `refuse` where you meant `veto`

`refuse` stops the player's action. `veto` stops one proposed event. Answering another
plugin's event with `refuse` tells a player standing still that hunger clawed them out of a
sleep they never started.

→ [Steps](/docs/steps)

## Freezing a dial's value into a literal

Correct until someone retunes the dial, then silently wrong with two numbers that disagree.

→ [Formulas and dials](/docs/formulas)

## Passing zero to `$.damage()`

Damage floors at 1, so a dial tuned to zero still costs a point. Branch around the step
instead.

→ [Steps](/docs/steps)

## Putting a number in narration

The narrator never sees mechanics. `$.narrate("fever reduced by 2")` breaks voice; write
the sentence a player should read.

→ [Steps](/docs/steps)
