What is real
Retrieval is hybrid and built in your browser from the 82 handbook sections: a real BM25 lexical index, fused by reciprocal rank fusion with a semantic layer that expands each query through a curated HR-domain concept/synonym table (so "stolen" retrieves a section that says "lost device," despite sharing no words). Both signals are computed live for every query you type, and the trace panel shows lexical rank, semantic rank, and which sections the semantic layer alone surfaced. The evals tab re-runs retrieval checks on page load. Answers are real Claude output, generated once at build time against this exact corpus, then frozen so the demo stays free, fast, and safe to hand to anyone.
What is simplified
"Semantic" here is a curated concept-expansion table, not a neural embedding model: there is no bundled model and no backend to call one, on purpose, so the page stays a single file. Free-text questions outside the curated set get live retrieval but no live generation (a static page has no API key, on purpose). The guardrail is rule-based here; in production this is a classifier pass with an eval suite of its own.
Why it is built this way
This mirrors how I think about shipping RAG features as a PM: ground every claim in a citation, make the pipeline inspectable, refuse out-of-scope questions explicitly, and hold the system to a measurable bar (Recall@5, citation validity, guardrail hit rate) rather than vibes.
Stack
Single HTML file, vanilla JS, no dependencies, no backend. Corpus and answers authored with Claude; app built with Claude Code.