I posted a bug submission some days ago on [Link Removed], however I received a mail asking me to repost it here instead. So here I go, even if it's not a question per say.
Description: The WaitGameplayTagQuery node doesn't work with EGameplayTagQueryExprType::NoTagsMatch because of the UAbilityAsync_WaitGameplayTagQuery::EvaluateTagQuery implementation. Indeed, to test if the query matches, the line "const bool bMatchesQuery = !TargetTags.IsEmpty() && TagQuery.Matches(TargetTags);" is executed. However, it is incorrect, since with EGameplayTagQueryExprType::NoTagsMatch (and presumably EGameplayTagQueryExprType::NoExprMatch), the correct line would be "const bool bMatchesQuery = TargetTags.IsEmpty() || TagQuery.Matches(TargetTags);". Indeed, if the target tags array is empty, the query matches.
UDN Case: 00535139
The WaitGameplayTagQuery node should resolve when the tested Actor loses the "Gameplay_Locked" tag.
The WaitGameplayTagQuery node will never resolve, thus the "Trigger" exec pin will never be reached.
I found it easiest to just create a Gameplay Ability that adds and removes loose tags while waiting for the GameplayTagQuery to succeed. That way all the logic is together.
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-178485 in the post.