<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>svnscha - ralph</title>
    <subtitle>automating annoying tasks, sharing tips, and embracing less frustration</subtitle>
    <link rel="self" type="application/atom+xml" href="https://svnscha.de/tags/ralph/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://svnscha.de"/>
    <generator uri="https://astro.build/">Astro</generator>
    <updated>2026-01-26T00:00:00+00:00</updated>
    <id>https://svnscha.de/tags/ralph/atom.xml</id>
    <entry xml:lang="en">
        <title>Meet Ralph: The AI Coding Agent That Just Keeps Going</title>
        <published>2026-01-26T00:00:00+00:00</published>
        <updated>2026-01-26T00:00:00+00:00</updated>
        <author>
          <name>Sven Scharmentke</name>
        </author>
        <link rel="alternate" type="text/html" href="https://svnscha.de/posts/meet-ralph/"/>
        <id>https://svnscha.de/posts/meet-ralph/</id>
        <summary type="html">I built an autonomous AI agent that works from a PRD, verifies its own work, and ships code while I sleep. Here's Ralph.</summary>
        <content type="html" xml:base="https://svnscha.de/posts/meet-ralph/">&lt;p&gt;📺 &lt;strong&gt;Watch Ralph in Action:&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=dfZb2LPdkMk&quot;&gt;Ralph implementing its own features&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🔗 &lt;strong&gt;Links:&lt;/strong&gt; &lt;a href=&quot;https://github.com/svnscha/ralph&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Shoutout to &lt;a href=&quot;https://x.com/mattpocockuk&quot;&gt;Matt Pocock&lt;/a&gt; whose &lt;a href=&quot;https://x.com/mattpocockuk/status/2007924876548637089&quot;&gt;viral tweet about &quot;Ralph Wiggum&quot;&lt;/a&gt; sparked this whole thing.&lt;/p&gt;
&lt;h2 id=&quot;why-you-ask&quot;&gt;Why, You Ask?&lt;/h2&gt;
&lt;p&gt;Because AI coding assistants have a dirty little secret: they forget.&lt;/p&gt;
&lt;p&gt;You start strong. &quot;Refactor this auth module.&quot; The AI gets it. Code looks good. You're feeling productive.&lt;/p&gt;
&lt;p&gt;Then 15 minutes later... it forgets what you discussed. It starts solving problems you never asked about. It rewrites code you specifically said to leave alone.&lt;/p&gt;
&lt;p&gt;Sound familiar?&lt;/p&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Most AI coding tools are built for short bursts. Quick questions, small fixes, code snippets. Try to run them for hours on a bigger task? Good luck. Context degrades. Focus drifts. You spend more time course-correcting than coding.&lt;/p&gt;
&lt;p&gt;I always wanted something different. An AI that could work autonomously on well-defined tasks. Start it before bed, wake up to working code. The missing piece? An agent that you can programmatically control.&lt;/p&gt;
&lt;p&gt;Now, with the GitHub Copilot SDK and the Ralph loop, this has become too easy not to do.&lt;/p&gt;
&lt;p&gt;So I built yet another Ralph.&lt;/p&gt;
&lt;h2 id=&quot;what-is-ralph&quot;&gt;What Is Ralph?&lt;/h2&gt;
&lt;p&gt;Ralph is a .NET CLI tool that treats AI as an autonomous agent, not a chat buddy. The key insight: &lt;strong&gt;structure breeds autonomy.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here's how it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;You describe what you want.&lt;/strong&gt; Ralph asks clarifying questions, then generates a structured PRD with prioritized user stories.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ralph executes autonomously.&lt;/strong&gt; Picks up one story at a time, implements it, runs verification scripts to confirm it works, commits, moves on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Repeat until done.&lt;/strong&gt; You come back to find working, tested code.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;the-secret-sauce-the-prd&quot;&gt;The Secret Sauce: The PRD&lt;/h2&gt;
&lt;p&gt;At the heart of Ralph is a simple JSON file - the Product Requirements Document:&lt;/p&gt;
&lt;pre class=&quot;astro-code dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;project&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;my-app&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;taskName&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;add-auth&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;userStories&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      &quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;US-001&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      &quot;title&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Create login endpoint&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      &quot;acceptanceCriteria&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        &quot;POST /api/auth/login accepts email and password&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        &quot;Returns JWT token on success&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        &quot;ralph_verify(Build) passes&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        &quot;ralph_verify(Test) passes&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      &quot;priority&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      &quot;passes&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each story is small enough to complete in one go. Ralph picks the next one where &lt;code&gt;passes: false&lt;/code&gt;, implements it, runs verification, and marks it complete. If the build fails, it sees the errors and fixes them. If tests fail, same thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The magic is in the &lt;code&gt;ralph_verify()&lt;/code&gt; calls.&lt;/strong&gt; These run actual C# verification scripts - compiled at runtime with Roslyn - that confirm the work is correct before moving on.&lt;/p&gt;
&lt;h2 id=&quot;verification-scripts&quot;&gt;Verification Scripts&lt;/h2&gt;
&lt;p&gt;Traditional AI assistants produce code and hope for the best. Ralph takes a different approach: &lt;strong&gt;every story must pass verification before it's marked complete&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;ralph_verify()&lt;/code&gt; function in acceptance criteria tells Ralph which scripts to run. When Ralph sees &lt;code&gt;ralph_verify(Build) passes&lt;/code&gt;, it executes the Build script and confirms it succeeds before moving on.&lt;/p&gt;
&lt;p&gt;Ralph ships with Build and Test scripts out of the box. They're C# classes compiled at runtime with Roslyn:&lt;/p&gt;
&lt;pre class=&quot;astro-code dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Ralph&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Core&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Abstractions&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Ralph&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Scripts&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;VerificationScript&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Build&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Verifies solution compiles&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Build&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IVerificationScript&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; VerificationResult&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; Execute&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        // Spawn dotnet build, capture output, return pass/fail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The key insight: &lt;strong&gt;Ralph loops until all verification scripts pass&lt;/strong&gt;. If Build fails, Ralph sees the compiler errors and attempts to fix them. If Test fails, Ralph sees which tests failed and why. This self-correcting loop is what enables hours of autonomous work.&lt;/p&gt;
&lt;p&gt;Why custom scripts instead of just telling the AI &quot;run &lt;code&gt;dotnet build&lt;/code&gt;&quot;? Context efficiency. A successful build returns &quot;Build succeeded&quot; - not the entire compiler output. Only on failure does Ralph see the errors it needs to fix. This keeps the context window lean and focused on what matters.&lt;/p&gt;
&lt;p&gt;Want custom verification? Drop a script in &lt;code&gt;.ralph/scripts/&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;VerificationScript&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Lint&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Runs dotnet format to check code style&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Lint&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IVerificationScript&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; VerificationResult&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; Execute&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        // Run dotnet format --verify-no-changes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        // Return pass/fail based on exit code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you can use &lt;code&gt;ralph_verify(Lint) passes&lt;/code&gt; in your acceptance criteria. Security scans, API tests, whatever you need.&lt;/p&gt;
&lt;h2 id=&quot;behind-the-scenes&quot;&gt;Behind the Scenes&lt;/h2&gt;
&lt;p&gt;Every AI model has a context window-the amount of text it can &quot;see&quot; at once. Ralph works within these limits by keeping each story self-contained.&lt;/p&gt;
&lt;p&gt;A story must fit entirely within a single context window:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The system prompt (Ralph's instructions)&lt;/li&gt;
&lt;li&gt;The current story's details and acceptance criteria&lt;/li&gt;
&lt;li&gt;Relevant source files Ralph needs to read&lt;/li&gt;
&lt;li&gt;Space for Ralph to &quot;think&quot; and generate code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Practical guidance:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Story Size&lt;/th&gt;
&lt;th&gt;Files Touched&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Small&lt;/td&gt;
&lt;td&gt;1-3 files&lt;/td&gt;
&lt;td&gt;✅ Ideal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;4-8 files&lt;/td&gt;
&lt;td&gt;✅ Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large&lt;/td&gt;
&lt;td&gt;9-15 files&lt;/td&gt;
&lt;td&gt;⚠️ Consider splitting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Too Large&lt;/td&gt;
&lt;td&gt;15+ files&lt;/td&gt;
&lt;td&gt;❌ Split required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ralph doesn't have persistent memory across stories. Each time it picks one up, it starts fresh. This isn't a bug-it's a feature that forces clean design. Each story is a complete, verifiable unit of work.&lt;/p&gt;
&lt;p&gt;&quot;Add user authentication&quot; becomes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create User entity and migration&lt;/li&gt;
&lt;li&gt;Implement password hashing service&lt;/li&gt;
&lt;li&gt;Create login endpoint&lt;/li&gt;
&lt;li&gt;Add JWT token generation&lt;/li&gt;
&lt;li&gt;Implement authentication middleware&lt;/li&gt;
&lt;li&gt;Create registration endpoint&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each story is small enough to complete in one iteration, yet together they deliver the full feature.&lt;/p&gt;
&lt;h3 id=&quot;state-management&quot;&gt;State Management&lt;/h3&gt;
&lt;p&gt;Ralph maintains state at two levels:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PRD state&lt;/strong&gt; (persistent) - which stories exist, which have passed, notes from completed work. This file persists across sessions and gets committed to your repo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Session state&lt;/strong&gt; (ephemeral) - current working story, in-progress changes, retry attempts. Lives only for one execution.&lt;/p&gt;
&lt;p&gt;If Ralph crashes mid-story, that story remains &lt;code&gt;passes: false&lt;/code&gt; and will be retried on next run. Completed stories are never redone.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;You'll need .NET 10 SDK and &lt;a href=&quot;https://docs.github.com/en/copilot/github-copilot-in-the-cli&quot;&gt;GitHub Copilot CLI&lt;/a&gt; installed and authenticated.&lt;/p&gt;
&lt;pre class=&quot;astro-code dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Build and pack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dotnet&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dotnet&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; pack&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; src/Ralph/Ralph.csproj&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Install globally&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dotnet&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; tool&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; --global&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; --add-source&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; src/Ralph/nupkg&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; Ralph&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then in your project:&lt;/p&gt;
&lt;pre class=&quot;astro-code dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Option A: Plan and implement in one go&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ralph&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Option B: Plan first, then implement separately&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ralph&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; plan&lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    # Create the PRD interactively&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ralph&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;     # Implement all stories from the PRD&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's it. Ralph asks &quot;What would you like to accomplish?&quot;, creates a PRD from your description, and implements all stories. Go grab coffee.&lt;/p&gt;
&lt;h2 id=&quot;why-this-works&quot;&gt;Why This Works&lt;/h2&gt;
&lt;p&gt;Traditional AI assistants are designed for conversation. Ralph is designed for execution.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Traditional AI&lt;/th&gt;
&lt;th&gt;Ralph&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Duration&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;Hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;Degrades over time&lt;/td&gt;
&lt;td&gt;Fresh per story&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verification&lt;/td&gt;
&lt;td&gt;You check manually&lt;/td&gt;
&lt;td&gt;Scripts verify automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human involvement&lt;/td&gt;
&lt;td&gt;Constant supervision&lt;/td&gt;
&lt;td&gt;Set and forget&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The AI model is the same. The difference is the workflow architecture around it.&lt;/p&gt;
&lt;h2 id=&quot;the-catch&quot;&gt;The Catch&lt;/h2&gt;
&lt;p&gt;Stories need to be small enough to fit in a context window. If a story requires understanding 50 files at once, it'll struggle. Keep them focused: 1-5 files per story, one concern each.&lt;/p&gt;
&lt;p&gt;Also, this isn't magic. Ralph still needs good acceptance criteria. Vague requirements produce vague results. But that's true of any engineering work.&lt;/p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;
&lt;p&gt;AI coding assistants are great at short bursts but fall apart on longer tasks. Ralph fixes that by giving AI what it needs: structure. A PRD breaks work into discrete stories. Verification scripts confirm each one works. The result? An agent that can run for hours without wandering off course.&lt;/p&gt;
&lt;p&gt;The shift from &quot;AI assistant&quot; to &quot;AI agent&quot; isn't just semantic. It's the difference between babysitting and delegating.&lt;/p&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;Next Steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Watch the demo&lt;/strong&gt; - See Ralph implement its own features in the &lt;a href=&quot;https://www.youtube.com/watch?v=dfZb2LPdkMk&quot;&gt;YouTube video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clone the repo&lt;/strong&gt; - &lt;a href=&quot;https://github.com/svnscha/ralph&quot;&gt;github.com/svnscha/ralph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Try it on something small&lt;/strong&gt; - Pick a well-defined feature, let Ralph work on it overnight, come back to commits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That moment when you return to working, tested code you didn't write line by line? That's when it clicks.&lt;/p&gt;
</content>
    </entry>
</feed>
