Rage Is Not Raging
D&D used one word for both the ability and the state it created. The compiler made me admit they were different responsibilities. Splitting them turned one overloaded feature into a composable handoff, then made the hidden +2 explain itself.
One object doing everything
The last field note ended with the confidence of .On(bus). Rewind one day. The first real Rage Feature was roughly 170 lines because activating Rage and remaining enraged were still treated as one responsibility.
It checked and spent uses, remembered its owner, subscribed to attacks and incoming damage, added damage and resistance, tracked subscription IDs, ended itself, and announced that it had started and stopped.
Rage is not Raging
Rage is something a Barbarian can do. Raging is the temporary state that follows. The feature should decide whether activation is allowed and spend the use. The condition should own everything that remains true afterward.
The compiler agrees
The concepts were separate. Their dependencies were not. Rage needed to create Raging. Conditions needed the D&D event topics. The root D&D package defined those events while also trying to import its child implementations.
Go refused the circular dependency. I could move the names around, but I would not continue until the arrows expressed one honest direction of ownership.
Give the job to the thing that can own it
Action[T] had landed before both the overloaded Rage and the compiler wall. Its first example was Rage. The contract asked only whether an action could activate, then let it activate. The cycle made the value of that restraint visible.
The answer was not another object above everything. It was giving each responsibility to the thing that could do it well and own the result.
Give the handoff neutral ground
The final correction extracted dnd5e/events. It owned the topics, event types, and small ConditionBehavior interface without importing Feature, Condition, or Character implementations. Every domain package could point toward the same foundation.
Rage could create Raging and announce the handoff. Character could receive it, apply it, and store it. Raging could subscribe to the moments and chains it owned from there.
Why is this 13 damage?
The proof did not need the whole combat system. A Barbarian attacked a Monster. The active RagingCondition joined DamageChain and contributed its bonus. The result kept enough provenance to explain itself.
Eight from the die. Three from Strength. Two from Rage. Composable rules still need to explain themselves.
Next field note When a Rule Needs the Room →