Cortex Adaptive Multi-Ranker Ensemble — measured, weighted, evolving
Date: 2026-06-21 · Status: Design concept (operator-directed) · Owner: cortex-memory + program-review-prime
Origin: operator on G13 — "I don't believe in a single ranker; multiple rankings help — different algorithms, different perspectives. Over time, measure which rankings are better, give weight to different rankings, converge to a finalised recommendation ranking engine — but never static; as better mechanisms come we evolve the methodology."
This is the cross-family-diversity ethos applied to retrieval: many ranking perspectives, contribution measured on ground truth, weights adapted and evolved — never one static ranker.
1. Principle
- Many rankers, not one. Each ranker = a distinct algorithmic perspective (lexical TF-IDF/BM25/keyword, entity-graph, fact-key, dense/ANN, HyDE, cross-encoder (G13), LLM-reranker for high-cost_of_error). One ranker is a single point of view; an ensemble sees the corpus from many angles.
- Measure each ranker's contribution over time — per query-type, on the ground-truth-useful result (CCMLP outcome + NDCG@k, G17/G38/G1). Which perspective actually predicts the helpful memory?
- Adapt the fusion weights from those measurements — learned fusion / contextual bandit over rankers (the evolution of G54 autotune from a precision-proxy to downstream-success-weighted), replacing the fixed RRF weights.
- Converge to a recommended engine — but non-static. As better rankers emerge they enter the ensemble, get measured, and the weighting re-converges. The methodology itself evolves (OBSERVE→MUTATE→SELECT applied to rankers — the swarm ideology for retrieval).
2. What exists today (ground truth)
- RRF fusion already IS multi-ranker —
tiered_memory.py:2376fuses tfidf+bm25+keyword+entity+graph+fact_key (+flagged dense/hyde/activation) by reciprocal rank, weights:2121-2138, RRF_K=60. But weights are FIXED, not measured/learned. - Autotune is a heuristic precision-proxy —
memory_optimizer.py:195(G54), not outcome/RL-weighted, not per-ranker contribution. - No cross-encoder / LLM ranker in the ensemble (G13); no per-ranker contribution metric; no evolving weight loop.
3. The build (binds existing gaps)
| Piece | Gap | Note |
|---|---|---|
| Add ranker perspectives (cross-encoder, LLM-for-critical, dense-on) | G13, G22 | each a pluggable ranker, hot-path local default + LLM for high cost_of_error |
| Per-ranker contribution measurement | G17/G72 + G38/G1 | NDCG/outcome attribution per ranker, per query-type, on the CCMLP harness |
| Learned/adaptive fusion weights | G54 (reframed) | bandit/LTR over rankers from downstream-success — replaces fixed RRF weights |
| Evolving recommendation | G106 (this) | ensemble registry + measured weights + a process to admit new rankers and retire weak ones, re-converging over time |
4. Honest status
RRF multi-channel fusion exists with fixed weights; there is no measurement of per-ranker contribution and no adaptive/evolving weighting, and the strongest perspectives (cross-encoder, LLM, dense-in-prod) are absent/flag-off. Nothing here is "learned ranking" today — it is fixed fusion. G106 is the umbrella; G13 (rankers) + G54 (adaptive weights) + G17/G72 (measurement) are its parts. The recommended engine is explicitly a moving target, re-measured each release via CCMLP.