Why it exists
I kept losing twenty minutes to finding one parameter name in an API reference. Search inside documentation sites is either exact-match and brittle, or semantic and confidently wrong. Neither is what a developer wants at 11pm with a failing integration.
What I built
A chat surface over a two-stage retriever. Lexical BM25 and dense KNN run in parallel, fuse with reciprocal rank fusion, then a cross-encoder reranks the top 24 down to 6. Generation only ever sees six passages, which caps token cost independent of corpus size.
The interface problem
The retrieval was solved before the product was. Early testers did not trust answers they could not verify, so every response now renders its source passages inline, collapsed, with the matched identifier highlighted. Trust went up more from that change than from any accuracy improvement.
What broke
Reindexing was a nightly full rebuild, which meant answers were up to 24 hours stale after an upstream release — the exact moment people most need the docs. Rebuilt as a diff against release tags. Also learned that a semantic cache keyed on raw query strings has a hit rate near zero; keying on normalized embeddings took it to 61%.
Where it stands
Live, self-serve, running on a fixed monthly inference budget. Next up is a per-repository mode so teams can point it at their own internal docs without an ingestion pipeline of their own.