Daily digest

Agentic fix-PRs get rejected 46% of the time, and instruction files are a coin flip

Jun 14, 2026 · 🎧 10 min

agentic codingevalsagent memoryinformation retrievalmulti agent

Two same-day AIDev studies anchor the day: 46.41% of agentic bug-fix PRs are rejected (most often for inactivity, supersession, or the agent dying mid-session), and adding instruction files moves merge rate up or down almost equally unless the files are long and well-structured. A causal Java-repo study shows the apparent post-adoption architecture improvement is a denominator artifact, plus new memory and retrieval results on G-Long and a two-agent search eval that catches LLM judges disagreeing on the same rubric.

Highlights

  • 46.41% of agentic bug-fix PRs from Copilot, Devin, Cursor, and Claude are rejected; the top cause is inactivity (17.3%), not bad code
  • Adding instruction files raised merge rate ≥20pts for 27.7% of projects and dropped it for 26.35% — only long, well-structured files helped
  • A causal Java study shows the 6.7% post-adoption drop in architectural smell density is a denominator effect: smell counts flat (+1.1%), LOC up 12.8%
  • Two-agent search eval: rolling-window memory beat intent-extraction memory and ran 35% faster, and Gemini vs Claude judges disagreed on the same rubric

Across the AIDev dataset, 46.41% of bug-fix pull requests opened by Copilot, Devin, Cursor, and Claude end up rejected. That is the headline from a new MSR ‘26 study out of École de Technologie Supérieure (Abujadallah, Arabat, and Sayagh), and the interesting part is not the number but the autopsy. The authors hand-labeled a representative sample of 306 closed-not-merged fixes and sorted the rejections into 14 reasons under four headings. The single most common cause, at 17.3%, is mundane: the PR sat untouched until a bot closed it for inactivity. Another 5.9% were superseded by a human’s competing fix. Only after that do the failures you’d expect show up: incorrect implementation (5.6%), wrong approach (2.6%), CI and test failures (6.9%), and the agent simply dying mid-session or hitting a rate limit (7.5% plus 1%). Rejected fixes carry a median code churn between 81 and 293 lines, so each one burns real human review before it gets thrown away, and almost half of all review comments in the dataset land on changes that never merge.

The same group published a companion paper the same day asking the obvious follow-up: do instruction files fix this? Toward Instructions-as-Code tracks 15,549 agentic PRs across 148 projects, comparing each project’s merge rate, code churn, and time-to-merge before and after it added a copilot-instructions.md, CLAUDE.md, or equivalent. Adding instructions is close to a coin flip: 27.7% of projects raised their merge rate by at least 20 points, while 26.35% dropped by at least that much. The one signal that separates winners from losers is length and structure. Projects whose merge rate climbed had substantially longer instruction files broken into more sections and subsections. A thin AGENTS.md is not a talisman; the file has to actually encode the navigation, test-running, and constraint knowledge the agent lacks, which is exactly the gap the rejection taxonomy points at.

If instruction files are a wash on merge rate, what about the code that does land? A causal mining study from the University of Southern Denmark (Larsen and Moghaddam) gives the most careful answer I’ve seen. They mined 151 Java repositories, 74 with detectable agentic adoption (CLAUDE.md, .cursorrules, Co-Authored-By trailers) against 77 propensity-matched controls, 1,811 monthly Arcan snapshots, and ran a staggered difference-in-differences with the Borusyak estimator. The naive result looks like good news: architectural smell density drops 6.7% after adoption. The decomposition kills that reading. Raw smell counts are flat (+1.1%, p=0.82) while lines of code grow 12.8% (p=0.003), so the density decline is a denominator artifact, not cleaner architecture. AI-adopting repos pour in more code at roughly the same structural quality per feature. The methodological warning generalizes to any per-KLOC metric under a treatment that changes KLOC: report raw counts or you will write the wrong headline. Notably this contradicts the prior code-level finding (He et al.’s Cursor study, +30% warnings, +41% complexity), which the authors reconcile as AI writing messier code inside modules while respecting the boundaries between them.

The retrieval side had a quietly useful week too. G-Long attacks long-term dialogue memory with a fine-tuned small language model that extracts triples for a memory graph, plus an attention-aware importance score lifted from a T5 summarizer’s cross-attention to decide which memories are salient. The pitch is cost: do the extraction and retrieval with an sLM instead of paying a frontier model per turn, and still post up to +9.8% response quality on MSC and +40.8% retrieval recall on LME. It lands in the same place as a lot of recent memory work, that a lean structured store beats either dumping raw history or running an expensive summarizer on every query.

