Knowledge graph & search
Bi-temporal entities, hybrid BM25 + embedding retrieval, and Ask (RAG).
Conclave doesn't just store transcripts — it builds a knowledge base across meetings so you can ask a question and get a cited answer pulled from everything, not just the last call. All of this is built at ingest; the read path stays operator-blind.
What gets extracted
- Entities — per-chunk LLM extraction of people, technologies, and affiliations (derived
types), stored bi-temporally (
valid_to/superseded_by) so the graph has history. - Entity resolution — lexical-first, definition-driven merge (tuned to avoid "black-hole" over-merges).
- Obligations & facts — structured action items and facts, also bi-temporal.
- Chunking — turn-aware (never splits mid-turn) with context headers, plus FTS5 + embeddings.
Hybrid search
Retrieval runs two lanes and fuses them:
- FTS5 BM25 (lexical) ∥ local nomic embeddings (768-d, 256-d Matryoshka ANN via
sqlite-vec). - Fused with Reciprocal Rank Fusion (RRF), then visibility-filtered.
It's pure SQL + local embeddings — no model call, no egress. That's what makes search
operator-blind. Surfaced at POST /search.
Ask (RAG) — the only read-path LLM call
POST /ask synthesizes an answer from retrieved contexts and is the single deliberate exception
to "no LLM on reads." Every answer is cited (quote, speaker, meeting). It's optional (returns 404
when disabled) and runs inside the TEE.
Cited or it didn't happen. Ask never free-associates — it answers from retrieved, visibility-scoped context and shows its sources, so an answer can always be traced back to the meeting it came from.
The graph, per-entity pages, obligations, and open-questions rollups are all browsable in the app.
Source: FEATURE-SPEC.md §2.4 & §6, conclave-graph-synthesis/, ENTITY-CANON.md.