Hybrid retrieval over a grant corpus, with a gate that refuses any draft it cannot support.
Lexical (SQLite FTS5/BM25) and semantic (hashed embedding) run independently, then fuse with Reciprocal Rank Fusion. Fusion is constrained so neither retriever's top hit can be squeezed out.
Leave the box empty and the service drafts its own grounded summary. Or paste an answer and watch it get checked: cite a document that was not retrieved, or state the wrong award amount or deadline, and it is rejected.
Recall@5, MRR and groundedness over a labelled fixture set. No network, no API key, so it runs in CI.