Suggestion acceptance rate is the metric every AI coding assistant team reaches for first, and it is quietly measuring the wrong thing: it rewards trivial, low-risk completions and punishes the ambitious multi-line suggestions that would actually save a developer time. The fix is a metric portfolio — acceptance rate paired with retention, edit-distance-after-accept, and trust surveys — plus explicit design for latency and for the moment your model is confidently wrong.
Quick Answer: Acceptance rate alone is a vanity metric for an ai coding assistant product — pair it with retention and edit-distance-after-accept to see real value, treat latency as a UX decision with its own tradeoff curve, and design a deliberate trust-recovery path for the inevitable wrong suggestion.
Why acceptance rate is the metric that lies to you
Acceptance rate answers "did the developer press Tab," not "did this make them faster or better," and those two things diverge in predictable, damaging ways. A model tuned to maximize acceptance learns to suggest the safest, smallest, most obvious completion — closing a bracket, finishing a variable name — because that's what gets accepted reflexively. Bold, correct, multi-line suggestions get rejected more often simply because they require the developer to actually read and evaluate them.
This is a classic Goodhart's Law failure: once acceptance rate becomes the target, it stops being a good measure of the underlying goal. GitHub's own public research on Copilot noted this tension directly — the company has repeatedly cautioned that acceptance rate should be read alongside retention and satisfaction signals, not in isolation, precisely because teams that over-optimized for it ended up with blander, less useful suggestions.
Three specific failure patterns show up when acceptance rate is the north star:
- Suggestion shrinkage. Models get tuned toward short, safe completions because they're accepted more reliably than long ones, even when the long ones would save more keystrokes.
- Survivorship blindness. You never see the suggestions a developer didn't wait for — if latency is bad, they've already typed past the point where the suggestion appeared, and that's recorded as a "rejection" indistinguishable from "the suggestion was bad."
- Context collapse. A suggestion accepted in isolation, then immediately gutted by the developer, counts as a full acceptance in most telemetry — the acceptance event fires before the edit happens.
A better metric portfolio
No single number captures whether an AI coding assistant is actually helping. Use a small set that checks each other.
| Metric | What it actually measures | Where it misleads alone |
|---|---|---|
Acceptance rate | Immediate Tab-press behavior | Rewards trivial completions, ignores downstream edits |
Edit-distance-after-accept | How much the developer rewrote what they accepted | High distance on a "high-value" suggestion may mean it was wrong, not just imperfect |
Retention / daily active use | Whether developers keep the feature enabled at all | Lagging indicator; slow to reflect a single bad release |
Time-to-first-keystroke after suggestion | Latency's real-world bite | Doesn't capture suggestion quality at all |
Trust survey score | Perceived reliability and willingness to depend on output | Self-reported, prone to recency bias after one bad incident |
Track edit-distance-after-accept the way you'd track a returns rate in e-commerce: a suggestion that gets accepted then rewritten within seconds is functionally a rejection wearing an acceptance's clothes. Pair it with retention, which is slower-moving but far harder to game — a developer who disables the assistant has voted with a much higher-stakes action than a keystroke.
This is the same discipline behind good developer experience (DX) metrics work more broadly: single proxy metrics (lines of code, commit counts) always get gamed or misread, and the fix is always a small, cross-checking portfolio rather than one number leadership can rally around.
The latency/quality tradeoff curve for inline suggestions
Inline code suggestions live or die on a latency budget measured in hundreds of milliseconds, not seconds — past roughly 200-300ms the developer has already resumed typing and the "correct" suggestion arrives too late to be seen, let alone used. This isn't a backend performance nice-to-have; it's a core product design constraint that trades directly against model quality.
Think of it as a curve, not a single number. At one end: a tiny, fast, low-quality model that responds instantly but suggests obvious or shallow completions. At the other: a large, slow, high-quality model that nails harder completions but arrives after the developer has already typed past the insertion point.
Where teams get the tradeoff wrong
- Chasing quality without a latency budget. A model upgrade that improves benchmark accuracy but adds 400ms of round-trip time can make the assistant feel worse even though it's smarter, because the interaction model (inline, in-flow) has zero tolerance for delay.
- Ignoring perceived latency separately from actual latency. A skeleton/ghost-text placeholder that appears instantly, even before the real suggestion resolves, measurably changes how "fast" an assistant feels — this is the same perceived-performance lever web teams have used for two decades (see the broader body of work on perceived performance popularized by engineers like Steve Souders at Yahoo and later Google).
- Treating all suggestion types identically. A single-line completion and a multi-file refactor suggestion have wildly different acceptable latencies; bundling them under one latency SLA forces a bad compromise on both.
A practical latency tiering model
Rather than one latency target, tier suggestion types by how much delay the interaction context can absorb:
| Suggestion type | Interaction context | Acceptable latency | Design lever if you're slower |
|---|---|---|---|
| Inline next-token / line completion | Continuous typing flow | ~100-250ms | Smaller local model, aggressive caching |
| Multi-line block completion | Pause after a comment or signature | ~300-800ms | Streaming partial results, ghost text |
| Chat-based Q&A | Explicit request, attention already shifted | 1-3s tolerable | Progress indicators, partial streaming |
| Whole-file / multi-file refactor | Explicit async action | 5-30s+ tolerable | Background job with notification, diff review UI |
The lever that matters most: match the interaction model to the latency budget you can actually hit, rather than trying to force one model size to serve every tier. Fast, shallow suggestions inline; slower, deeper suggestions moved to an explicit, asynchronous action where the developer has already mentally context-switched to "waiting is fine."
Trust is fragile: a recovery model for when the assistant is wrong
Trust in an AI coding assistant is asymmetric — it accrues slowly across many small correct suggestions and collapses fast after one confidently wrong one, especially if that wrong suggestion looked plausible enough to slip past review. Product design has to actively manage this asymmetry rather than assume trust is a static property of model accuracy.
This mirrors automation-trust research going back decades in human factors: Parasuraman and Riley's foundational work on automation reliance describes exactly this pattern — trust that builds gradually through reliable use and drops sharply after a salient failure, often overshooting into disuse even when the automation's average reliability hasn't changed. An AI coding assistant is automation, and it inherits this dynamic wholesale.
The two failure modes that break trust fastest
- Hallucinated APIs. The model suggests a method, parameter, or package that doesn't exist — confidently formatted, syntactically plausible, and wrong. This is especially damaging because it often passes a cursory glance and fails at compile or runtime, sometimes much later than the suggestion was accepted.
- Confident-but-wrong refactors. A larger suggested change looks like an improvement (cleaner, more idiomatic) but silently alters behavior — dropping an edge-case check, changing error-handling semantics, or reordering side effects. These are worse than syntax errors because they don't fail loudly; they fail in production, weeks later.
A trust-recovery framework
Trust-recovery design has three phases, and most teams only build the first one.
- Prevention (reduce how often wrongness reaches the developer). Ground suggestions in the actual codebase and its real dependency versions rather than generic training-data patterns; surface confidence signals (e.g., "this API wasn't found in your installed packages") instead of presenting every suggestion with identical visual authority.
- Containment (make wrongness cheap to catch and undo). Diff-style review for anything beyond a trivial completion, so the developer evaluates a change rather than blindly accepting a black box; one-keystroke undo; inline citations or "why" explanations that let a developer sanity-check a suggestion before committing to it.
- Repair (rebuild trust after a visible failure). Acknowledge the miss where the developer will see it — a visible correction, not a silent patch — and give the developer a way to flag it that visibly changes future behavior for that pattern. Trust recovers when developers feel the system is legibly getting better, not just when it silently gets better.
The instinct after a bad refactor suggestion ships is to quietly improve the model. The higher-leverage move is to make the failure and the fix both visible to the developer who got burned — legible improvement rebuilds trust faster than invisible improvement.
Containment usually delivers the best return for the least effort: a good diff view and one-click revert doesn't require touching the model at all, and it directly reduces the blast radius of both hallucinated APIs and bad refactors. This is also where the economics of an AI feature meet its cost structure — every containment step (grounding lookups, confidence scoring) adds inference cost, which is its own consumption-pricing tradeoff a devtools PM has to reason about explicitly rather than bolt on as an afterthought.
Designing around an imperfect model, honestly
The product mitigation for an imperfect model isn't a fully solved model — it's an interface that makes the model's uncertainty visible and cheap to act on, which is a design problem, not a research problem. Teams that wait for "the model to get better" before shipping trust-preserving UX are solving the wrong layer.
Concrete mitigations that don't require a model change:
- Confidence-differentiated presentation. Not every suggestion deserves the same visual weight; a low-confidence multi-line refactor styled identically to a high-confidence one-line completion sets the wrong expectation.
- Grounding against the real environment. Checking a suggested import or API call against the project's actual installed dependencies before surfacing it catches a large share of hallucinated-API failures before the developer ever sees them.
- Explicit scope boundaries. Being honest in-product about what the assistant is good at (boilerplate, common patterns) versus weak at (novel business logic, security-sensitive code) sets calibrated expectations instead of implying uniform competence.
- Fast, cheap undo over prevention. Since you can't catch every wrong suggestion before it ships, invest as much in making a wrong one fast to reverse as in trying to stop it from ever appearing.
Understanding which developer is being let down by a given failure mode also matters — a senior engineer skimming a diff and a junior engineer trusting the tool by default have different failure tolerances, which is really a jobs-to-be-done question about what the developer actually hired the assistant to do in that moment.
This is also where pressure-testing a feature before it ships earns its keep. Prodinja's prototype includes an Evals workspace and an Agentic-Workflows critique layer that are designed to walk a team through stress-testing an AI feature's context and likely failure modes — the hallucinated-API and confident-wrong-refactor patterns above are exactly the kind of thing that structured pre-ship critique is meant to surface before real developers hit them.
Shipping and measuring the feature over time
An AI coding assistant is never "done" — the model, the codebase it's grounded in, and developer expectations all keep moving, so the metric portfolio and trust-recovery mechanisms above need to run continuously, not just at launch. Treat the first ship as the start of an ongoing measurement loop, not a one-time validation gate.
Build the loop around three recurring checkpoints:
- Weekly: acceptance rate and edit-distance-after-accept, segmented by suggestion type and latency tier, to catch regressions fast.
- Monthly: retention and a short trust survey, to catch the slower-moving signal that a string of small annoyances is quietly eroding confidence.
- Per-incident: any hallucinated-API or bad-refactor report gets logged against the trust-recovery framework — was it prevented, contained, or repaired, and how fast.
Mapping this against the developer's full customer journey — first suggestion, first accepted multi-line block, first bad suggestion, first recovery — surfaces where trust is actually won or lost, rather than treating the relationship as a single flat satisfaction score. For teams building this inside a broader devtools business, the same discipline of connecting product metrics to what actually retains developers runs through the devtools industry more broadly, and an AI coding assistant is simply the sharpest current instance of that pattern.
Key Takeaways
- Acceptance rate alone is a vanity metric — it rewards trivial completions and can actively push a model toward blander, less useful suggestions if over-optimized.
- Pair acceptance rate with edit-distance-after-accept, retention, and trust surveys so a "yes" from telemetry actually means the developer was helped, not just that they pressed Tab.
- Latency is not a backend detail — it's a UX tradeoff curve. Tier suggestion types (inline, block, chat, refactor) with their own latency budgets rather than forcing one model size to serve all of them.
- Trust is asymmetric: it builds slowly through many small correct suggestions and collapses fast after one confidently wrong one, echoing decades of human-factors research on automation reliance.
- Design for prevention, containment, and repair — grounding suggestions in the real codebase, fast diff-based undo, and visible acknowledgment of mistakes matter more than chasing a perfect model.
- Hallucinated APIs and confident-but-wrong refactors are the two failure modes that do the most trust damage because they look plausible enough to pass a quick glance.
- Pressure-test failure modes before shipping, using structured critique of context and edge cases rather than assuming the model will behave in production the way it did in a demo.
Frequently Asked Questions
What is a good acceptance rate for an AI coding assistant?
There is no single healthy number, because acceptance rate rewards short, safe completions and can be pushed arbitrarily high by making an assistant blander. Read it only alongside edit-distance-after-accept and retention — a rising acceptance rate with rising post-accept edits is a warning sign, not a win.
Why does my AI coding assistant feel slow even though the model is fast?
Perceived latency and actual latency are different things, and inline suggestions have almost zero tolerance for delay — past roughly 200-300ms a developer has typically resumed typing past the insertion point. Ghost-text placeholders and tiered model sizing by suggestion type usually fix "feels slow" faster than further optimizing the model itself.
How do you rebuild developer trust after a bad AI suggestion?
Trust recovers fastest when the failure and the fix are both visible to the developer who experienced it, not silently patched behind the scenes. Combine a fast, easy undo path with an explicit acknowledgment that the specific failure pattern is being addressed.
What causes AI coding assistants to hallucinate APIs?
Hallucinated APIs typically happen when a model generalizes from common patterns in its training data rather than grounding suggestions in the actual dependency versions installed in the current project. Checking suggested imports and method calls against the real project environment before surfacing them catches a large share of these before a developer ever sees them.
Is it worth building an AI pair programmer strategy around a single large model?
Usually not for every suggestion type — a single large model optimized for quality tends to violate the latency budget that inline, in-flow suggestions require. Most mature ai pair programmer strategies use smaller, faster models for inline completions and reserve larger models for explicit, asynchronous actions like multi-file refactors where developers already expect to wait.