<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Pradeep Roark’s Lab]]></title><description><![CDATA[I write about Software Engineering. Programming Languages. AI as a fulcrum to the future. I like to tinker and bring abstract ideas to life. Posts about what worked, what didn't and what I keep working on.]]></description><link>https://lab.pradeeproark.com</link><image><url>https://substackcdn.com/image/fetch/$s_!eolZ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6baaa475-07e8-4168-999a-95848029fd9d_1254x1254.png</url><title>Pradeep Roark’s Lab</title><link>https://lab.pradeeproark.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 07 Nov 2026 16:09:24 GMT</lastBuildDate><atom:link href="https://lab.pradeeproark.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Pradeep Roark]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[pradeeproark@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[pradeeproark@substack.com]]></itunes:email><itunes:name><![CDATA[Pradeep Roark]]></itunes:name></itunes:owner><itunes:author><![CDATA[Pradeep Roark]]></itunes:author><googleplay:owner><![CDATA[pradeeproark@substack.com]]></googleplay:owner><googleplay:email><![CDATA[pradeeproark@substack.com]]></googleplay:email><googleplay:author><![CDATA[Pradeep Roark]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Lab: Spec Driven Development - TODO app]]></title><description><![CDATA[Milk and eggs, milk and eggs]]></description><link>https://lab.pradeeproark.com/p/lab-spec-driven-development-todo</link><guid isPermaLink="false">https://lab.pradeeproark.com/p/lab-spec-driven-development-todo</guid><dc:creator><![CDATA[Pradeep Roark]]></dc:creator><pubDate>Wed, 23 Sep 2026 20:52:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7-4v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7-4v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7-4v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!7-4v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!7-4v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!7-4v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7-4v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2696099,&quot;alt&quot;:&quot;Builder plans vs reality.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lab.pradeeproark.com/i/217122410?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Builder plans vs reality." title="Builder plans vs reality." srcset="https://substackcdn.com/image/fetch/$s_!7-4v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!7-4v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!7-4v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!7-4v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c176110-8270-412e-81a4-780f1d71c5fa_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>In my  last article I wrote about using specs to drive agents developing software. The goal is to observe what happens and discuss the implications, good and bad.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;7dabd65f-3eff-40bb-b722-9214ff364e40&quot;,&quot;caption&quot;:&quot;Agentic AI has collapsed a few layers in the traditional software development process. Particularly the claim is that you can develop a feature of a software just by writing the specification.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Spec driven development&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:257208960,&quot;name&quot;:&quot;Pradeep Roark&quot;,&quot;bio&quot;:&quot;An Engineer who likes to build at the speed of thought of things that fill the digital realm.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c125d48b-6e90-41dd-94a1-a99f2715404a_398x400.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-09-23T08:15:28.906Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!L7vq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://lab.pradeeproark.com/p/spec-driven-development&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:217037095,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:11215929,&quot;publication_name&quot;:&quot;Pradeep Roark&#8217;s Lab&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!eolZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6baaa475-07e8-4168-999a-95848029fd9d_1254x1254.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>For that reason, I chose a supposedly simple specification: the canonical TODO app. This app has a <a href="https://github.com/tastejs/todomvc/blob/master/app-spec.md">specification</a> documented at todomvc, a project originally designed to compare various<a href="https://todomvc.com/"><span> MVC JavaScript/TypeScript frameworks</span></a>. Remarkably detailed for its purpose of evaluating an &#8220;MVC&#8221; framework for web applications, it outlines very specific requirements. This level of detail itself carries implications we&#8217;ll explore further. For this lab, I removed all &#8220;web&#8221; related elements from the specification, including its insistence on specifying CSS class names and their usage. The stripped-down Markdown version of the specification below.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;markdown&quot;,&quot;nodeId&quot;:&quot;867edc8b-e110-4f9b-b4e3-1b18d2812848&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-markdown"># TODO app specification

This is a specification for a todo app to create an easy to use and correct todo application.

## Functionality

### Global
The input control should be above any todos and prominent for easier visual attention.

### No Todo State
When there are no todos, focus on [INPUT] control to enter one.

### Entering Todos state
1. The todo is a text with preceding and succeeding whitespace trimmed.
2. Pressing [ENTER] creates todo, appends it to a todo list and clears the input. 

### Marking Todo complete state
1. [CLICKING] the [CHECKBOX] next to a [TODO]
2. Completed TODOs should have a visually distinct style compared to an incomplete one

### Editing a Todo state
1. [DOUBLE CLICKING] an existing [TODO] should load the todo title in the [INPUT] for editing. Any edits subsequently following (1) of Entering todos will proceed using [ENTER] to update the relevant TODO

### Deleting a Todo
1. All Todo items in the list will have a [DELETE] option
2. Selecting that will [DELETE] the TODO item and update the list.

### Persistence
1. The applications provides a storage for todos app
</code></pre></div><p>It&#8217;s worth noting the deliberate use of certain words in the spec like &#8220;easy to use&#8221; and &#8220;correct&#8221;. However, unlike traditional coding this is a very naive and underspecified use of these terms. What even does &#8220;ease of use&#8221; mean? And what is &#8220;correct&#8221;? These concepts have significant implications for the agent&#8217;s interpretation based on its trained weights.</p><p>I intentionally omitted parts of the original spec regarding bulk todo editing and counters to show completed/open todos. This allows us to later add these features to the spec and observe how the agent evolves the code.</p><p>Now, for the actual implementation, I initiated a fresh agent session and provided it with my handwritten spec.md file along with the prompt.</p><p><code>Implement @spec.md as a TUI</code></p><p>Here, TUI narrowed down what the nature of the application is: Terminal User Interface, which in turn is a very specific type of application that can be run in a terminal.</p><p>Also, let&#8217;s pay attention to things that were not specified in the spec.md: no programming languages, tech stacks, frameworks, databases, is it a SaaS product, etc.</p><p>It did have, though, some specific words that triggered the implementing agent to pick some choices for all those.</p><p>Et voil&#224;, it baked an TUI app, shown below along with an explanation of why it did it this way.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h67C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h67C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif 424w, https://substackcdn.com/image/fetch/$s_!h67C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif 848w, https://substackcdn.com/image/fetch/$s_!h67C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif 1272w, https://substackcdn.com/image/fetch/$s_!h67C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!h67C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif" width="900" height="476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52f845a3-60df-4798-8896-0c28facce00f_900x476.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:476,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:243494,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lab.pradeeproark.com/i/217122410?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!h67C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif 424w, https://substackcdn.com/image/fetch/$s_!h67C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif 848w, https://substackcdn.com/image/fetch/$s_!h67C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif 1272w, https://substackcdn.com/image/fetch/$s_!h67C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>It mapped some parts of the specs directly to the choice of frameworks to use and defaulted the other parts based on the weights of its data. Python as the language of implementation, Textual a framework for building TUIs with mouse support, which is not common in a TUI framework. But it was chosen as the spec had the word SELECT and DOUBLE CLICK, implying the need for mouse support. <br><br>The implementation artefacts were quite simple.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;792373a0-bd26-4ede-94d6-07503be1c1c3&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#9500;&#9472;&#9472; pyproject.toml
&#9500;&#9472;&#9472; README.md
&#9500;&#9472;&#9472; spec.md
&#9492;&#9472;&#9472; todo_tui
    &#9500;&#9472;&#9472; __init__.py
    &#9500;&#9472;&#9472; __main__.py
    &#9500;&#9472;&#9472; app.py
    &#9500;&#9472;&#9472; app.tcss
    &#9500;&#9472;&#9472; models.py
    &#9492;&#9472;&#9472; widgets.py

2 directories, 9 files</code></pre></div><p>Though it missed the tests that it claimed it wrote and ran in the repo, an oversight it claimed to fix after pointing it out.</p><p>The app completion summary written to the README.md had the following completed checklist, which I insisted be written in a specific format.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;markdown&quot;,&quot;nodeId&quot;:&quot;b708c981-ee81-4fd7-89ec-6eb0ace6ad80&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-markdown">## Feature List

- Prominent input above the list &#8212; Status: completed; Notes: docked to the top of the screen with a heavy border so it stays visually distinct from the list below it.
- Focus input whenever no todos exist &#8212; Status: completed; Notes: applied on startup and again after the last todo is deleted.
- Trim whitespace on entry &#8212; Status: completed; Notes: leading and trailing whitespace is stripped before a todo is created or updated.
- Enter creates a todo, appends it, and clears the input &#8212; Status: completed; Notes: a blank submission after trimming is silently ignored.
- Click the checkbox to mark a todo complete &#8212; Status: completed; Notes: built on Textual's Checkbox widget and its Changed message.
- Completed todos are visually distinct &#8212; Status: completed; Notes: strikethrough text plus a muted color.
- Double-click a todo to load it into the input for editing &#8212; Status: completed; Notes: detected via the Click event's chain length reaching 2.
- Enter while editing updates the todo instead of appending a new one &#8212; Status: completed; Notes: tracked with an editing_id on the app, cleared after submit.
- Every todo has a delete option &#8212; Status: completed; Notes: a small button on each row removes just that row.
- Todos are persisted to storage &#8212; Status: completed; Notes: written as JSON to ~/.todo-tui/todos.json on every mutation, loaded on startup.</code></pre></div><p></p><h3>Lessons learnt</h3><p>A simple spec is enough for a simple implementation. The less you specify, the more you get in terms of choice of implementation. At the cost of choices that aren&#8217;t in your control. Whether that matters is a matter of context and taste. I thought the UI looked ugly but functional. For the next lab, let us add a feature to the spec and evolve the code under consideration.</p>]]></content:encoded></item><item><title><![CDATA[Spec driven development]]></title><description><![CDATA[Look ma, no code]]></description><link>https://lab.pradeeproark.com/p/spec-driven-development</link><guid isPermaLink="false">https://lab.pradeeproark.com/p/spec-driven-development</guid><dc:creator><![CDATA[Pradeep Roark]]></dc:creator><pubDate>Wed, 23 Sep 2026 08:15:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!L7vq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L7vq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L7vq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png 424w, https://substackcdn.com/image/fetch/$s_!L7vq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png 848w, https://substackcdn.com/image/fetch/$s_!L7vq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png 1272w, https://substackcdn.com/image/fetch/$s_!L7vq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L7vq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png" width="1374" height="1145" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1145,&quot;width&quot;:1374,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:0,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L7vq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png 424w, https://substackcdn.com/image/fetch/$s_!L7vq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png 848w, https://substackcdn.com/image/fetch/$s_!L7vq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png 1272w, https://substackcdn.com/image/fetch/$s_!L7vq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa0abe-3b3e-4d63-bbb8-dc4d02fca1e7_1374x1145.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Agentic AI has collapsed a few layers in the traditional software development process. Particularly the claim is that you can develop a feature of a software just by writing the specification.</p><p> Already there are many frameworks written as skill bundles that direct agents how to do that. Read a spec and produce all the artefacts you could expect. A working prototype or complete software with tests and documentation.</p><p>But there is a difference between doing this with or without rigour. The looser the specifications the higher the chance of incomplete, buggy or totally irrelevant output. Otherwise SDD is still subject to the &#8220;GIGO&#8221; principle. &#8220;Garbage in Garbage out&#8221;.</p><p>But what makes a good spec over a bad one? I am going to take some well known popular applications and spec them out and let agents drive the implementations to see the results. </p><p>Next Part is here.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;42f2e202-fef3-4168-b56c-479b0354fc4d&quot;,&quot;caption&quot;:&quot;In my last article I wrote about using specs to drive agents developing software. The goal is to observe what happens and discuss the implications, good and bad.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Lab: Spec Driven Development - TODO app&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:257208960,&quot;name&quot;:&quot;Pradeep Roark&quot;,&quot;bio&quot;:&quot;An Engineer who likes to build at the speed of thought of things that fill the digital realm.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c125d48b-6e90-41dd-94a1-a99f2715404a_398x400.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-09-23T20:52:44.037Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!h67C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52f845a3-60df-4798-8896-0c28facce00f_900x476.gif&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://lab.pradeeproark.com/p/lab-spec-driven-development-todo&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:217122410,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:11215929,&quot;publication_name&quot;:&quot;Pradeep Roark&#8217;s Lab&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!eolZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6baaa475-07e8-4168-999a-95848029fd9d_1254x1254.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p>]]></content:encoded></item><item><title><![CDATA[Agentic Scratch Memory using Pensieve]]></title><description><![CDATA[Building memory for Agents]]></description><link>https://lab.pradeeproark.com/p/agentic-scratch-memory-using-pensieve</link><guid isPermaLink="false">https://lab.pradeeproark.com/p/agentic-scratch-memory-using-pensieve</guid><dc:creator><![CDATA[Pradeep Roark]]></dc:creator><pubDate>Tue, 22 Sep 2026 11:03:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wNNI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wNNI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wNNI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!wNNI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!wNNI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!wNNI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wNNI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2819550,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lab.pradeeproark.com/i/216879797?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wNNI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!wNNI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!wNNI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!wNNI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfd7793-6226-42af-b31d-49eb2fcbb89f_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Last year, I wrote an article which is almost the &#8220;hello world&#8221; of customising an agent. Circa 2025, coding agents were limited in context. You needed to constantly tell them everything again in every session. Who am I? Why are we here? That sort of thing. Humour aside, you needed to feed them the same set of instructions, files that you wanted them to ground on. Also, if you were planning a long coding session, a way for them to recollect what they did. I will reproduce that article here verbatim. But note that I no longer use &#8220;Pensieve&#8221;, the tool I built for this extensively now, but still it is very informative on why it was very useful back then.</p><blockquote><p>Agentic coding is a phenomenal experience. I&#8217;ve been working with AI coding agents for a year now, primarily using Claude Code after trying a variety of models. But there&#8217;s one well-known problem &#8212; they have a &#8216;context window&#8217; - a limited memory area for what they&#8217;re holding in their &#8216;agentic minds&#8217;. Context is nearly <em>everything</em> because it guides them to approach the task from the proper perspective and captures the small details that wire projects together, keeping the process focused and relevant.</p><p>What constitutes context? It could be the code already written, high-level architectural ideas, pitfalls to avoid, or observations about the domain the problem is trying to solve. &#8220;Code&#8221; alone does not capture everything. My earlier approach was to write extensive specs and capture them as docs, which I had to constantly reference when working on a task. It wasn&#8217;t scaling, and it <em>wasn&#8217;t enough</em>. The agents frequently forgot key details I had decided were essential and wrote docs on, but they weren&#8217;t always bringing that knowledge to bear&#8230; creating weird spaghetti. Spaghetti that solved the problem at hand but was inconsistent with earlier pieces. I solved most of this by following rigid structures (like templates) for different parts of the codebase, which nearly solved the inconsistency issue, but not entirely.</p><p>Depending on the programming stack you use, there&#8217;s still information loss about the domain under consideration unless you meticulously document it in the project. The agent wasn&#8217;t <em>really</em> &#8220;learning&#8221;. This is not a meta discussion about what &#8220;learning&#8221; is and whether they really do. My insight was that they lack &#8220;knowledge&#8221; - the kind we bring to bear when we learn a codebase and the domain it&#8217;s operating in &#8212; the little trickles of insights gained that turn into a knowledge repository. What they needed was a way to build this &#8220;knowledge&#8221; themselves, through working on a project, and to bring it to bear on the problem at hand.</p><p>How did I solve this without agents before? The answer was actually so simple. I used structured notes - a scratchpad filled with entries about different aspects of the codebase or domain. For example, I documented data flow, persistence methods, and design choices&#8212;things that happen all the time in artisan coding. These notes acted as a personal memory aid, helping me recall critical details quickly and consistently during development.</p><p>But what do I mean by structured notes? You need to distinguish between free-form writing and structured writing. Free-form writing about a problem solved in a project would be like a couple of paragraphs explaining what was solved. But depending upon how good you are at keeping all relevant details, the free-form approach becomes lossy and inconsistent. So I follow a system where I design a template for each type of learning that I have. For instance, a &#8220;problem solved&#8221; template might capture the problem, the root cause, and what was learned. Or a &#8220;design principles&#8221; template might have fields for the principle itself (limited to 150 characters), the rationale behind it, and what anti-pattern it prevents. The template forces me to list the relevant details. And I design little templates to use for other things, like &#8220;patterns discovered&#8221; or &#8220;workarounds learned&#8221;. These are, by necessity, brief and distinct from project-level documentation. Having a structure enhances consistency and makes the gathered knowledge really valuable.</p><p>Now, how do I make the agents follow such a system? Define templates, and use them whenever the context dictates, preferably in a seamless way&#8230; like when I think and jot them down.</p><p>Enter Pensieve, a scratchpad for AI agents to use - a command-line interface (CLI) tool that agents can use to define templates and record notes in them and recall them as needed. Agents are very good at using CLI-based tools, and they automatically discovered how to use them with a little prompting. The agents designed templates in collaboration with me for each project I was working on and started filling them in as we tackled tasks together. And slowly, as we started new sessions, the agent started recollecting past learnings, informing the task at hand and making it more guided and precise than before. You no longer needed to <em>yell</em> the same information over and over.</p><p></p><p>But why exactly is this better than using CLAUDE.md or docs in the repo? It is because they are unstructured, and the agents follow those instructions in an inconsistent manner. The more you have in this memory, the less likely the agent is going to find it and use it. Also, without specifying limits, the agents generated verbose, pointless documentation which they <em>themselves</em> did not follow. By forcing the agents to create structured notes with well-defined fields and LIMITING the length of them as needed, more disciplined knowledge capture happened.</p><p>Besides templates, Pensieve also encourages agents to link entries with each other. Nothing is lost forever &#8212; a note can be &#8220;augmented,&#8221; &#8220;superseded,&#8221; or &#8220;deprecated&#8221; by another note. In most cases, this is sufficient, and the agent is encouraged to follow these links when inspecting a note. This allows the agent to crawl through memory AS NEEDED for the task at hand, digging deeper and deeper into memory, building a &#8220;graph of sorts&#8221; in its agentic mind.</p></blockquote><p></p><p>I no longer have the repo for the same open. Instead, I plan to share a spec of the tool, which should be sufficient for any agent to design one.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lab.pradeeproark.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Pradeep Roark&#8217;s Lab! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Cambrian Explosion of Software development with LLMs]]></title><description><![CDATA[Large Language Models (LLMs) have unleashed a Cambrian explosion of software.]]></description><link>https://lab.pradeeproark.com/p/the-cambrian-explosion-of-software</link><guid isPermaLink="false">https://lab.pradeeproark.com/p/the-cambrian-explosion-of-software</guid><dc:creator><![CDATA[Pradeep Roark]]></dc:creator><pubDate>Sun, 20 Sep 2026 20:09:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!m_Xa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!m_Xa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!m_Xa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!m_Xa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!m_Xa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!m_Xa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!m_Xa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3170353,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://pradeeproark.substack.com/i/216627264?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!m_Xa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!m_Xa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!m_Xa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!m_Xa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac961ebf-a0c5-4757-b257-df8b9663ac67_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Large Language Models (LLMs) have unleashed a Cambrian explosion of software. Over the decades, coding was partly considered elitist, despite efforts to make it accessible to more people. Many people became coders without calling themselves that. Writers and script writers were never afforded the title, despite, for all intents and purposes, they were indeed &#8220;coding&#8221;.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lab.pradeeproark.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Pradeep Roark&#8217;s Lab! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Still, there was a class of software considered inaccessible to them. You needed an elaborate ritual of Software Engineering professions&#8212;from Product designers, analysts, managers, developers, and QA&#8212;to build these classes of software. Cloud apps, mobile apps, SaaS products.</p><p>The gate that prevented them had nothing to do with the complexity of the problem that they were trying to solve in a domain. The complexity of the business, be it payment processing workflows, scheduling apps, delivery apps with their own niche problems, was something product builders were able to dissect and find elegant solutions. But the translation of their solutions into software was blocked by something much more insipid.</p><p>It was the sheer amount of accidental complexity Software Architects and engineers had created over the decades. These abstractions were just endless indirections that tackled particular problems sometimes meaningful, many times not so. It still forced those looking to translate their solutions to software to deal with them.</p><p>What are React Hooks and why do you need them? What is pydantic for? What is a REST API and why do I need it?</p><p>These are worthwhile questions, but the answers and the rabbit holes of knowledge required to master them bore both deep insights and rote knowledge that needs translation and execution. The latter of which LLMs offer to solve. They can never really solve the former except to rehash pre-discovered wisdom.</p><p>How do we deal with this new world? Is it an all-or-nothing approach to go for? Is a new development approach on offer? Has a new type of coder emerged? We will set out to find out here.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lab.pradeeproark.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Pradeep Roark&#8217;s Lab! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>