Nice breakdown — parent-child ingestion plus a reranker are exactly the two upgrades that move the needle first.
One "where RAG fails" case those two don't fix, worth adding: when the answer simply isn't in the corpus, the model still confidently stitches one together from the nearest chunks. Precision fixes don't catch that — you need a groundedness check and permission for the system to say "not in the docs."
And on rerank-top-25: the reranker can only reorder what first-stage retrieval already pulled. If recall missed the right chunk, no cross-encoder recovers it — so first-stage recall@k is the real ceiling, and it's worth measuring separately from final answer quality.