As a rule of thumb, if desired functionality sounds too specific for the current scenario and isn't likely to be required for other scenarios, then an external bot might indeed be more appropriate. If changing the functionality breaks existing use cases or makes them harder to use, that's an additional design smell.
Regarding loops, it comes to this: a loop is not easy to avoid if a message is sent from one source(action) and received back from another. Looping as a problem occurred also in the scala interpreter action, but it was fairly easy to avoid because there were ways to detect that the message came as a result of this same action.
