An AI coding tool has no concept of which database belongs to which team. It sees an import statement, not a contract, so the fastest path to a green build is often the one that quietly connects two services that were never supposed to touch.
The Details:
Architectural boundaries are social facts, agreements about who owns what, not physical constraints in the code. A compiler enforces syntax; it does not enforce the difference between a legitimate call and a shortcut through someone else's data layer. Without a mechanism that can actually block the shortcut, the AI takes it every time deadline pressure meets a passing test suite.
Better prompting does not fix this because instructions describe a rule without making it load-bearing. Telling a model "do not access the billing service's database directly" is advice it can weigh against convenience. A CI check that fails the build on a forbidden import is not advice, it is a wall, and walls are what actually change behavior.
Enforcement only sticks when the correct path is also the easy path. Blocking direct database access without shipping a fast, simple RPC client just makes engineers request exceptions, and the exception list eventually swallows the rule. The fix and the paved alternative need to land in the same sprint, not the same quarter.
Drift is measurable before it becomes a postmortem. Track the count of exceptions and waivers granted against a boundary; a rising count means the rule is decorative. The earliest and most reliable signal, though, is verbal: someone saying "I'll just read from their table" in standup is the warning that arrives before any dashboard moves.
Bottom Line: AI tools did not invent architectural drift, they just made it cheap enough to ship by lunchtime, so the only thing that holds a distributed system together is enforcement, not intention.
Enjoy this article?
Listen to the Claude Code Conversations radio show or join the community.