Skip to content

02 · Working with AI agents in a real codebase

What happens at month three

The point where AI-assisted work stops feeling fast. What accumulates, why it is invisible at first, and which parts are structural rather than a failure of discipline.

6 min read

There is a specific and widely shared experience in AI-assisted development: two months of the best velocity of your career, followed by a month where the same work stops feeling like that. Nothing announces the transition. It is worth understanding what is happening, because the usual explanations are wrong and the usual advice is useless.

The early speed is real

First, the part that gets patronised. The speed is not an illusion and it is not technical debt in disguise. Work that used to take a week takes an afternoon. Features that were never going to get built get built. The agent handles the tedious 80% and leaves you the interesting part.

People who tell you this is unsustainable are usually generalising from having never done it. Plenty of software shipped this way is fine. The productivity is measured, widely reported, and not in serious dispute.

What changes at month three is not that the speed was fake. It is that the repository has accumulated something it has no mechanism for shedding, and the accumulation has started charging rent.

What month three actually feels like

It does not feel like a wall. It feels like friction that you cannot locate.

The agent starts making choices you have to correct — not wrong exactly, just not what this codebase does. You find yourself explaining the same constraint for the fourth time in a fortnight, in a different session, because sessions do not remember. A feature that should be additive breaks something in a module you have not opened in six weeks. You go looking for why a thing was built the way it was and find three documents that disagree, all of which you wrote.

And the correction loop gets longer. The agent produces something plausible, you review it, it is subtly off, you explain, it produces something else plausible. Each round is fast. The total is not.

The reasonable-sounding diagnosis is that you moved too fast. That diagnosis is wrong, and acting on it — slowing down — does not fix anything, because the friction is coming from what is in the repository, not from the rate at which you added it.

What has accumulated

Four things, none of which anyone chose.

  • Duplicated blocks instead of reuse. An agent asked to add a feature that resembles an existing one will generally produce a new near-copy rather than extract a shared abstraction. Copying is local, safe, and immediately correct; extracting requires understanding every existing call site. Each individual copy is defensible. Forty of them is a codebase where every change has to be made in several places.
  • Superseded plans nobody deleted. Every planning document, every scoped approach, every half-finished migration note is still sitting there, still confidently written, still indistinguishable from the plans that were actually followed.
  • Instruction files that disagree. You added an AGENTS.md, then a CLAUDE.md, then some Cursor rules. Each was accurate when written. You have updated one of them since.
  • Decisions nobody can locate. The reason you use one library over another lives in a chat log. The reason a module cannot be touched lives in your memory. Neither is in the repository, so neither is available to the agent that starts fresh every session.

Why month three and not month one

The timing is not arbitrary, and understanding it makes the problem less mysterious.

In the first weeks, everything you built is recent. You remember every decision because you made all of them, days ago. The repository is small enough that you can hold its shape in your head. There are no superseded plans because nothing has been superseded yet. There is one instruction file and it is accurate. The agent's fresh-session amnesia costs you almost nothing, because you personally supply the missing context in the prompt without ever noticing you are doing it.

What changes is not the code volume so much as the memory horizon. Around eight to twelve weeks, work you did early starts falling out of recall. You begin encountering your own code as an outsider would. At that point the repository has to answer questions that you used to answer, and it turns out it was never asked to before.

The second thing that arrives on roughly the same schedule is interaction. Early features are mostly independent — new surface area, few connections. By month three, new work is touching things built earlier, and touching them requires knowing why they are the way they are. That knowledge was never written down, because at the time it was too obvious to record.

So the transition is not a threshold of accumulated mess. It is the point where your own memory stops covering the gap between what the repository contains and what it means.

The measured version

This is not anecdote. GitClear's analysis of 623 million changed lines tracks exactly this pattern:

  • Block duplication is up 81% since 2023 — the highest on record.
  • Refactoring line moves are down 70% versus 2022.
  • Copy/paste rose from 9.4% of changes in 2022 to 15.7% in the first half of 2026.
  • Copy/paste is now roughly 5 times more prevalent than refactoring, reversing a pre-AI preference that ran about 2 to 1 the other way.

The direction of that reversal is the important part. Refactoring is the mechanism by which a codebase sheds accumulated duplication. Industry-wide, that mechanism has weakened by most of its former strength at the same time as the rate of code production has climbed. More arriving, less consolidation.

The trust numbers say the same thing from the other side

The 2025 Stack Overflow developer survey captures the experience rather than the artefact:

  • 84% adoption — near-universal.
  • 29% trust the output, with 46% actively distrusting it.
  • The top frustration, cited by 66%, is output that is "almost right, but not quite".
  • 45% report losing significant time debugging AI-generated code.

Near-universal adoption with a minority trusting the results is not a contradiction; it is what month three looks like at population scale. And "almost right, but not quite" is precisely the failure signature of an agent working from a repository that does not tell it which of its own documents to believe. The code is syntactically fine and locally sensible. It is wrong about this project specifically — which is the only thing the repository was supposed to convey.

This is structural, not a discipline failure

Every mechanism that used to shed this accumulation depended on a human carrying context between sessions. You refactored because you remembered writing the near-duplicate. You deleted the stale plan because you remembered it was stale. You did not need a decision log because you were the decision log.

Agents do not carry context between sessions, and at high throughput neither, really, do you. The repository is now the only thing that persists — and repositories were never designed to record standing, only implementation. The gap is architectural. It was always there; it was just covered by human memory, and human memory does not scale with output.

Which is why "be more disciplined" is not a fix. It is asking a person to hold an invariant by hand at a rate the tooling is deliberately increasing. Every other invariant that survives in software is held by a mechanism.

What actually helps

Not slowing down. The useful move is to make the repository carry the standing that used to live in your head, and to have something fail loudly when that structure breaks.

Concretely: one governed place where decisions, current state, and constraints live, with each document declaring what kind of statement it is and when it was last confirmed. Superseded material marked rather than deleted. One source that the instruction files for every agent tool point at, instead of four files drifting apart. And a check in CI that fails when the structure decays — versioned names, missing indexes, references to things that were renamed.

That is what Codee3 installs: the governed .ai/ layer, the routing to the agent tools you already use, and zero-dependency guards that fail the build on structural breakage. It does not write your knowledge and it cannot tell you whether what you wrote is still true. What it does is stop the layer you rely on from quietly falling apart while you are busy shipping — which is the actual mechanism behind month three.