Sleep freezes the thread it is on (for instance, in the client, you can freeze the GUI). If you must use it (you don’t need it for what you’re doing here), put it in it’s own asynchronous thread.
Tag change scripts fire only when the tag changes (they do not repeat while it is true). The only issue is they’ll fire when the bit goes true, and when it goes false. To get just the true edge (so your code runs once each time tag becomes true), start your code in a gateway event tag change script something like:
# Ignore change due to subscription and only run on change from false to true.
if not initialChange and event.getValue():
# Do something.