Semantic-search slice 1 (infra). Adds the pgvector plumbing the backfill worker and
hybrid search will use:
- swap the Postgres image to pgvector/pgvector:pg16 (drop-in for pg16 data)
- Pgvector + Pgvector.EntityFrameworkCore (0.2.0, EF8-compatible); UseVector() on the
runtime + design-time contexts
- Email.Embedding vector(768) column (nomic-embed-text dims), nullable, with an HNSW
cosine index; ignored under the InMemory test provider
- migration: CREATE EXTENSION vector + column + HNSW index
Verified against a real pgvector container: extension, HNSW, and cosine search work, and
the full EF round-trip (store a Pgvector.Vector, CosineDistance operator, nearest-first
ordering) applies all migrations and passes. No vulnerable packages. Build + all 41 tests
pass. Column stays null until Ollama generates embeddings (search falls back to lexical).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>