🎤 Speaking at KubeCon EU 2026 Lessons Learned Orchestrating Multi-Tenant GPUs on OpenShift AI View Session
Luca Berton
Platform Engineering

Copilot is great — until you do real-world programming

Luca Berton
#ai#copilot#programming#rate-limiting#reliability#authentication#typescript#react#devops#platform-engineering

I love AI coding assistants.

They’re incredible at the 80%: scaffolding components, refactoring repetitive code, generating boilerplate, translating intent into TypeScript, and generally compressing time between “idea” and “PR”.

But building a real product isn’t the same thing as writing code quickly.

Real-world programming is the part nobody demos:

And that’s exactly where copilots start to feel… insufficient.

This post is a short incident report from ProteinLens:

I got rate-limited by my AI coding assistant while implementing rate limiting.

Yes, really.


The setup: boring auth polish tasks

I’m going through a set of “auth UX polish” tasks:

Nothing flashy. Everything important.

T051: loading states

I checked the main auth pages:

So far so good. The “boring” work was mostly already done.

T052: validation feedback

Also already implemented ✅
Nice.

Then I hit the one task that always matters when your app is public:

T053: rate limiting error handling (429)


The problem: the frontend didn’t understand rate limits

I searched the frontend for anything resembling rate-limit handling:

Nothing.

The auth service had a generic handleResponse() that treated all non-200 responses as “some error”.

That’s not enough.

A 429 is not “something broke”. A 429 is “you’re fine, just not right now”.

That difference matters because it changes UX:

So I updated the auth service to throw a dedicated error type on 429 (e.g. RateLimitError), then started wiring it into the SignIn UI.

Simple change. Small diff. Quick win.


The incident: a 429 while implementing 429 handling

I was mid-edit in SignIn.tsx, adding a specific branch:

And then my AI coding assistant returned:

Server Error: exceeded token usage
Error Code: rate_limited

I got rate-limited while implementing rate limiting.

It was funny for about 3 seconds.

Then it was annoying for 20 minutes.

And then it became the point of this article.


What this revealed: copilots accelerate typing, not systems thinking

Copilot-style tools are great when:

They struggle when the work shifts from code to reality.

1) Tooling has quotas, budgets, and failure modes

Your coding assistant can throttle you. Your cloud can throttle you. Your identity provider can throttle you. Your email provider can throttle you.

And none of those failures are “bugs” in your code.

They’re constraints.

Real-world programming is building with constraints.

2) The hardest problems are state + integration problems

The most time-consuming failures are rarely syntax or logic errors. They’re cross-layer, cross-system inconsistencies:

Copilots are good at writing code that looks right. They’re weaker at ensuring the system is right.

3) “Generic error handling” is not a product

AI assistants often default to generic patterns:

But auth flows need bespoke UX for a small set of predictable errors:

If you treat all errors the same, you ship confusion.

And confusion is a conversion killer.

4) The assistant can’t own the system

A copilot can propose code. It can’t be accountable for:

When the assistant disappears mid-flow, you still need a plan.

That’s the difference between “coding” and “engineering”.


The fix: ship 429 handling as a first-class UX path

Here’s what “good” rate-limit handling looks like in an auth UI:

Example copy I like:

“You’re doing that a bit too fast. Please wait a moment and try again.”

If you want to be extra clean:


The workflow fix: treat the copilot like a dependency that can fail

The surprising lesson wasn’t about rate limiting.

It was about developer flow.

When your assistant is part of your “shipping engine”, you need resilience in your process too.

What I do now:

Ironically, the copilot 429 helped me adopt the same mindset I want in production:

assume dependencies fail.


Checklist: production-grade rate limiting in auth flows

If you’re implementing login/signup/reset, this is my baseline:

Bonus points:


“Am I too much pro?”

No.

You’re not “too pro” for wanting this.

If anything, this is what makes the difference between:

Rate limiting, failure UX, and dependency constraints are not advanced topics. They’re the ground floor of reliability.

Copilots make you faster at writing code.

They don’t remove the need for engineering judgment.

And sometimes, they prove that point by rate-limiting you while you’re implementing rate limiting.

Perfect.

← Back to Blog