The sharpest evaluation result comes from an e-commerce search paper, Iterating Toward Better Search, which built a two-agent harness: a buyer agent with personas and patience levels paired against swappable responder architectures hitting a real search API, 2,011 conversations across 14 persona buckets with the buyer held constant for controlled comparison. Three findings worth stealing. Rolling-window memory beat intent-extraction memory on every quality metric while running 35% faster per query, another point for keeping recent raw context over eagerly compressing it. Swapping the responder backbone from Gemini 2.5 to Llama 3.3 70B cost only 0.16 to 0.45 points on identical architecture, so the scaffold mattered more than the model. And the warning for anyone running an LLM-as-judge eval: given the same rubric, Gemini and Claude systematically disagreed, with Gemini rewarding process correctness and Claude demanding concrete outcomes. Your judge has a personality, and it leaks into your scores.

For the production angle on all this memory churn, a practitioner walkthrough comparing Letta, Mem0, Graphiti, and Cognee made the rounds, mapping where each sits on the spectrum from flat vector stores to full knowledge graphs. Worth reading next to the academic results, because the research keeps converging on structure and small extractors while most shipped memory is still a similarity search.

What I’m watching: whether anyone closes the loop the AIDev papers leave open. The rejection taxonomy says agents fail on approach, validation, and priority; the instructions study says files help only when they’re long and structured. The obvious experiment is to compile a rejection taxonomy directly into an instruction template and measure merge rate against a control. Nobody’s run it yet.

Transcript

Read transcript 10 min · 1,649 words

Here’s a number to start with. 4% of BugFix pull requests opened by Copilot Devin, Cursor, and Claude end up rejected. Nearly half. That’s from a new study coming to the Mining Software Repositories Conference next year, out of a cold to technology superior in Montreal.

And the reason I want to spend time on it is not the headline percentage. It’s the autopsy underneath it, because the autopsy is more surprising than the number. The authors took a representative sample of 306 pull requests that were closed without being merged, and they read every one of them by hand. The discussion threads, the CI results, the comments.

Then they sorted the rejections into 14 reasons grouped under four headings. Now, if you’d asked me beforehand why agent fixes get rejected, I would have guessed. The code was wrong, the tests failed, the approach was bad, and those are in there. But the single most common reason at 17% is just inactivity.

The pull requests sat there untouched until a bot closed it for being stale. Nobody rejected it on the merits, it just rotted. Another 6% were superseded, meaning a human got impatient and wrote their own competing fix that landed first. So almost a quarter of these rejections aren’t about code quality at all.

They’re about the agent producing something that nobody ever engaged with, or engaged with too slowly. After that you get into the failures you’d expect. 5%. 5%.

CI and test failures, 7%. And then a category I found genuinely striking, the agent just failing, becoming unreachable, the session dying mid-task, producing no commits at all. One example in the paper is a Devin run where the message literally reads, Devin is currently unreachable, the session may have died, let’s just close this one. 5% of all the rejections.

The agent didn’t write bad code, it evaporated. Here’s the cost angle that makes this matter. These rejected fixes aren’t tiny. The median code churn runs between 81 and 293 lines, so every one of them required a human to read a real diff before deciding to throw it away.

The authors point out that almost half of all the review comments in the entire dataset land on pull requests that never merge. That’s the hidden tax on agentic contribution. It’s not just wasted tokens and compute on the agent’s side. It’s wasted human attention on the review side, which is the scarcer resource.

So the obvious question is, can you fix this with guidance? Can you write the agent a better instruction file and get a better merge rate? And the same research group published a companion paper the very same day asking exactly that. It’s called Toward Instructions as Code.

They looked at over 15,000 agentic pull requests across 148 projects, and for each project they compared the merge rate, the code churn, and the time to merge before and after that project added an instruction file. md, that kind of thing. And the result is humbling. Adding instructions is basically a coin flip.

35% dropped by at least that much. It almost perfectly cancels, writing an instruction file does not, on average, make your agent better at getting code merged. But there’s a signal in the noise, and it’s the part worth remembering. The projects that improved had substantially longer instruction files, broken into more sections and subsections.

md does nothing. The file only helps when it actually encodes the stuff the agent is missing. How to navigate the project, how to run the tests, what approaches are off-limits. Which, if you go back to the rejection taxonomy, from the first paper, is exactly the gap.

The agents fail on approach, on validation, on knowing what not to do. A real instruction file can close that. A token one can’t. So the two papers fit together.

