I had this problem with a transition guard looking like this: [after(3,tick), receive(my_msg)]
It wasn't working as intended either and I changed it to this expression: [after(3,tick) && receive(my_msg)]
After that the messages disappeared. So I'm guessing in the first expression the message receival isn't part of the condition but rather an action that somehow gets executed after the time check. And that action doesn't have a semicolon after it, so its return value gets printed.