When a Rule Needs the Room
Rage could explain its own +2. Dueling needed both hands. Sneak Attack needed an ally beside the target. Protection needed the room, a shield, and a reaction. The event could not carry the whole world.
One real rule asks for the next seam
Rage proved damage could compose. The next features revealed adjacent needs. Second Wind first published a healing event; HealChain followed five days later. Unarmored Defense exposed armor-class calculation; ACChain followed, although that condition would not join it until later.
Conditions work until they need the room
Dueling needed to inspect both hands. Sneak Attack needed to know whether an ally stood beside the target. Protection combined distance, a shield, and an available reaction. These conditions needed facts beyond their own state and the event in front of them.
The event is not the world
Adding the missing facts to DamageChainEvent solved each example locally. It also made every publisher responsible for equipment, armor, positions, teams, levels, and action economy whether the listening rule needed them or not.
Four wrong homes for the same question
The event was only the first candidate. Resolver functions made the chain depend on an absent game server. Conditions caching equipment could go stale. Registries on the bus made event routing responsible for state storage.
This is runtime context
The game server had already loaded the characters and room for this call. It could expose narrow registries through Go's context.Context. The rulebook defined the questions; each condition asked only what it needed; core events remained generic.
Reading worked. How do we write this back?
gamectx gave conditions clean read access. It did not give them an owner-controlled write path. When damage needed to change HP, the design handed out live Combatants, called ApplyDamage, then marked changed objects dirty for the host to save later.
ApplyDamage and dirty tracking shipped. The generic save sweep remained intended, and conditions still lacked a clean request path back to the state owner.A condition knew what should change. How could it ask the Character that owned the state to change it?