Structure.
An AI assistant wraps code in extra functions, classes, or interfaces that add a layer of indirection without hiding any complexity or enabling reuse — abstractions that merely forward to a single call site.
When writing new code, AI assistants tend to paste or re-derive a slightly tweaked copy of logic that already exists instead of calling or extracting a shared function, so duplicated code grows with every feature.
AI assistants rarely restructure existing code: they bolt new branches, flag parameters and wrapper layers onto what is already there, so functions and conditionals keep growing while refactoring — the rework that keeps a codebase healthy — quietly disappears.
The model hand-writes bespoke code for something a standard library, an existing dependency, or a helper already in the repo already does — adding duplicated, less-tested logic instead of calling what is already there.