The engine is a referee, not a player. The whole game is a fold over a stream of actions:
final_state = reduce(apply_action, actions, initial_state)
apply_action(state, action) is the only function that mutates the game. It validates the action
against the current state, then transitions it.
IllegalAction and the state is left exactly as it was.apply_action.Composure is a household’s life total. Each player starts at 20.
Time is spent to play cards.
cost. Playing a card spends that much Time.time >= cost; overspending is rejected with “not enough Time (have/cost)”.turn-priority.md).