Well, the thing is, hashcat does obviously not check the candidates but the input words, which is a significant difference. And only performing the check on the input words does not achieve any of the things you claim.
imagine:
So in the end the input word is not rejected and you try the invalid candidate which you claim should be avoided at all cost.
imagine:
Code:
$ cat wordlist
password
$ cat rule.rule
]]
So in the end the input word is not rejected and you try the invalid candidate which you claim should be avoided at all cost.