Each AI coding session invents its own small universe of naming and formatting choices, and nothing forces two sessions to agree. That mismatch, not bad logic, is what collapses systems built from AI-generated pieces.
The Details:
A model generating stage one of a pipeline has no memory of stage two, so it picks field names, date formats, and error shapes that feel locally sensible. Snake_case versus camelCase, epoch seconds versus ISO strings: both choices are defensible, and the model commits to one with total confidence and zero hedging. That confidence is exactly what hides the seam until something downstream reads the wrong value.
Code review cannot catch this because it checks whether a module is correct on its own terms, not whether its assumptions match the module next to it. A function can be clean, tested, and idiomatic while quietly disagreeing with its neighbor about what a field means. Unit tests share the same blind spot, since the same session often wrote the code and the test together.
The dangerous failures are silent, not loud. Mismatched names throw errors; mismatched units or mismatched meaning do not. Milliseconds read as seconds, or two services agreeing on a schema while one treats email as identity and the other treats id as identity, produce no crash, just slowly wrong numbers on a dashboard nobody is watching.
The fix is treating the contract as an input to generation, not an output of it: a version-controlled schema file, a shared fixture with real data, and contract tests that feed stage one's actual output into stage two's actual input. A one-line comment stating what each field means, like units and sign conventions, closes the gap that type systems cannot see.
Bottom Line: The code itself is cheap to regenerate; the agreement between pieces of code is not, and skipping that agreement is what turns fast AI output into slow production incidents.
Enjoy this article?
Listen to the Claude Code Conversations radio show or join the community.