Here’s why they fail, and here’s the partial, conditional fix. Now let me turn to the code that actually does land, because there’s a third paper this week that asks a different question. Not whether the PR merges, but whether the architecture rots underneath you when you adopt these tools. This one’s a little bit more complicated, but it’s a causal study from the University of Southern Denmark, and it’s the most careful version of this analysis I’ve seen.

They mined 151 Java repositories. md files, cursor rules, co-authored by trailers in the commit history. And they matched those against 77 control repositories that looked similar but had no AI markers. 1800 monthly snapshots, a proper staggered difference-in-differences design.

And the first result looks like great news for the AI tools. Architectural smell density, which is their measure of structural rot per thousand lines of code, drops almost 7% after a project adopts agentic tooling. You could write the headline, AI tools improve your architecture, and it would be wrong, because when they decompose it, the raw count of architectural smells is completely flat, plus 1%, not significant. What actually changed is the denominator.

Lines of code grew almost 13%, so the density went down purely because the code base got bigger at the same structural quality, not because anything got cleaner. The agents poured in more code at roughly the same architecture per feature. The improvement is a mirage created by dividing by a bigger number. I love this finding because it’s a methodological lesson that generalizes way past this one paper.

Anytime you measure something per thousand lines of code, defects per kLOC, or a number of lines of code, you can measure something per thousand lines of code. And you can measure something per thousand lines of code, defects per kLOC, or a number of lines of code, and you can measure something per thousand lines of code, and you can measure something per thousand lines of code, vulnerabilities per kLOC, churn per kLOC, and your treatment changes how much code people write, the ratio will lie to you. You have to report the raw counts. Otherwise you’ll announce an improvement that’s just a volume effect.

And it’s worth noting this actually contradicts an earlier code-level study on Cursor that found 30% more warnings and 41% more complexity. The Denmark authors reconcile it nicely. The AI may write messier code inside a module while still respecting the complexity of the code, while still respecting the boundaries between modules. Code-level mess and architecture-level mess are not the same thing.

Let me shift to memory and retrieval, because that side had a good week too. There’s a paper called Geelong that goes after long-term dialogue memory, and the angle is cost. Instead of paying a frontier model to manage memory on every single turn, they fine-tune a small language model to extract triples for a memory graph, and they add a clever importance score that reuses the cross-attention signals from a T5 summer riser to decide which memories actually matter. The payoff is up to nearly 10% better response quality on one benchmark and over 40% better retrieval recall on another, all while being dramatically cheaper to run.

And it lands in the same place a lot of recent memory work has landed. A lean, structured store beats both extremes. Beats dumping your whole raw history into context and beats running an expensive summer riser over everything every time you need to recall something. But the result I’d actually steal from my own work comes from an unlikely place, an e-commerce search paper called Iterating Toward Better Search.

They built a two-agent evaluation harness. One agent plays the buyer, configured with different personas and different patience levels, and it talks to a swappable responder architecture that hits a real-product search API. They held the buyer constant so they could compare responder designs on identical scenarios. 2,000 conversations, 14 persona buckets, and 3,000 questions.

4,000 questions, 14 personas, and 3,000 results. buckets, and three findings come out that apply far beyond shopping. First, rolling window memory beat intent extraction memory on every quality metric, and ran 35% faster per query. That’s now the third or fourth result this month pointing the same direction, keeping recent raw context often beats eagerly compressing it into extracted intent.

370b, the quality only moved by a fraction of a point on identical architecture. The scaffold mattered more than the model, and third the one that should make every eval engineer nervous, given the exact same scoring rubric Gemini and Claude systematically disagreed as judges. Gemini rewarded process correctness did the assistant follow good steps, Claude demanded concrete outcomes did the user actually get what they wanted, same prompt different values. Your LLM judge has a personality and it leaks straight into your numbers.

If you’re running one judge model and treating its scores as ground truth, you’re measuring that model’s temperament as much as your system’s quality. And to ground all of this, there was a practitioner write up making the rounds comparing the production memory systems people actually ship with, Letta, Mem0, Graffiti, and Cogni, mapping where each one sits from flat vector stores up to full knowledge graphs. It’s a good thing to read right next to the academic papers because the research keeps converging on structure and small items. So where does this leave us?

The thing I’m watching is whether anyone closes the loop these first two papers leave wide open. One paper hands you a taxonomy of exactly why agent fixes get rejected, the other tells you instruction files only help when they’re long and well structured. The experiment that writes itself is to take that rejection taxonomy, compile it directly into an instruction system. It’s the same template, the approach hints, the validation steps, the priority rules, and then measure merge rate against a control that didn’t get it.

Nobody has run that yet, when somebody does, that’s the number I want to see.

In this issue

← All digests