Grounded. Fictional company · synthetic data

A policy assistant that shows its work.

Ask an HR policy question for Meridian Works, a fictional 1,200-person company. Retrieval runs live in your browser (hybrid: BM25 lexical scoring fused with a semantic concept layer, over 82 handbook sections); answers were generated by Claude at build time and every claim carries a citation you can open. The trace panel shows each step, including when the right answer is to refuse.

Retrieval: hybrid, live, in-browser Semantic layer: concept expansion, not embeddings Answers: real LLM output, precomputed Guardrails: rule-based in demo Built with Claude Code

How this demo works, honestly

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.