Tracks deferred work from #431 (fork B). Design ref: docs/superpowers/specs/active/2026-07-12-hybrid-bm25-rrf-design.md.
Why
#431 treats the macOS-Intel lexical-only path conceptually as "hybrid with an empty vector list," but does not physically unify the two code paths. After #431, both paths speak the same RRF vocabulary, so unification is now tractable.
Scope
- Collapse
search_lexical.py and the lexical branch of search_lancedb.py into one read path where the vector list is simply empty when the vector stack is absent (macOS Intel).
- One ranking code path, not two. Removes the lexical/backend split.
Why deferred from #431
Scope/risk control — #431 ships the ranking improvement without restructuring the backend boundary.
🤖 Generated with Claude Code
Tracks deferred work from #431 (fork B). Design ref:
docs/superpowers/specs/active/2026-07-12-hybrid-bm25-rrf-design.md.Why
#431 treats the macOS-Intel lexical-only path conceptually as "hybrid with an empty vector list," but does not physically unify the two code paths. After #431, both paths speak the same RRF vocabulary, so unification is now tractable.
Scope
search_lexical.pyand the lexical branch ofsearch_lancedb.pyinto one read path where the vector list is simply empty when the vector stack is absent (macOS Intel).Why deferred from #431
Scope/risk control — #431 ships the ranking improvement without restructuring the backend boundary.
🤖 Generated with Claude Code