<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Felix Asher </title>
    <description>The latest articles on DEV Community by Felix Asher  (@felix-asher).</description>
    <link>https://dev.to/felix-asher</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3695980%2Fbfe7074d-aa39-4943-b76e-e9772cdf0beb.png</url>
      <title>DEV Community: Felix Asher </title>
      <link>https://dev.to/felix-asher</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/felix-asher"/>
    <language>en</language>
    <item>
      <title>When Tests Keep Passing, but Design Stops Moving</title>
      <dc:creator>Felix Asher </dc:creator>
      <pubDate>Mon, 12 Jan 2026 12:48:25 +0000</pubDate>
      <link>https://dev.to/felix-asher/when-tests-keep-passing-but-design-stops-moving-19ik</link>
      <guid>https://dev.to/felix-asher/when-tests-keep-passing-but-design-stops-moving-19ik</guid>
      <description>&lt;p&gt;There’s a moment I keep running into when practicing TDD.&lt;/p&gt;

&lt;p&gt;Tests pass.&lt;br&gt;&lt;br&gt;
Coverage improves.&lt;br&gt;&lt;br&gt;
Refactoring feels safe.&lt;/p&gt;

&lt;p&gt;And yet, at some point, the design just… stops moving.&lt;/p&gt;

&lt;p&gt;Not because the system is finished.&lt;br&gt;&lt;br&gt;
Not because the problem is solved.&lt;/p&gt;

&lt;p&gt;But because the tests no longer seem to &lt;em&gt;challenge&lt;/em&gt; anything.&lt;/p&gt;

&lt;p&gt;They keep confirming decisions that already feel locked in.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stall Is Quiet
&lt;/h2&gt;

&lt;p&gt;This stall is subtle.&lt;/p&gt;

&lt;p&gt;Nothing is obviously wrong.&lt;br&gt;
CI is green.&lt;br&gt;
The codebase looks “healthy.”&lt;/p&gt;

&lt;p&gt;But learning has slowed to a crawl.&lt;/p&gt;

&lt;p&gt;Every new test feels inevitable.&lt;br&gt;
Every refactor feels local.&lt;br&gt;
No assumption feels truly at risk anymore.&lt;/p&gt;

&lt;p&gt;The system still changes — but only within boundaries that were set long ago.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Tests Stop Reducing Doubt
&lt;/h2&gt;

&lt;p&gt;I don’t think this happens because we write tests incorrectly.&lt;/p&gt;

&lt;p&gt;It happens when tests quietly shift roles.&lt;/p&gt;

&lt;p&gt;At first, tests are exploratory.&lt;br&gt;
They surface uncertainty.&lt;br&gt;
They force us to articulate expectations we’re not sure about yet.&lt;/p&gt;

&lt;p&gt;But over time, many tests become something else:&lt;br&gt;
a correctness check for decisions that are no longer questioned.&lt;/p&gt;

&lt;p&gt;When that happens, a green test doesn’t reduce doubt anymore.&lt;br&gt;
It just confirms structure.&lt;/p&gt;

&lt;p&gt;The feedback loop is still running —&lt;br&gt;
but it’s no longer teaching us anything new.&lt;/p&gt;




&lt;h2&gt;
  
  
  Assumptions That Settle Too Early
&lt;/h2&gt;

&lt;p&gt;Looking back, what surprised me wasn’t that the design stalled,&lt;br&gt;
but &lt;em&gt;how early&lt;/em&gt; some assumptions had solidified.&lt;/p&gt;

&lt;p&gt;Often, they weren’t explicitly designed.&lt;br&gt;
They just became embedded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in class boundaries&lt;/li&gt;
&lt;li&gt;in data shapes&lt;/li&gt;
&lt;li&gt;in integration points&lt;/li&gt;
&lt;li&gt;in what tests bothered to assert — and what they didn’t&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those assumptions were encoded deeply enough,&lt;br&gt;
tests started protecting them instead of questioning them.&lt;/p&gt;

&lt;p&gt;At that point, design work hadn’t stopped —&lt;br&gt;
it had just moved out of sight.&lt;/p&gt;




&lt;h2&gt;
  
  
  An Uncomfortable Experiment
&lt;/h2&gt;

&lt;p&gt;That realization pushed me toward some uncomfortable experiments.&lt;/p&gt;

&lt;p&gt;I started writing tests that cut end-to-end much earlier than felt reasonable —&lt;br&gt;
sometimes before I felt I “understood the design.”&lt;/p&gt;

