//! Ripvec retrieval pipeline ported into Rust.
//!
//! This subtree mirrors the Python reference implementation at
//! `~/src/semble/src/semble/`. Each Rust module corresponds to one
//! Python source file; the port preserves the ripvec pipeline shape
//! (chunker → tokenizer → BM25 path-enrichment → static encoder →
//! RRF hybrid → boosts → penalties → reranker) one-for-one.
//!
//! ## Module map
//!
//! | This module | Python source |
//! |---|---|
//! | [`tokens`]    | `src/semble/tokens.py` (camelCase/snake_case splitter) |
//! | [`chunking`]  | `src/semble/chunking/{core,chunking}.py` (AST-merge) |
//! | [`bm25`]      | `src/semble/index/sparse.py` (path-enrichment + scoring) |
//! | [`dense`]     | `src/semble/index/dense.py` (StaticEncoder via model2vec-rs) |
//! | [`ranking`]   | `src/semble/ranking/{weighting,boosting}.py` (alpha + boosts) |
//! | [`penalties`] | `src/semble/ranking/penalties.py` (path priors + rerank_topk) |
//! | [`hybrid`]    | `src/semble/search.py` (RRF + α-blend + boost + rerank) |
//! | [`index`]     | `src/semble/index/index.py` (RipvecIndex orchestrator) |
//!
//! ## Scope under `--model ripvec`
//!
//! When `--model ripvec` is active, the orchestrator in [`index`] drives
//! the full pipeline: it builds a [`RipvecIndex`](index::RipvecIndex)
//! using the chunker in [`chunking`] and the encoder in [`dense`], and
//! dispatches search via [`hybrid::search_hybrid`]. Ripvec's existing
//! BM25 in `crate::bm25` and hybrid in `crate::hybrid` are *not* used
//! on this path.
//!
//! Per the `port+ripvec` scope decision in `docs/PLAN.md`, the final
//! ranking step applies ripvec's
//! [`boost_with_pagerank`](crate::hybrid::boost_with_pagerank) on top
//! of the ripvec engine's rerank — making `--model ripvec` the ripvec engine's retrieval plus
//! ripvec's structural prior.

pub mod bm25;
pub mod chunking;
pub mod dense;
pub mod hybrid;
pub mod index;
pub mod manifest;
pub mod penalties;
pub mod ranking;
pub mod static_model;
pub mod tokens;
