Well, if I'm reading you correctly, it seems the issue you have is with event communication.
The "Event" that is occurring is a dice roll.
Ignoring everything else, the event taking place is a dice roll.
Now, from what you describe, there are a number of dice-roll types that can occur. 2-dice, 3-dice-subtract-lowest, 4-dice, etc.
Those events must be communicated to all interested components. The most generic way to do that is to broadcast the type of dice-roll, and then the dice.
Broadcast(4-DICE-ROLL_ENUM, 6,3,2,6) //where the enum tells what kind of roll, and the 4 numbers tell what the rolls were.
You can package the message up in a million different ways, the important part is entities and/or their components need to hear about it, and react by changing their internal state, and/or sending out their own messages. One of the entities/components may score that roll as a hit, and set it's internal state to dead, while sending out a "Died" broadcast message to all the other entities/components.
So, to directly answer your question, I guess you would say you "put the logic of the ability into the components". Because they have to deal with these events as they see fit.