A foolish consistency is the hobgoblin of little minds.
— Ralph Waldo Emerson
Consistency is one of those ideas that is treated as a virtue without much argument. Design systems preach it. Engineering orgs enforce it. Personal habits optimise for it. And to be fair, most of the time, consistency is exactly what the situation calls for — it reduces cognitive load, it lowers the coordination tax on a team, it makes products easier to learn.
But there is a point, usually further along than you expect, where consistency stops paying for itself. The dues you have been paying into the "just make it match what we already have" fund start to exceed the returns. When that happens, you have a harder problem than most teams know how to name: you have a consistency debt.
This post is about recognising that moment, and about deciding when to break a pattern on purpose.
Consistency as Compression
The strongest argument for consistency is also the least romantic: it compresses decisions. If your buttons are always the same shade of blue, nobody has to think about buttons. If your endpoints always return data in the same shape, nobody has to think about endpoints. If your meetings always start at five minutes past the hour, nobody has to think about when to show up.
This is enormously valuable, because the scarce resource in most organisations is not time or money, it is attention. Every decision that consistency handles automatically is a decision that does not need to travel through a human brain. Over a year, across a team of fifty, that compounds into real productivity.
The trap is assuming this benefit is unlimited. It isn't. Consistency compresses decisions that are already correct. When the underlying pattern stops being the right pattern — because the user base changed, or the product scope grew, or the world moved on — consistency turns into a force that protects the wrong answer from being questioned.
The Signal of a Dying Pattern
Patterns die slowly, and they die quietly. The signal you are looking for is this: people stop asking whether the pattern is right, and start asking how to work around it.
You hear it in code review. "I know our convention is X, but for this case I'm going to do Y." You hear it in design. "Technically this should use our standard modal, but the content doesn't fit." You hear it in product. "We always ship behind a feature flag, but this one is too small to bother with."
Once every third exception starts sounding reasonable, the pattern has died. It just hasn't been buried yet. And the longer you leave a dead pattern in the ground, the more exceptions accumulate, and the more your consistency starts to look like a fiction — a rule everyone is officially following while quietly routing around it.
The healthy response is to bury the pattern and write a new one. The unhealthy response — which is much more common — is to aggressively enforce the dead pattern, adding process to catch the workarounds, until the cost of compliance exceeds the cost of the inconsistency you were trying to prevent.
When Breaking Is Correct
The case for breaking consistency is almost always the same: the new situation is not the situation the pattern was designed for. Patterns are optimal for the set of cases they were built around, and approximately right for everything else. As the "everything else" gets larger, the approximation gets worse.
A good test: can you describe, specifically, what the pattern was solving for when it was introduced? If you can, and the new case does not share those properties, you are almost certainly justified in breaking it. If you cannot — if the pattern has become "we've always done it this way" — that is worth noting, because the pattern has already outlived its original reasoning.
Breaking consistency is not the same as abandoning it. The best teams I have seen are extremely consistent within a pattern's valid domain, and extremely willing to introduce a new pattern when they hit something the old one can't handle. The failure mode is teams that treat every exception as a personal offence and try to stretch an old pattern over new terrain until the pattern deforms into uselessness.
The Cost of Holding On
The reason teams hold on to dead patterns is not usually belief in the pattern. It is the cost of the transition. Introducing a new pattern means auditing the old one, deciding what to migrate, updating the docs, re-training the team, and managing a period where both patterns coexist. This is expensive, and the expense is upfront and visible, while the cost of keeping the dead pattern is gradual and invisible.
This is a classic framing error. The visible short-term cost is compared against the invisible long-term cost, and the invisible one always loses. The team stays consistent, the documentation stays pristine, and the actual product slowly calcifies as every new feature has to negotiate with infrastructure that was designed for a product two versions back.
The antidote is to make the invisible cost visible. Count the exceptions. Track how often the team debates whether the pattern applies. Notice how often new hires ask "why do we do it this way?" — and how often the answer starts with "historically…" Those are the receipts. If you can line them up, the decision to evolve the pattern stops feeling radical and starts feeling overdue.
Designing for Exception
A related skill, maybe the most useful one I have picked up on this topic, is designing patterns with their own expiration dates built in.
A pattern that is honest about its scope — "this applies to transactional forms of fewer than eight fields, and we will need a different pattern for anything larger" — is a pattern that ages gracefully. It creates a built-in signal for when to question itself. It invites teams to propose new patterns rather than stretching the existing one. It treats consistency as a local optimum rather than a universal truth.
Patterns that refuse to name their own scope — "this is how we do forms, period" — are the ones that generate the deepest consistency debt. They succeed while the world is narrow, and they become a liability the moment the world isn't.
If I could convince design and engineering leaders of one thing, it would be this: the most valuable document your team can produce is not the pattern itself, it is the paragraph at the top of the pattern that says where it applies, and implicitly, where it does not. That paragraph is what keeps the consistency alive.
Footnotes
Don Norman's The Design of Everyday Things is old enough to be dismissed and good enough not to be. The chapter on conventions is the clearest account of this trade-off I have read.
Kent Beck's tidy first writing, especially on structural vs behavioural change, helped me think about when to evolve a pattern versus work within it.
Bret Victor's Learnable Programming is not about this topic directly, but his framing of "the environment shapes the thought" applies: an outdated pattern shapes the product toward outdated answers.
The ADR (architectural decision record) format is a practical way to give patterns a stated scope and an explicit expiration signal. Even a short ADR beats no ADR.
Will Larson's Staff Engineer has a section on "writing an engineering strategy" that implicitly addresses when to break from convention for the good of the broader system.