This does two things.
First, and most importantly, I added a second "test -f" check so that the pipeline actually fails. I don't know why my too-clever-by-half solution of "test || (echo && false)" didn't work, but this simpler way seems to work better.
Second, I put a ton more information in the error message. I also moved it to a text file, so that I didn't have to escape every little shell character in my message. Hopefully this helps remove some confusion about how to address these problems.