This is a common ‘state’ issue with the way that CircleCI processes workflows and filters.
While a filter looks like there is an implied ‘or’ between the ‘branches’ option and the ‘tags’ option this is not in fact how it works. The branch check is performed first and then the tag check.
You should be able to see the issue if you look at the “preparing environment variables” step in the dashboard.
If the project is run due to a change to the branch you will see an environment variable “CIRCLE_BRANCH” set to the name of the branch changed.
If the project is run due to a tag being set you will see an environment variable “CIRCLE_TAG” set to the tag set.
The result is that when a tag is set any branch check is done against an environment variable that is not set and so the the only acceptable check is ‘ignore’ which causes the branch check to be skipped and the tag check to take place. A past thread on the issue can be seen here
The result is that you have to reconsider your logic so that you have workflows defined with filters that target the situation when different branches are modified and other workflows that look for tags.