"""Phase 4 — the retrievable corpus. `content/` is the source of truth. This package turns it into the two indexes the AI console reads: * **vectors** in Qdrant, one point per chunk, with the payload that lets the query path filter *before* searching (`area`, `confidence`); * **keywords** in SQLite FTS5, one row per chunk, so exact tokens (repo names, `LoRaWAN`, `MQTT`, dates) are not lost the way they are with vectors alone (decision D10, hybrid retrieval). Everything here is driven by `python3 -m corpus.cli`; `docs/phase-4-notes.md` is the operator manual and records what was measured. The pipeline is Provider-agnostic by design: `corpus/embeddings.py` is the only place that knows how a vector is made, and the provider + model + dimension are recorded per collection so a provider change is a governed migration, not silent corruption. Standard library only, plus the repository's own validator (`tools/`). No new dependency, no Node, no framework (AGENTS.md section 4.1). """ __all__ = ["config", "loader", "chunker", "payloads", "embeddings", "qdrant", "store", "pipeline", "freshness"]