"A lying score" is the right title, and the specific trap is that cosine distance is not calibrated across queries. A 0.4 on one question and a 0.4 on another do not mean the same thing, so any absolute threshold you pick from one example will misfire on the next.
What made this debuggable for me was checking two things side by side: the rank of the chunk you know is correct, and whether a plain keyword search finds it. If BM25 returns it at rank 2 and vector search does not see it at all, the problem is the embedding or the index rather than the corpus, and you have eliminated half the search space in about a minute.