Reading
Series
The posts here are not independent. Several are two halves of one investigation, and a few only make sense read in order. These are the threads.
Three runs, one boundary
What reranking can and cannot do
A reranker reorders a list someone else built. That single fact decides which problems it can touch and which it cannot, and it is the difference between a week well spent and a week spent swapping models that could never have helped. These three posts find the boundary, then find out why the reranker inside it was failing anyway.
The lever nobody reaches for
What you let into the index
Model comparison is the visible knob — there are model cards to read and leaderboards to check, and it feels like progress. The largest measured improvement in this whole project came from deleting 3% of a corpus. These posts are about the decisions made before any model runs.
- 1Three percent of my index was eating the top five results
- 2Picking an embedding model when the queries and the code are in different languages
- 3Repository routing is the retrieval problem nobody benchmarks
- 4Measure the index you actually serve
- 5The scores spread out 15 times wider and the ranking did not move
- 6I could not measure the threshold where it mattered, until somebody could
Four wrong measurements, in order
The GPU investigation
An afternoon's work that took a week, because the first three measurements were of things I had set up badly. Read in order: the mistakes are more transferable than the result, and each one looked reasonable while I was making it.
Five ways a number can mean nothing
How benchmarks lie
Every post here is the same shape: a measurement that looked fine, a system that looked like it was working, and a reason the number could not have told the difference. A failing test announces itself. A meaningless test does not — that asymmetry is why these took weeks to find.
- 1The baseline that beat my agent was answering the same thing every time
- 2My agent benchmark was reading the answer off disk
- 3Ground truth from git history answers a different question than you asked
- 4Flaky and consistently wrong are different bugs with the same score
- 5Measure the index you actually serve
- 6A tie at four hundred queries was a loss at fifteen hundred
- 7The span that answered a question it never measured
- 8I fixed the code three times and never checked the symptom
- 9Three ways I broke one benchmark, and who caught each one
- 10My router scored 100% and a fixed answer scored 40%
- 11My benchmark had one slot left, so every change measured zero
- 12Five ways to measure the wrong thing, and each one was inside the fix for the last
- 13Recall was exactly 1.0000 four times, and that was the measurement telling me
One session, eighty days
Where agent context goes
A coding agent stopped answering for nineteen minutes. The investigation that followed found that context is not spent gradually on conversation — it goes in jumps, and the jumps come from a handful of commands nobody remembers running.
One failure, read three times
Routing a ticket to a repository
Twenty-eight repositories and a ticket that belongs to one of them. Fusing two rankers lost, then lost again, then won — with nothing about the fusion changed. Read in order, these are the same event from three distances: the mechanism, the verdict I drew from it, and what the verdict was actually a specification for.
- 1Fusing two rankers made routing worse, and the reason is structural
- 2Repository routing is the retrieval problem nobody benchmarks
- 3The biggest repository wins, and it has nothing to do with relevance
- 4The one case it fixed and the ones it broke
- 5The index found 39 percent, the agent found 96, and the useful question was neither
Two days on a customer-facing search
What a zero-result rate is counting
A metric that looks like a defect count, decomposed. Most of the volume turned out to be demand for products that were never in the catalogue; the slice that really was a search defect came down to one multiplication that could not reach its own cutoff, and then to one suffix that made a place name match nothing at all.
Three baselines that were not constants
When the measurement moved
A baseline is supposed to be the thing you compare against. In one week three of them turned out to be measurements in their own right — a trace whose timings were synthesised, an evaluation set that changed under a re-collection, and an index whose scores depended on which folder it was built in. Different systems, different causes, the same symptom.
Two instruments, one of them lying
Where the agent's time goes
An agent that takes twelve minutes is not twelve minutes of work. Most of it is the model deciding what to do next, and the trace that is supposed to show you this can be computing the numbers rather than recording them. These posts open the instrument first, then use what survives to find out where the time actually sits — and why the intervention that helped did not make anything faster.