Lexical beats dense here, by 27.8% relative
BM25 outperforms the dense baseline on all five quality metrics; binary recall@10 is 0.177 vs. 0.138,
a +27.8% relative gain (Δ = +0.038, above the ±0.02 standard-error band at
N = 521). This inverts the usual dense-beats-lexical assumption, and the reason is domain-specific:
Java bug-fix patterns are dominated by API names, class paths, and method signatures — exactly the
rare tokens BM25's IDF weighting is built for. The quality comes at a 13× latency cost, and BM25's
p99 of 38.5 s exceeds a typical ~30 s LLM-agent per-turn budget, which matters for deployment
even though it never shows up in a quality table.
The hybrid's value is per-bug, not in the average
Hybrid RRF leads five of six metrics, but its Δ = +0.013 over BM25 sits inside the standard-error
band — so the aggregate is not the evidence. The per-bug decomposition is:
Per-bug top-10 hit decomposition, 521 Defects4J bugs.
| Bucket (top-10 hit) | Count | Fraction |
| All three | 53 | 0.102 |
| BM25 + hybrid only | 24 | 0.046 |
| ada + hybrid only | 7 | 0.013 |
| ada + BM25 only | 1 | 0.002 |
| BM25 only | 14 | 0.027 |
| ada only | 11 | 0.021 |
| Hybrid only (unique RRF gain) | 15 | 0.029 |
| Missed by all three | 396 | 0.760 |
| ada ∪ BM25 oracle ceiling | 110 | 0.211 |
15 bugs are hit by the hybrid and missed by both sub-retrievers: cases where the
positive sits at rank 11–100 for one retriever and RRF surfaces it by summing tail-rank evidence from
both top-100 candidate lists. The hybrid realizes 84 of the 110 oracle hits (76.4%); the remaining 24%
is the cost of RRF's fairness property, and points at a cascade architecture as the next ablation.
End-to-end repair
On a Defects4J v1.2 subset with Qwen Coder 2.5, VibeRepair+ improved plausible repair rates over the
original VibeRepair in all four tested project categories: Chart 53% → 75%, Closure 22% → 43%,
Lang 63% → 68%, Math 49% → 55%. The Python port repairs 26 of 30 BugsInPy single-function bugs (87%).