10. Retention is bounded by the old model, not by our adapters¶
Status: Accepted · Date: 2026-08 · Evidence: docs/bridge-band.md, sections 3 and 7
Decision¶
Stop treating adapter retention as an engineering target. It is bounded by how much structure the old embedding space contains, and neither more fit data nor more adapter capacity moves it. The tool's job is to measure it and say what it implies, not to raise it.
Context¶
The break-even is ARR × upgrade_gain > 1. Of the two factors, upgrade_gain
is a property of the models and not ours to change; retention looked like ours.
Measured at 0.47–0.87 across fifteen real-query runs, it is the binding
constraint: at a routine refresh gain of 1.10 a run needs retention above 0.91,
and none of the fifteen reached it.
So the obvious move was to raise it. Two hypotheses, both cheap to test, both wrong.
Evidence¶
It is not the fit-pair count. M0 found the quality curve flattening at 4,000 pairs, measured at 384→384. The low-retention runs are 256→768, where a linear adapter's weight is 196,608 parameters and 4,000 pairs is fifteen samples per input dimension — apparently badly underdetermined. Raising it to 25,000:
| run | 4k | 10k | 25k | change |
|---|---|---|---|---|
| unix, potion→bge-base | 0.414 | 0.415 | 0.429 | +0.015 |
| fiqa, potion→bge-base | 0.466 | 0.465 | 0.476 | +0.010 |
| programmers, potion→bge-base | 0.475 | 0.478 | 0.480 | +0.005 |
| gaming, potion→bge-base | 0.680 | 0.685 | 0.686 | +0.007 |
| unix, MiniLM→bge-small (control) | 0.818 | 0.841 | 0.843 | +0.025 |
Six times the data buys one to two points. M0's default holds at dimensions it was never measured at.
It is not adapter capacity. Across all fifteen fits, including at 25,000
pairs where the residual MLP has ample data, the winner was
procrustes_centered 15 times out of 15. The most constrained candidate in
the list — an orthogonal rotation — beat the ridge affine, the low-rank affine
and the MLP everywhere. What is not a rotation is not learnable by a more
flexible map either.
It is the source space. What retention actually tracks:
| predictor | correlation with retention |
|---|---|
| how good the old model is (its own nDCG@10) | +0.901 |
| source dimension | +0.875 |
| dimension ratio in/out | +0.739 |
| upgrade gain | −0.958 |
| source model | runs | mean retention |
|---|---|---|
| potion-base-8M (256d, weak) | 5 | 0.547 |
| all-MiniLM-L6-v2 (384d) | 10 | 0.791 |
The consequence¶
This explains the −0.958 anti-correlation, and it is arithmetic rather than
coincidence. Retention is a function of the old model's quality. upgrade_gain
is the new model's quality divided by the old model's. Both are driven by the
same variable, in opposite directions.
Which means: bridging cannot be a general answer to "the new model is much better". The condition that makes an upgrade worth doing — a weak old model — is the same condition that makes bridging fail. There is a band where the old model was good enough to map from and the new one is substantially better, and it is narrow: four of fifteen real-query runs landed in it.
You cannot recover from 256 dimensions what 768 dimensions encode. No adapter family fixes that, because it is not a modelling problem.
Consequences¶
- No change to
--pairs; the default stays at 4,000 and is now measured at two dimension regimes rather than one. - No new adapter candidates on retention grounds.
auto's list is not what is limiting these runs. - The report can say something it could not before: when retention is low because the old model is weak, more compute will not help and a reindex is the honest path.
- Per-cluster adapters remain worth trying, but for a different
reason — heterogeneous drift within a corpus, which
tail_arrdetects — not as a way to lift the ceiling measured here.
Alternatives¶
Add higher-capacity adapters. Rejected on the measurement: the most constrained candidate already wins everywhere.
Raise the default --pairs. Rejected: measured at six times the data for
one to two points, against a real cost in fit time.
Predict retention from the model pair and skip the fit. Tempting — the correlation is +0.901 — and rejected. A correlation over fifteen runs with two source models is not a predictor, and a tool that guessed instead of measuring would be the thing this project exists not to be.
Independently confirmed, and one thing added¶
Maystre, Ortega Gonzalez, Park, Dolga, Berariu, Zhao and Ciosek, When Embedding Models Meet: Procrustes Bounds and Applications, reached the same place from theory. Their motivating scenario is this one — the query model is upgraded and the document embeddings cannot be recomputed — and two of their results bear directly on this decision.
Why the most constrained candidate wins. They compare orthogonal Procrustes
against unconstrained linear alignment. By construction the unconstrained
solution cannot be worse on alignment error, and yet orthogonal wins on
retrieval, particularly when upgrading to a stronger query model (their
Figure 5): preserving the stronger source model's geometry keeps information an
unconstrained map discards. That is the mechanism behind procrustes_centered
winning 15 out of 15 above, arrived at independently.
A bound is not the prediction that was rejected. Their Corollary 1 states
that if two models' pairwise inner products agree to within δ, the best
orthogonal alignment satisfies E[‖x̄ᵢ − yᵢ‖²] ≤ √(2D)·δ. That is a
one-directional guarantee, data-independent and independent of N, and it costs
one Gram-matrix difference — no fit at all.
rebasis now reports δ and the bound it implies (rebasis.core.geometry,
probe's report). It does not overturn the rejection above, because it is a
different kind of object: it says an alignment of at least this quality exists,
never that retrieval will realise it. The converse does not hold, and a low
bound beside a low ARR is not a contradiction — it means the alignment was
available and something else lost it. The measurement remains the answer.
Two further notes from the same paper, recorded because they touch decisions
made here: their sample saturation sits near 10,000 pairs against M0's 4,000,
which is consistent with the table above showing the point being model-pair
dependent rather than universal; and their zero-padding of the smaller
embedding under a dimension mismatch is the same convention as
IdentityAdapter's padding and the hard_drift 384→256 scenario.