I’ve not even considered the possibility of an infinite loop. Every follower could remember from whom he’s gotten stats within “A stat propagation iteration” and not gain stats, when he has already gotten stats from that follower this iteration. That would in my example lead to the following:
// Follower object structure:
// First element: is the identifier for a specific follower
// Second element: follower stats after stat gain has been applied
// Third element: a list of followers this follower has gotten stats from (this stat propagation iteration)
// The Templar0 just attacked.
[Templar0 2/1 []] --(Templar0 +1/+0)-->
[Familiar0 3/2 [Templar0]] --(Familiar0 +1/+0)-->
[Familiar1 3/2 [Familiar0]] --(Familiar1 +1/+0)-->
[Familiar0 4/2 [Templar0 Familiar1]] --(Familiar0 +1/+0)-->X
[Familiar1 3/2 [Familiar0]]
Seems reasonable to me.