Good rundown of the retrieval-vs-generation split, that's the part most RAG writeups blur together. One thing worth adding to "where teams get this wrong": the ground truth itself is only as stable as the chunking scheme it was labeled against. expected_chunk_ids pinned to one chunking strategy don't reliably still point at the same content after you change chunk boundaries, so a before/after recall@k comparison across a chunking change can be comparing against a stale definition of "the right chunk" rather than the new one, unless the ground truth gets re-derived by content match rather than trusted by ID. And on the LLM-judge faithfulness check, it's worth calibrating the judge itself before trusting it across the whole eval set — run it against a small hand-labeled set of known SUPPORTED/UNSUPPORTED cases first. A judge that's quietly biased toward SUPPORTED (a common failure mode) will launder unfaithful answers through a metric that looks like it's catching them.