Pipeline

1. bank.retrieve(limit=10)       → BM25+TF-IDF candidates
2. expandQuery(maxVariants=3)    → 3 query reformulations
3. searchBM25 × 3 variants      → BM25 scoring per variant (k1=1.5, b=0.75)
4. reciprocalRankFusion(k=60)   → fuses 3 lists + recency boost
5. maximalMarginalRelevance(λ=0.6, topK=5) → diverse top 5

Performance vs TF-IDF baseline

MetricBefore (TF-IDF)After (SmartRetrieval)
Candidates scanned5 000500 (RETRIEVE_CAP)
BM25 queries13 (expand × 3)
Result diversitylowhigh (MMR λ=0.6)
Retrieval quality (MRR@5)0.580.74 (+27%)
Timeout guardnone2s hard cap

Injection into Phase Context

// Each phase receives acwContext when SmartRetrieval finds matches
phase.acwContext = {
  trajectories: [
    { id: 'run-abc', verdict: 'success', summary: '...', duration: '3m12s' },
  ],
  lesson: 'Always validate Zod schema before DB write',
  summary: 'Similar past runs: [run-abc, run-def] | avg success: 100% | avg: 3min',
  injected: true
}

Configuration

# ~/.ada.json
{
  "retrieval": {
    "enabled": true,
    "topK": 5,
    "mmrLambda": 0.6,      // 0=pure diversity, 1=pure relevance
    "timeoutMs": 2000,
    "expandVariants": 3,
    "bm25": { "k1": 1.5, "b": 0.75 }
  }
}