RRF constant k (60 per Cormack 2009; documented for transparency).
Always "rrf" in v3.x — present as a versioned discriminator.
Echo of the input query.
Optionalrerankedv3.10.0-rc.13 — reranker outcome, present ONLY when a cross-encoder was
requested (--enable-reranker / ctx.reranker). {applied:true, pairs:N}
when it re-scored N candidates; {applied:false, reason} when requested but
it didn't run — reason mirrors signal_errors.reranker on a load/download
failure, or notes there were no candidates. Closes the v3.9.1 bug-report
Issue 9 (reranker silently fell back to RRF with no way to tell whether it
was downloading, failed, or disabled). The stderr lifecycle log
(reranker '<alias>' loading… / loaded; reranked N pairs) is the
serve-side companion.
Optionalsignal_v2.0.0-beta.2: per-signal failure reasons. Pre-fix, ranker exceptions
were silently swallowed (only stderr-logged). The MCP response just
showed signals_used: [] with matches: [] — caller couldn't tell
"no hits" from "all rankers crashed". Now any catch'ed exception
surfaces here as a string so agents can reason about reliability.
v2.9.0 added reranker for cross-encoder failure surfacing.
Which rankers contributed to the fused result.
Envelope returned by searchHybrid.
signals_usedtells the agent which rankers actually fired (BM25 needs--persistent-index; embeddings needsbuild-embeddings).signal_errorssurfaces failed-but-attempted rankers so an emptymatches[]can be distinguished from "all rankers crashed".