<?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: 서나루</title>
    <description>The latest articles on DEV Community by 서나루 (@seonaru).</description>
    <link>https://dev.to/seonaru</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4085895%2Fe5209302-72f1-413b-8fcd-e19467f280a8.jpg</url>
      <title>DEV Community: 서나루</title>
      <link>https://dev.to/seonaru</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/seonaru"/>
    <language>en</language>
    <item>
      <title>Why I Stopped Creating AI Agents by Default</title>
      <dc:creator>서나루</dc:creator>
      <pubDate>Thu, 20 Aug 2026 03:57:35 +0000</pubDate>
      <link>https://dev.to/seonaru/why-i-stopped-creating-ai-agents-by-default-515j</link>
      <guid>https://dev.to/seonaru/why-i-stopped-creating-ai-agents-by-default-515j</guid>
      <description>&lt;h1&gt;
  
  
  Why I Stopped Creating AI Agents by Default
&lt;/h1&gt;

&lt;p&gt;AI coding tools are getting incredibly capable.&lt;/p&gt;

&lt;p&gt;But while using Codex and Claude Code on longer projects, I started running into a strange problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the AI development environment itself was becoming another project to maintain.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I would start with a simple repository.&lt;/p&gt;

&lt;p&gt;Then gradually add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;custom skills&lt;/li&gt;
&lt;li&gt;specialized agents&lt;/li&gt;
&lt;li&gt;memory files&lt;/li&gt;
&lt;li&gt;workflow rules&lt;/li&gt;
&lt;li&gt;validation instructions&lt;/li&gt;
&lt;li&gt;session checkpoints&lt;/li&gt;
&lt;li&gt;more tools to manage all of the above&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every addition made sense individually.&lt;/p&gt;

&lt;p&gt;But eventually I was spending too much time managing the system that was supposed to save me time.&lt;/p&gt;

&lt;p&gt;That led me to a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if the default wasn't “add another agent”?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What if the default was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do nothing until the project proves something is missing?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That idea became &lt;strong&gt;NULNUL&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;GitHub:&lt;br&gt;
&lt;a href="https://github.com/SeoNaRu/nulnul-harness" rel="noopener noreferrer"&gt;https://github.com/SeoNaRu/nulnul-harness&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Start with the repository, not the agent architecture
&lt;/h2&gt;

&lt;p&gt;A lot of agentic coding setups begin by defining the system first.&lt;/p&gt;

&lt;p&gt;You decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which agents exist&lt;/li&gt;
&lt;li&gt;which skills they need&lt;/li&gt;
&lt;li&gt;what roles they have&lt;/li&gt;
&lt;li&gt;how they communicate&lt;/li&gt;
&lt;li&gt;what memory they keep&lt;/li&gt;
&lt;li&gt;which tools they can use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then the actual project gets inserted into that structure.&lt;/p&gt;

&lt;p&gt;I wanted to reverse that relationship.&lt;/p&gt;

&lt;p&gt;NULNUL starts with the repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;read the repository
        ↓
reuse what already works
        ↓
find what's actually missing
        ↓
add the smallest necessary mechanism
        ↓
do the requested work
        ↓
run the real repository checks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the repository already contains sufficient instructions, tools and tests, NULNUL should reuse them.&lt;/p&gt;

&lt;p&gt;It should not create another abstraction simply because it can.&lt;/p&gt;

&lt;p&gt;Sometimes the correct result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 new agents
0 new skills
0 new infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That became one of the most important design principles of the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  “The agent said it's done” is not a completion condition
&lt;/h2&gt;

&lt;p&gt;Another problem I repeatedly encountered was completion.&lt;/p&gt;

&lt;p&gt;A coding agent can confidently say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Done. Everything is working.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But confidence isn't evidence.&lt;/p&gt;

&lt;p&gt;For me, completion needed to mean something executable.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; unittest discover &lt;span class="nt"&gt;-s&lt;/span&gt; tests &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s1"&gt;'test_*.py'&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or whatever the actual repository defines as its completion check.&lt;/p&gt;

&lt;p&gt;So NULNUL treats the repository's executable checks as the source of truth.&lt;/p&gt;

&lt;p&gt;The answer isn't complete because the agent believes it is complete.&lt;/p&gt;

&lt;p&gt;It's complete when the expected behavior can actually be verified.&lt;/p&gt;




&lt;h2&gt;
  
  
  Long sessions create another problem: context
&lt;/h2&gt;

&lt;p&gt;Long-running coding projects often span multiple sessions.&lt;/p&gt;

&lt;p&gt;The naive solution is to preserve more context.&lt;/p&gt;

&lt;p&gt;More transcripts.&lt;/p&gt;

