Six weeks after v0.4.0 shipped identity governance and agent attribution, hermes-memory-pgvector v0.4.1 is out — and it fixes the one class of recall miss pure vector search can't solve on its own.
The gap pure vector search leaves
Cosine similarity over embeddings is very good at "similar meaning," and quietly bad at two things: exact lexical matches (an error code, a hostname, a literal string a teammate typed verbatim) and any row that was written before an embedding backfill caught up to it — a null-embedding row is invisible to a vector-only query no matter how relevant it is.
Reciprocal Rank Fusion, not a rerank hack
v0.4.1 adds hybrid_search() and hybrid_search_turns(), which run the existing HNSW cosine query and a PostgreSQL full-text query over the same rows in parallel and fuse the two rankings with Reciprocal Rank Fusion (k=60) — a rank-based merge that sidesteps normalizing two incompatible similarity scores. A GIN index on to_tsvector('english', content) (migration 003_hybrid_search_fts.sql) keeps the lexical side of that architecture fast at table scale.
Rows with a null embedding — the ones a pure vector query would silently skip — now surface through the full-text side of the fusion instead of disappearing.
On by default, opt out per call
plugins.pgvector.hybrid_search defaults to true. Nothing about existing v0.3.x/v0.4.0 data or behavior changes; the fusion only kicks in on the new recall calls, and it degrades gracefully to vector-only if the full-text index isn't present. No external cloud search service required — it's Postgres, doing one more thing well.
Get it
pip install hermes-memory-pgvector
Source, migration, and config on GitHub:

