<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://silverberdi.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://silverberdi.github.io/" rel="alternate" type="text/html" /><updated>2026-05-13T18:12:48+00:00</updated><id>https://silverberdi.github.io/feed.xml</id><title type="html">It’s not just a problem of syntax…</title><subtitle>Building AI-assisted development tools, one stage at a time</subtitle><entry><title type="html">From Idea to Director: How Dairector Was Born</title><link href="https://silverberdi.github.io/2026/05/12/de-la-idea-al-director/" rel="alternate" type="text/html" title="From Idea to Director: How Dairector Was Born" /><published>2026-05-12T10:10:00+00:00</published><updated>2026-05-12T10:10:00+00:00</updated><id>https://silverberdi.github.io/2026/05/12/de-la-idea-al-director</id><content type="html" xml:base="https://silverberdi.github.io/2026/05/12/de-la-idea-al-director/"><![CDATA[<h3 id="chapter-1-the-false-start">Chapter 1: The False Start</h3>

<p>It started with a simple frustration.</p>

<p>I was using Cursor, Copilot, all the usual suspects. And they were great at one thing: generating code snippets. But every time I tried to do something real — build a feature end-to-end, refactor a module, add authentication to an existing system — I hit the same wall.</p>

<p>The AI didn’t know the context. It didn’t understand the architecture. It would generate beautiful code that solved the wrong problem.</p>

<p>So I thought: what if I could build a tool that forces the AI to think like a senior developer? To start with the “why” before the “how”? To document decisions, analyze impact, and only then write code?</p>

<p>That was the original vision. Naive, ambitious, and completely wrong about how hard this would be.</p>

<h3 id="the-first-architecture">The First Architecture</h3>

<p>The first version of Dairector was a single TypeScript file. About 900 lines. It did everything:</p>

<div class="language-typescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// The monolithic approach (v0.1)</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nx">runPipeline</span><span class="p">(</span><span class="nx">idea</span><span class="p">:</span> <span class="kr">string</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">design</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">callLLM</span><span class="p">(</span><span class="s2">`Design architecture for: </span><span class="p">${</span><span class="nx">idea</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">backlog</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">callLLM</span><span class="p">(</span><span class="s2">`Generate features for: </span><span class="p">${</span><span class="nx">design</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">handoff</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">callLLM</span><span class="p">(</span><span class="s2">`Create spec for: </span><span class="p">${</span><span class="nx">backlog</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">code</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">callLLM</span><span class="p">(</span><span class="s2">`Write code for: </span><span class="p">${</span><span class="nx">handoff</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">tests</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">callLLM</span><span class="p">(</span><span class="s2">`Write tests for: </span><span class="p">${</span><span class="nx">code</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="k">return</span> <span class="p">{</span> <span class="nx">design</span><span class="p">,</span> <span class="nx">backlog</span><span class="p">,</span> <span class="nx">handoff</span><span class="p">,</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">tests</span> <span class="p">};</span>
<span class="p">}</span>
</code></pre></div></div>

<p>It worked. Sort of. The output was… interesting. The AI would generate coherent architectures, write reasonable code, even create tests. But there was no feedback loop. No way to validate. No way to say “that’s not what I meant.”</p>

<p>And the code was a nightmare. Every change required touching the entire file. Adding a new stage meant rewriting the pipeline. Error handling was an afterthought.</p>

<h3 id="the-pivot">The Pivot</h3>

<p>After about two months, I had a working prototype and a growing sense of dread. The prototype worked, but it wasn’t extensible. It wasn’t testable. It wasn’t something I could confidently show to other developers.</p>

<p>So I made the hardest decision: I deleted almost everything and started over.</p>

<p>The new architecture had one rule: <strong>every stage is independent</strong>. Each stage has its own:</p>
<ul>
  <li>Prompt template (loaded from <code class="language-plaintext highlighter-rouge">.md</code> files, not hardcoded)</li>
  <li>Model configuration (different LLMs for different tasks)</li>
  <li>State management (immutable, with clear transitions)</li>
  <li>Error handling (graceful degradation, not crash-and-burn)</li>
</ul>

<div class="language-typescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// The modular approach (v0.2)</span>
<span class="kr">interface</span> <span class="nx">Stage</span> <span class="p">{</span>
  <span class="nl">name</span><span class="p">:</span> <span class="kr">string</span><span class="p">;</span>
  <span class="nl">prompt</span><span class="p">:</span> <span class="nx">PromptTemplate</span><span class="p">;</span>
  <span class="nl">model</span><span class="p">:</span> <span class="nx">ModelConfig</span><span class="p">;</span>
  <span class="nx">execute</span><span class="p">(</span><span class="nx">input</span><span class="p">:</span> <span class="nx">StageInput</span><span class="p">):</span> <span class="nb">Promise</span><span class="o">&lt;</span><span class="nx">StageResult</span><span class="o">&gt;</span><span class="p">;</span>
  <span class="nx">validate</span><span class="p">(</span><span class="nx">output</span><span class="p">:</span> <span class="nx">StageOutput</span><span class="p">):</span> <span class="nx">ValidationResult</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This was the turning point. The code became cleaner, yes. But more importantly, the system started to feel like a real product. Something that could grow.</p>

<h3 id="what-i-learned">What I Learned</h3>

<p>The biggest lesson from those early months: <strong>AI tools fail when they pretend to know everything</strong>. The best AI-assisted development tool isn’t the one that generates the most code — it’s the one that asks the right questions at the right time.</p>

<p>Dairector’s pipeline isn’t just a technical architecture. It’s a philosophy: software development is a conversation. Between you and the code. Between intent and implementation. Between what you want and what the system can do.</p>

<p>The pipeline forces that conversation. IDEA asks “what are we building?” ANALYZE asks “how should we build it?” SLICE asks “what’s the smallest piece we can build first?” HANDOFF documents the plan. EXECUTE writes the code. VALIDATE checks the work.</p>

<p>Each stage is a chance to course-correct. To say “no, that’s not what I meant.” To refine the idea before it becomes a bug.</p>

<h3 id="whats-next">What’s Next</h3>

<p>This is post 1 of 20. Over the next few weeks, I’ll share:</p>
<ul>
  <li>The architecture decisions that shaped the project</li>
  <li>The SOLID refactoring that cut code by 80%</li>
  <li>The hybrid pipeline that combines LLMs with deterministic execution</li>
  <li>The testing strategies that caught more bugs than the AI ever wrote</li>
  <li>The failures, the pivots, and the moments I almost gave up</li>
</ul>

<p>If you’re building AI-assisted tools, or just curious about what happens when you let an LLM near production code, follow along. This is going to be a wild ride.</p>

<hr />

<p><em>Next post: The Pipeline Architecture — Why 6 Stages and Not 3 or 10</em></p>]]></content><author><name>Silverberdi</name></author><category term="dairector" /><category term="ai" /><category term="development" /><category term="ai-assisted-development" /><category term="llm" /><category term="software-architecture" /><category term="pipeline" /><summary type="html"><![CDATA[The story of how a frustration with generative AI tools led to building Dairector, an AI-assisted development pipeline. From the monolithic prototype to the modular architecture, and the lessons learned along the way.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://silverberdi.github.io/assets/images/from-idea-to-dairector.png" /><media:content medium="image" url="https://silverberdi.github.io/assets/images/from-idea-to-dairector.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>