&lt;p&gt;I tried to think less in terms of features,&lt;br&gt;
and more in terms of invariants:&lt;br&gt;
&lt;em&gt;what must never break, no matter how the system evolves.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And I began paying attention to what actually changed for me&lt;br&gt;
when a test turned green.&lt;/p&gt;

&lt;p&gt;Often, it wasn’t confidence in correctness.&lt;/p&gt;

&lt;p&gt;It was the moment when I no longer felt the need&lt;br&gt;
to question a particular assumption.&lt;/p&gt;




&lt;h2&gt;
  
  
  Integration Tests as Pressure, Not Coverage
&lt;/h2&gt;

&lt;p&gt;This isn’t an argument for more tests,&lt;br&gt;
or even for integration tests as a category.&lt;/p&gt;

&lt;p&gt;What mattered wasn’t &lt;em&gt;where&lt;/em&gt; the test lived,&lt;br&gt;
but &lt;em&gt;what kind of pressure&lt;/em&gt; it applied.&lt;/p&gt;

&lt;p&gt;Some tests only verify that parts fit together.&lt;br&gt;
Others force assumptions to collide with reality:&lt;br&gt;
concurrency, timing, data consistency, failure modes.&lt;/p&gt;

&lt;p&gt;Those collisions are uncomfortable.&lt;br&gt;
They’re slow.&lt;br&gt;
They’re hard to mock away.&lt;/p&gt;

&lt;p&gt;But they’re also where design tends to move again.&lt;/p&gt;




&lt;h2&gt;
  
  
  This Isn’t About Replacing Design
&lt;/h2&gt;

&lt;p&gt;I want to be clear about what this is &lt;em&gt;not&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is not an argument that tests should replace design work.&lt;br&gt;
And it’s not a claim that thinking upfront is useless.&lt;/p&gt;

&lt;p&gt;It’s an observation that some assumptions look stable on paper —&lt;br&gt;
and only reveal their fragility when exercised across real boundaries.&lt;/p&gt;

&lt;p&gt;In those cases, certain tests don’t substitute for design.&lt;br&gt;
They expose where design was incomplete, optimistic, or simply wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters More with AI
&lt;/h2&gt;

&lt;p&gt;Recently, this question has felt more urgent.&lt;/p&gt;

&lt;p&gt;With AI-assisted coding, it’s trivial to generate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;plausible implementations&lt;/li&gt;
&lt;li&gt;passing tests&lt;/li&gt;
&lt;li&gt;convincing refactors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Green becomes cheap.&lt;/p&gt;

&lt;p&gt;Which makes it even easier for assumptions to settle unnoticed.&lt;/p&gt;

&lt;p&gt;If tests only confirm structure,&lt;br&gt;
AI can help us reach that plateau faster —&lt;br&gt;
without helping us notice that learning has stopped.&lt;/p&gt;

&lt;p&gt;In that context, the question isn’t&lt;br&gt;
“Can AI write correct code?”&lt;/p&gt;

&lt;p&gt;It’s:&lt;br&gt;
&lt;strong&gt;Who is still responsible for noticing when design stops moving?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Design as Ongoing Discovery
&lt;/h2&gt;

&lt;p&gt;What I’m circling around isn’t a new methodology.&lt;/p&gt;

&lt;p&gt;It’s a reframing.&lt;/p&gt;

&lt;p&gt;Design isn’t a phase that precedes tests.&lt;br&gt;
And tests aren’t just a safety net for finished ideas.&lt;/p&gt;

&lt;p&gt;In their most useful form, tests are instruments of doubt.&lt;br&gt;
They mark which assumptions we still need to question —&lt;br&gt;
and which ones we can afford to stop worrying about.&lt;/p&gt;

&lt;p&gt;When tests stop doing that,&lt;br&gt;
the stall isn’t a failure of discipline.&lt;/p&gt;

&lt;p&gt;It’s a signal.&lt;/p&gt;

&lt;p&gt;And the work is to find a way&lt;br&gt;
to make assumptions dangerous again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thought
&lt;/h2&gt;

&lt;p&gt;A green test doesn’t mean “this part is correct.”&lt;/p&gt;

&lt;p&gt;Sometimes, it just means:&lt;br&gt;
&lt;em&gt;this assumption has quietly stopped being questioned.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When design stops moving,&lt;br&gt;
the most important thing may not be writing better tests —&lt;br&gt;
but finding ways to let uncertainty back in.&lt;/p&gt;

&lt;p&gt;That’s the part I’m still trying to understand.&lt;/p&gt;

</description>
      <category>tdd</category>
      <category>ai</category>
      <category>testing</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
