Aha, wait.
I was not awake.
I see that you want to always run this custom code. That does seem to be what a callback was designed for.
One thing you might have to do is go through and see what places members are added that don't use group::add_member and figure out if they can be changed.Otherwise your callback will not be consistent if another method is used to add a member.
I think passing member_state to the callback makes sense.