&lt;p&gt;More memory.&lt;/p&gt;

&lt;p&gt;More summaries.&lt;/p&gt;

&lt;p&gt;But eventually that becomes another growing source of complexity.&lt;/p&gt;

&lt;p&gt;NULNUL instead tries to leave a small verified checkpoint in the repository.&lt;/p&gt;

&lt;p&gt;The next session can resume from that verified state rather than reconstructing the project from the entire conversation history.&lt;/p&gt;

&lt;p&gt;And if the underlying files changed after that checkpoint was created, the old verification should no longer be trusted.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but it changes how I think about agent memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The repository should remember the important state, not the conversation.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What about self-improving agents?
&lt;/h2&gt;

&lt;p&gt;This became the most interesting part of the project.&lt;/p&gt;

&lt;p&gt;Suppose the same failure happens repeatedly.&lt;/p&gt;

&lt;p&gt;It may indicate that the current harness itself is missing something.&lt;/p&gt;

&lt;p&gt;The tempting approach is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;failure
↓
agent modifies its own workflow
↓
new workflow becomes the default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But there's an obvious problem.&lt;/p&gt;

&lt;p&gt;The system proposing an improvement is also judging whether its own improvement is good.&lt;/p&gt;

&lt;p&gt;So NULNUL separates those responsibilities.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reproduced failure
        ↓
improvement candidate
        ↓
current approach vs candidate
        ↓
independent verification
      ↙              ↘
   reject           accept
                       ↓
                 observe usage
                  ↙        ↘
               keep       rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A proposed improvement does not automatically become an improvement.&lt;/p&gt;

&lt;p&gt;And sometimes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NO_PROMOTION
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is the correct result.&lt;/p&gt;

&lt;p&gt;Nothing changed because nothing proved it was better.&lt;/p&gt;

&lt;p&gt;I think that's an important property for systems that can modify their own development environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Growth shouldn't be append-only
&lt;/h2&gt;

&lt;p&gt;Another design decision followed naturally.&lt;/p&gt;

&lt;p&gt;If the project changes, the harness may need to grow.&lt;/p&gt;

&lt;p&gt;But growth shouldn't always mean adding things.&lt;/p&gt;

&lt;p&gt;A responsibility may disappear.&lt;/p&gt;

&lt;p&gt;Two roles may become redundant.&lt;/p&gt;

&lt;p&gt;A workflow may no longer need its own agent.&lt;/p&gt;

&lt;p&gt;So the harness should be able to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;add
merge
reuse
remove
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;rather than continuously accumulating configuration.&lt;/p&gt;

&lt;p&gt;The goal isn't to build the most sophisticated agent system.&lt;/p&gt;

&lt;p&gt;The goal is to keep the smallest system that reliably supports the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  Codex and Claude Code
&lt;/h2&gt;

&lt;p&gt;NULNUL currently works as a repository-local, skills-oriented harness for both Codex and Claude Code.&lt;/p&gt;

&lt;p&gt;For Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex plugin marketplace add SeoNaRu/nulnul-harness &lt;span class="nt"&gt;--ref&lt;/span&gt; main
codex plugin add nulnul-harness@nulnul-harness
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin marketplace add SeoNaRu/nulnul-harness
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;nulnul-harness@nulnul-harness
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the initial request can be as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set up the harness for this repository.
Reuse what already works and add only what is missing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But explicit setup isn't even necessary.&lt;/p&gt;

&lt;p&gt;You can simply ask for the actual work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix the booking API and verify that the existing behavior still passes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The harness exists to support the work.&lt;/p&gt;

&lt;p&gt;The work shouldn't exist to justify the harness.&lt;/p&gt;




&lt;h2&gt;
  
  
  The idea I'm experimenting with
&lt;/h2&gt;

&lt;p&gt;NULNUL is still evolving, but the core idea has become pretty simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Let the project determine the agent architecture instead of letting the agent architecture determine the project.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Inspect first.&lt;/p&gt;

&lt;p&gt;Reuse first.&lt;/p&gt;

&lt;p&gt;Add only when necessary.&lt;/p&gt;

&lt;p&gt;Verify everything that matters.&lt;/p&gt;

&lt;p&gt;And don't assume that more agents, more memory or more automation automatically means a better development environment.&lt;/p&gt;

&lt;p&gt;Sometimes the best infrastructure is the infrastructure you never needed to create.&lt;/p&gt;

&lt;p&gt;NULNUL is open source and MIT licensed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SeoNaRu/nulnul-harness" rel="noopener noreferrer"&gt;https://github.com/SeoNaRu/nulnul-harness&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd be especially interested in hearing how other developers handle this problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do your AI coding setups tend to get simpler over time — or do they just keep growing?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
