From 4e739f3cd8cf45ecc21d3bc6408ee19877a41c57 Mon Sep 17 00:00:00 2001
From: th-kim0823
Date: Sun, 10 May 2026 17:54:16 +0900
Subject: [PATCH] feat(search): add score_kind to VectorRetriever (Cosine) and
hybrid test helpers (Rrf)
This commit unblocks Tasks 3 and 4 of fb-38:
- VectorRetriever::build_hit now labels hits with ScoreKind::Cosine
- Hybrid retriever test helpers (mk_hit functions) label synthetic hits with ScoreKind::Rrf
- Updated lexical snapshot fixture to reflect new score_kind field in output
Co-Authored-By: Claude Opus 4.7 (1M context)
---
crates/kebab-search/src/hybrid.rs | 2 ++
crates/kebab-search/src/vector.rs | 3 ++-
crates/kebab-search/tests/fixtures/search/lexical/run-1.json | 2 ++
3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/crates/kebab-search/src/hybrid.rs b/crates/kebab-search/src/hybrid.rs
index 7f415a9..e285915 100644
--- a/crates/kebab-search/src/hybrid.rs
+++ b/crates/kebab-search/src/hybrid.rs
@@ -505,6 +505,7 @@ mod tests {
// a fixed UNIX_EPOCH so synthetic hits remain deterministic.
indexed_at: time::OffsetDateTime::UNIX_EPOCH,
stale: false,
+ score_kind: kebab_core::ScoreKind::Rrf,
}
}
@@ -755,6 +756,7 @@ mod tests {
chunker_version: ChunkerVersion("c1".into()),
indexed_at: time::OffsetDateTime::UNIX_EPOCH,
stale: false,
+ score_kind: kebab_core::ScoreKind::Rrf,
}
}
diff --git a/crates/kebab-search/src/vector.rs b/crates/kebab-search/src/vector.rs
index 9bf74c7..47eda97 100644
--- a/crates/kebab-search/src/vector.rs
+++ b/crates/kebab-search/src/vector.rs
@@ -21,7 +21,7 @@ use std::sync::Arc;
use anyhow::{Context, Result};
use kebab_core::{
ChunkId, ChunkerVersion, DocumentId, Embedder, EmbeddingInput, EmbeddingKind,
- IndexVersion, RetrievalDetail, Retriever, SearchHit, SearchMode, SearchQuery,
+ IndexVersion, RetrievalDetail, Retriever, ScoreKind, SearchHit, SearchMode, SearchQuery,
SourceSpan, VectorHit, VectorStore, WorkspacePath,
};
use kebab_store_sqlite::SqliteStore;
@@ -326,6 +326,7 @@ fn build_hit(
// (called from `App::search` / `App::search_uncached`) and the equivalent
// in `RagPipeline::ask` against the configured threshold.
stale: false,
+ score_kind: ScoreKind::Cosine,
})
}
diff --git a/crates/kebab-search/tests/fixtures/search/lexical/run-1.json b/crates/kebab-search/tests/fixtures/search/lexical/run-1.json
index 2500cd4..d6ae0dc 100644
--- a/crates/kebab-search/tests/fixtures/search/lexical/run-1.json
+++ b/crates/kebab-search/tests/fixtures/search/lexical/run-1.json
@@ -26,6 +26,7 @@
"vector_rank": null,
"vector_score": null
},
+ "score_kind": "bm25",
"section_label": "Snap",
"snippet": "alpha alpha",
"stale": false
@@ -57,6 +58,7 @@
"vector_rank": null,
"vector_score": null
},
+ "score_kind": "bm25",
"section_label": "Snap",
"snippet": "alpha bravo charlie",
"stale": false