<?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[The Davenporter]]></title><description><![CDATA[Learnings about software, technology, and occasionally home renovation.]]></description><link>https://davenporter.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!-3Ve!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd474587a-27eb-4831-9613-f40c7600f5eb_1280x1280.png</url><title>The Davenporter</title><link>https://davenporter.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 21 Jun 2026 15:59:10 GMT</lastBuildDate><atom:link href="https://davenporter.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Jason Davenport]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[davenporter@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[davenporter@substack.com]]></itunes:email><itunes:name><![CDATA[Jason Davenport]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jason Davenport]]></itunes:author><googleplay:owner><![CDATA[davenporter@substack.com]]></googleplay:owner><googleplay:email><![CDATA[davenporter@substack.com]]></googleplay:email><googleplay:author><![CDATA[Jason Davenport]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How to Track AI Agent Lineage and Manage State in Code Repositories]]></title><description><![CDATA[Moving beyond clean git commits to knowledge systems for agentic development.]]></description><link>https://davenporter.substack.com/p/how-to-track-ai-agent-lineage-and</link><guid isPermaLink="false">https://davenporter.substack.com/p/how-to-track-ai-agent-lineage-and</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Tue, 16 Jun 2026 16:14:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!b4Hn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#8220;Keep your git commits clean.&#8221; It&#8217;s a goal for everyone, but we always struggle to actually do it. I don&#8217;t have enough fingers and toes to count in my individual commits when I&#8217;ve tried to fix something and the commit messages become <code>fix</code> and <code>really fixed</code>. Easy enough to fix with a squash and merge to &#8216;keep the history clean&#8217;, but we&#8217;ve also removed some of the history of problems that the user has resolved.</p><p>When people do code development, we&#8217;ve made an unconscious trade-off. The person writing the code is the knowledge base. We may have a few tests and docstrings or readmes / wiki&#8217;s, but let&#8217;s be realistic. In most organizations, prior to large scale LLM deployments, these were best effort, usually up to date at version 1.0, and then subsequently rot. Training on a codebase consists of either inspecting the code yourself, or sitting down with engineers who&#8217;ve worked on it.</p><p>With agentic development, we need to make a <em>conscious</em> decision to build a system that can manage the knowledge of the agent across all its work. This starts with the history of decisions an agent makes: what decisions it made, how it made them, and the composition of the agent.</p><h2>What data do you want for your agents writing code?</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6mt9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6mt9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.png 424w, https://substackcdn.com/image/fetch/$s_!6mt9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.png 848w, https://substackcdn.com/image/fetch/$s_!6mt9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.png 1272w, https://substackcdn.com/image/fetch/$s_!6mt9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6mt9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.png" width="440" height="240.355871886121" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:614,&quot;width&quot;:1124,&quot;resizeWidth&quot;:440,&quot;bytes&quot;:41658,&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://davenporter.substack.com/i/202286571?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.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_!6mt9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.png 424w, https://substackcdn.com/image/fetch/$s_!6mt9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.png 848w, https://substackcdn.com/image/fetch/$s_!6mt9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.png 1272w, https://substackcdn.com/image/fetch/$s_!6mt9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32cbfee-8fda-4b1f-84ee-54332d173110_1124x614.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"><svg role="img" 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"><g><title></title><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"><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"><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>Let&#8217;s start with a simple example. You have code in a git repository. The commit history represents the changes that have been made to a repo over time. Specifically, history has the files that changed at each commit hash, and a message of varying quality.</p><p>With a coding agent, you have the representation of the agent at a point in time (the model used, instructions, tools accessible, etc.), and the sessions or history of the agent working on the code.</p><p>One of the first things we need to do is think about the <em>metadata</em> to track. For each commit our agent checks in, we minimally would want:</p><ul><li><p>The git commit SHA the agent made</p></li><li><p>The version or identifier of the agent at a particular point in time</p></li><li><p>The actual log of the agent session that built the code</p></li></ul><p>Git generally has some constraints about the payload sizes that we could check in to a repo, and logs are a hard proposition because these can grow very quickly with the amount of work agents can do.</p><p>However, for commits, we could enforce that we add metadata about the agent that we could use to look up agent components as needed. This is a simple but good starting point. </p><p>We also need to think about the <em>observability</em> of the system the agent is building. Code is the current &#8216;plan&#8217; of the system. We also want the &#8216;as works&#8217; version of the system so our agent is better at understanding how its actions impact the resulting system.</p><h2>Creating an agent lineage system: from agent to code to deployment</h2><p>Like many &#8216;agentic&#8217; things, this example is really focusing on the <em>lineage</em> of an agent. We do similar in data management today. In <em>row level lineage</em>, we add identifiers to trace a row of data throughout a system, including transformations and aggregations. This way, if something goes wrong, we can trace back to a source system or step. However, this type of lineage is the most expensive. We may choose to only do <em>column level</em> or <em>dataset level</em> lineage if we can sufficiently see data suppliers, inputs, transformation steps, output, and customers at one of these levels for fixes. </p><p>Let&#8217;s bring this to a more realistic coding agent example:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mj6k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mj6k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png 424w, https://substackcdn.com/image/fetch/$s_!mj6k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png 848w, https://substackcdn.com/image/fetch/$s_!mj6k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png 1272w, https://substackcdn.com/image/fetch/$s_!mj6k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mj6k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png" width="1456" height="376" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:376,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85359,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://davenporter.substack.com/i/202286571?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.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_!mj6k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png 424w, https://substackcdn.com/image/fetch/$s_!mj6k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png 848w, https://substackcdn.com/image/fetch/$s_!mj6k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png 1272w, https://substackcdn.com/image/fetch/$s_!mj6k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68295303-f33c-4b2e-bcec-7348d4f5aba6_2174x562.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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>We need to trace the agent&#8217;s lineage from &#8216;what&#8217;s running&#8217; backward to the specific agent code that was used for code commits. Minimally, we need to leave enough breadcrumbs, or identifiers, so we can tie each stage of the system together.</p><p>From code to deployment, this may be metadata for a container that contains the specific commit SHA that the container was built from, or a git release tag.</p><p>Working back, we may need to store the agent&#8217;s SHA as a part of the PR or other code history. And for each agent session, we need the version or commit SHA representing the configuration and design of that agent at that specific point in time.</p><p>This is somewhat easy to do in this particular example because we&#8217;re talking about 1 code commit. But part of the point of agentic development is how we can do this at scale. This is where we need a system of record. Luckily, we&#8217;ve been doing this for a while in data engineering; we need to bring some of these principles to agent building also.</p><h2>Build an agent warehouse for observability and scale</h2><p>An agent warehouse is simply a data warehouse but for the purposes of managing agents, and in this case, the artifacts they create and manage. You could use any other type of datastore. For this, we&#8217;ll keep it simple as a database where we can store all of our information, including unstructured logs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b4Hn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b4Hn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png 424w, https://substackcdn.com/image/fetch/$s_!b4Hn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png 848w, https://substackcdn.com/image/fetch/$s_!b4Hn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png 1272w, https://substackcdn.com/image/fetch/$s_!b4Hn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b4Hn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png" width="591" height="367.345467032967" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16040858-560a-4942-97e4-a960a47205f6_1838x1142.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:905,&quot;width&quot;:1456,&quot;resizeWidth&quot;:591,&quot;bytes&quot;:120120,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://davenporter.substack.com/i/202286571?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.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_!b4Hn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png 424w, https://substackcdn.com/image/fetch/$s_!b4Hn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png 848w, https://substackcdn.com/image/fetch/$s_!b4Hn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png 1272w, https://substackcdn.com/image/fetch/$s_!b4Hn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16040858-560a-4942-97e4-a960a47205f6_1838x1142.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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>We use <em>writers</em> that sink our metadata and transaction data from each of our primary sources. These could be things like:</p><ul><li><p>Skills and MCPs for our agent to write out telemetry to a specific location, or a logs collector</p></li><li><p>Git hooks and syncs to store our code</p></li><li><p>Using Cloud Observability suites to get our deployment logs and data</p></li></ul><p>Once we have all this data in a common location, we can start applying transformations to this to bring together different attributes and build our lineage for specific commit SHAs or agents. This is highly useful:</p><ul><li><p>First, by having a full span, we can see the impact of the agent&#8217;s behavior on the end system. This allows us to understand the downstream implications of agent behavior.</p></li><li><p>Next, by understanding the behavior, we can further tune our code agents. This may be something like adding or modifying agent skills, or even fine tuning a model based on our specific code usage.</p></li><li><p>And last, by entering the virtuous cycle of improvement, we can refine the agents to ultimately write and ship better code in the process.</p></li></ul><p>For different code bases or agents, your transformations may vary, but they will likely follow a similar flow where you build lineage or spans, and then analyze the information. Here, using an LLM to rate spans and provide critical feedback is a good pattern to start with.</p><h2>The limits of git when storing agent data</h2><p>When you&#8217;re getting started, I actually think it&#8217;s pretty easy to just package your agent information and skills into the code repository you&#8217;re working with. For a 0 to 1 type pattern or prototype, this keeps things simple.</p><p>But the issue with this approach becomes scale. While you want all agents to have a common understanding of how to work with a specific repo, you also have <em>agent </em>specific information for how an agent should act across all code bases. In this example, you&#8217;ll have some coded aspects of the agent, and also knowledge the agent(s) accumulate over time. You have to design a system (such as the logical design above) to plan for this.</p><h2>Implement agent lineage</h2><p>I started working on a localized system for this using a session journal <a href="https://github.com/davenportjw/agent-skills/tree/main/.skills/session-journal">skill</a>. My colleague Guillaume also has a great <a href="https://glaforge.dev/posts/2026/06/11/antigravity-brain-visualizer/">example</a> of analysis on local Antigravity logs. I encourage you to see how these approaches are treating summarization with LLMs.</p><p>I&#8217;ll be publishing more code examples on these types of patterns in the coming weeks, but take the time to learn data engineering basics in the meantime as managing state in agents is increasingly one of the biggest bottlenecks to scale.</p><p>Happy Tuesday!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.com/p/how-to-track-ai-agent-lineage-and?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://davenporter.substack.com/p/how-to-track-ai-agent-lineage-and?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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></p>]]></content:encoded></item><item><title><![CDATA[WIBTD/W/M: A fool's folly with local AI models]]></title><description><![CDATA[Failures, learnings, and hopefully good next steps to being realistic about developing AI models and methods]]></description><link>https://davenporter.substack.com/p/wibtdwm-a-fools-folly-with-local</link><guid isPermaLink="false">https://davenporter.substack.com/p/wibtdwm-a-fools-folly-with-local</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Thu, 11 Jun 2026 19:18:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8Msv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.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_!8Msv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Msv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!8Msv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!8Msv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!8Msv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Msv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7552006,&quot;alt&quot;:&quot;The road to nowhere, brought to you by learning pain.&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://davenporter.substack.com/i/201642769?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The road to nowhere, brought to you by learning pain." title="The road to nowhere, brought to you by learning pain." srcset="https://substackcdn.com/image/fetch/$s_!8Msv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!8Msv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!8Msv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!8Msv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f477307-d5ed-4a54-8037-ede9026b8c86_2816x1536.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"><svg role="img" 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"><g><title></title><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"><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"><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>When I originally come up with the &#8216;What I built this &#8230;.&#8217; concept, it was about sharing things I built that I thought might be useful with the community make AI and cloud computing things easier.</p><p>This week, it&#8217;s a bit different of an article. I&#8217;ve been really into local and open models. I think they have a lot of potential and may represent the future of where AI workloads run, in particular at the edge. But I also ran into a lot of struggles in a recent folly, and I&#8217;ve chosen to document them here for everyone as learnings I&#8217;ve had.</p><h2>The goal: rebuild the Samsung Tiny Recursive Model pattern with Gemma 4</h2><p>Say what you want about the goal, but I&#8217;ve been fascinated by the <a href="https://arxiv.org/abs/2510.04871">Samsung SAIL team&#8217;s paper </a>about how a 7 million parameter model can outperform an LLM at problem solving tasks. </p><p>So I set out to try to build a similar pattern, but using a 'smaller&#8217; Gemma 4 model with it instead of a custom trained model. In this case, Gemma 4 2B.</p><p>The code based development for this actually wasn&#8217;t too bad, there are a few gotchas that I&#8217;ll highlight, but a lot of my pain came in re-discovering things in local and open AI that became large blockers to success. You can find my code <a href="https://github.com/davenportjw/recursive-model">here</a>.</p><h2>The RAMpocalypse is real</h2><p>If you&#8217;re on Mac, LM Studio is by far the easiest app I&#8217;ve found to get up and running with local models. It abstracts a lot of the packaging and runtime choices you need to make.</p><p>Getting started with Gemma 4 is equally easy. You download the model, then load it into memory to get started.</p><p>Here&#8217;s the hard part. All of my machines are either 16GB unified memory (aka Macs) or 16GB RAM mini PC&#8217;s. I have one gaming computer with a Radeon 9070 we&#8217;ll talk about here at the end, but the point was to be able to run models in my office, and everything except said gaming PC is there.</p><p>I quickly discovered that any model north of about 8GB size will make all of these computers come to a crawl. At one point, between my coding IDE, loading a model, and Chrome, I had a 48GB swap that MacOS was valiantly trying to manage, but just couldn&#8217;t do it. </p><p>Development is simply difficult with a 16GB device, and it&#8217;s highly limiting to scaling in communities. I haven&#8217;t touched fine tuning much, but at one point it took 90 minutes for a single tuning pass.</p><p><strong>Insight: </strong>Anything serious with models requires an outsized investment. People who are running things locally today have already invested and have capacity to grow. Those who want to learn will be constrained by the physical limitations of hardware.</p><p><strong>Learning: </strong>I&#8217;m planning to do a lot more in Q3 about how to learn with local models given the limitations I&#8217;m discovering to make it more accessible for everyone.</p><h2>AI Runtimes and configurations remind me of the early Hadoop days</h2><p>Let&#8217;s assume we&#8217;ve gotten the hardware problem fixed. The next question is how you&#8217;re going to run models, and what configurations matter the most. </p><p>Ever heard of <a href="https://rocm.docs.amd.com/en/latest/how-to/rocm-for-ai/inference/llm-inference-frameworks.html">ROCm</a>? I hadn&#8217;t until going down this path recently. The runtime community is improving rapidly, but the experience is incredibly uneven across hardware types and suites. In a non-NVIDIA stack, the variability and compatibility of software to hardware to models is all over the place (see recent results from people trying to use the newest Intel B70, a value 32GB but with a lot of software compatibility issues).</p><p>Want to run a model with MLX on MacOS? The model you download is a different type than GGUF used elsewhere. Want to deploy whatever you built? You&#8217;ll have to make sure you understand where it&#8217;s going to be run in order for it to be compiled properly.</p><p>These are just two choices. If you consider iGPUs and CPU model runtimes, you&#8217;re probably going to need llama.cpp but need to learn all the settings.</p><p>Coming back to the header, this reminds me when Hadoop was young. You had to know the specific version of file types you used, trade offs of file types, the runtime that was used to build them, and what use case you were actually doing to pick the runtime to use for your workload.</p><p><strong>Insight: </strong>This market is immature, but luckily it&#8217;s evolving quickly. Understand where you&#8217;re going to run all this in advance, pick common components wherever possible, and be acutely aware of the tradeoffs. Use LLM&#8217;s for research.</p><p><strong>Learning: </strong>Similar to above, there&#8217;s just not much out there for someone to get started or go from 101 to 201. That said, the community answers are really good when you know what you&#8217;re looking for, but if you want to try this at home, pick the most popular hardware and software to make your life easy (do as I say, not as I did).</p><h2>Evaluation is still the big question</h2><p>Hardware and software learnings aside, I&#8217;m coming back to the hardest thing when doing this work I&#8217;ve found, which is a good eval dataset and training / test data to support it.</p><p>In the recursive models example, I&#8217;m using HumanEval, but the model tuning is struggling with the iterations required given hardware constraints, and I find myself asking more philosophical questions about what a &#8216;good eval&#8217; actually looks like. </p><p>At one point, when I did a test, the model changes went from 0% to 100% passed on a sample of evals, but I&#8217;ve been peeling that back to make sure there&#8217;s no overfit on each pass to a question or test set.</p><p><strong>Learning: </strong>I&#8217;m planning to spend a significant amount of my time in the coming weeks getting in depth with some of the leading and popular evaluation frameworks to build my own understanding of how they work, what they are actually measuring, and the input datasets. For people and organizations building agents and models, this is the critical piece.</p><h2>Meanwhile, DiffusionGemma is released</h2><p>While I was doing all of this, Google (my employer) just released DiffusionGemma 4, which is aware of leading and trailing tokens in a prediction. This might have been the best approach to start with over my recursive one, but I&#8217;m going to keep going and see how far I can do this. </p><h2>The next steps in my local AI journey</h2><p>Now you could probably also ask &#8216;does this person know what they are even doing?&#8217;. It&#8217;s probably a fair question. I&#8217;m a believer in learning by trying, failing, and trying again. I've found my questions and searches are getting better, and I&#8217;m getting precise about issues. But I&#8217;m less than 1% in on this journey, and while it&#8217;s been incredibly frustrating, it&#8217;s also surprisingly rewarding.</p><p>Remember that gaming PC I mentioned? Well now I&#8217;m looking to get a Radeon R9700. 32GB of vRAM seems to be a good buffer size active parameter models and models below about 16GB in size, and I&#8217;m curious how it turns out. </p><p>Could I do all of this in the cloud? Yeah, but that&#8217;s not really living most developers experiences now, is it?</p><p>Hit me up with things you&#8217;ve found useful learning about all this so we can all upskill in this process.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.com/p/wibtdwm-a-fools-folly-with-local?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://davenporter.substack.com/p/wibtdwm-a-fools-folly-with-local?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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></p>]]></content:encoded></item><item><title><![CDATA[With AI, what's old is new in telemetry again]]></title><description><![CDATA[Why tracing is critical to improving your AI experiences]]></description><link>https://davenporter.substack.com/p/with-ai-whats-old-is-new-in-telemetry</link><guid isPermaLink="false">https://davenporter.substack.com/p/with-ai-whats-old-is-new-in-telemetry</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Tue, 09 Jun 2026 16:45:40 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/62a44077-b0ed-46d2-a4fc-884e3837c835_890x284.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I remember a demo with an observability vendor back in 2019. We were setting up a big data app, and they showed us a cool topology map of a request, how it flowed through multiple API&#8217;s, and ultimately queried a database we were configuring. The demo was great, but it turns out that setting up tracing throughout the stack was substantially more difficult than we&#8217;d planned, and it cost a lot more to run with all of the data it was generating. Ultimately, we shelved the work.</p><p>So why is tracing so important now with AI?</p><h2>An example of two requests</h2><p>Let&#8217;s say there is an AI agent (a coding agent, support agent, doesn&#8217;t really matter) that intakes a request (intent) from a user, has an internal agentic loop, and ultimately should satisfy the request (intent).</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UINL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UINL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png 424w, https://substackcdn.com/image/fetch/$s_!UINL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png 848w, https://substackcdn.com/image/fetch/$s_!UINL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png 1272w, https://substackcdn.com/image/fetch/$s_!UINL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UINL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png" width="474" height="55.994505494505496" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/da6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:172,&quot;width&quot;:1456,&quot;resizeWidth&quot;:474,&quot;bytes&quot;:20157,&quot;alt&quot;:&quot;Flow of an agent in a very simple example&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://davenporter.substack.com/i/201324589?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Flow of an agent in a very simple example" title="Flow of an agent in a very simple example" srcset="https://substackcdn.com/image/fetch/$s_!UINL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png 424w, https://substackcdn.com/image/fetch/$s_!UINL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png 848w, https://substackcdn.com/image/fetch/$s_!UINL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png 1272w, https://substackcdn.com/image/fetch/$s_!UINL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda6e3dba-2b91-46a0-bac0-7b49e0f7090a_1470x174.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>This is a very simple example of the flow, where the agent is performing work. Let&#8217;s assume that you&#8217;ll have multiple users or requests that match intents. Ideally, the flow of each session looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-jax!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-jax!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png 424w, https://substackcdn.com/image/fetch/$s_!-jax!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png 848w, https://substackcdn.com/image/fetch/$s_!-jax!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png 1272w, https://substackcdn.com/image/fetch/$s_!-jax!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-jax!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png" width="519" height="165.6134831460674" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:284,&quot;width&quot;:890,&quot;resizeWidth&quot;:519,&quot;bytes&quot;:21712,&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;:false,&quot;internalRedirect&quot;:&quot;https://davenporter.substack.com/i/201324589?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5695e782-8544-4154-8a58-ddc0afef3f16_890x284.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_!-jax!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png 424w, https://substackcdn.com/image/fetch/$s_!-jax!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png 848w, https://substackcdn.com/image/fetch/$s_!-jax!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png 1272w, https://substackcdn.com/image/fetch/$s_!-jax!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265fd6e2-b5d3-4280-b07e-00c6773e2adb_890x284.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>This would be an ideal state where similar or matched intents, when clustered together, yield similar or matched outcomes when the agent does work.</p><p>However, when you factor in model non-determinism, various tool calls and definitions, and other things like specific context or data the model has access to, this ends up looking something more like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iAc5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iAc5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png 424w, https://substackcdn.com/image/fetch/$s_!iAc5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png 848w, https://substackcdn.com/image/fetch/$s_!iAc5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png 1272w, https://substackcdn.com/image/fetch/$s_!iAc5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iAc5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png" width="480" height="425.04672897196264" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:758,&quot;width&quot;:856,&quot;resizeWidth&quot;:480,&quot;bytes&quot;:30549,&quot;alt&quot;:&quot;How agent intents actually vary in outcome heavily.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://davenporter.substack.com/i/201324589?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="How agent intents actually vary in outcome heavily." title="How agent intents actually vary in outcome heavily." srcset="https://substackcdn.com/image/fetch/$s_!iAc5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png 424w, https://substackcdn.com/image/fetch/$s_!iAc5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png 848w, https://substackcdn.com/image/fetch/$s_!iAc5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png 1272w, https://substackcdn.com/image/fetch/$s_!iAc5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112593a7-e5c2-412c-9e30-db2eefed1393_856x758.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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>So how do you figure out what went wrong? We could observe some things our agent may have performed like tool calls out to other API&#8217;s or databases, but we need to look at the <em><a href="https://docs.langchain.com/langsmith/trajectory-evals">trajectory</a></em> and the <em><a href="https://www.langchain.com/articles/llm-evaluation-framework">reasoning chain</a></em> that yielded a particular good or bad outcome, analyze them, and then modify our agent or other components.</p><h2>Why does tracing help?</h2><p>In the example above, we need to see the <em>internal</em> and <em>external </em>work the agent performed, the timelines the work was performed in, and in what order the work was done for a particular intent or outcome. Tracing gives us the ability to string all of these together. Even better, we can enable tracing that gives us the full prompts and responses for each turn of the agent so we can see, in detail, what actually happened and when. </p><p>In 2019, this was a nice to have, but this is becoming a requirement to budget for and implement when working with agents. Not only does it help for building better agents, but it improves the observability for things like regulations when we need to show <em>why</em> agents perform a particular task and what they did.</p><h2>Tracing applied to our example</h2><p>Let&#8217;s assume we&#8217;ve added tracing to our agent example. You can do this with OpenTelemetry and built in extensions in most agent frameworks (<a href="https://adk.dev/integrations/cloud-trace/">Google ADK example here</a>).</p><p>Now, let&#8217;s assume we have two users that asked a question about their bill last month, and why it was so high. </p><p>Using tracing, we now have access to more data points. For example, we could see that for one customer, the agent may have properly found the customer&#8217;s information, but the bill for last month had not been processed yet. As a result, the agent only had access to information that was two months old, and the resulting outcome wasn&#8217;t correct due to data access.</p><p>In another example, we have a coding agent. In one flow, the coding agent had access to a repository but chose to use <code>grep</code> to search for the changes required instead of using an <code>AST</code> or tree based tool to find functions. By having access to the internal thoughts and steps, we can determine if, in this example, we need to further tune our MCP tool definitions or even our skill so the agent is better equipped for what to use and when.</p><p>And, we can use LLMs to improve LLM quality by providing all of this information to agents with specific tasks.</p><h2>Implementing tracing</h2><p>In the observability stack, access to real time traces, metrics, and logs are table-stakes for agentic development and runtimes. </p><p>Look in the frameworks you&#8217;re using to start seeing how you can implement the default tracing abilities. Keep in mind that a substantial portion of agentic system cost is actually on the observability and control around the agent, not the agent itself. Budget accordingly.</p><p>And last, make sure you&#8217;re thinking about data security. When you are exporting traces, in most cases you will need the full logs to figure out what happened. But that doesn&#8217;t mean you should necessarily give everyone or an improvement agent access to personally identifiable data, and you should be aware what you can use for training and improvement in your customer agreements and regulations (ex GDPR).</p><p>Hope you enjoyed this weeks post!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.com/p/with-ai-whats-old-is-new-in-telemetry?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://davenporter.substack.com/p/with-ai-whats-old-is-new-in-telemetry?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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></p>]]></content:encoded></item><item><title><![CDATA[WIBTD/W/M: Routing AI responses between local runners]]></title><description><![CDATA[Extending smartrouter to support calling local AI models that are a part of a pool of workers, learnings and tribulations, and things I'm planning to do next]]></description><link>https://davenporter.substack.com/p/wibtdml-routing-ai-responses-between</link><guid isPermaLink="false">https://davenporter.substack.com/p/wibtdml-routing-ai-responses-between</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Thu, 04 Jun 2026 20:38:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Qz0O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been fascinated with local models more and more recently. These are the open models you can download and run on your laptop.  It&#8217;s been really cool starting to use these with things like LMStudio on my Mac, but I&#8217;ve been thinking more also about how you can run and distribute LLM requests to these models across different machines and fleets, and it&#8217;s a little different than just running a cluster or service.</p><p>So my goal this past week was to build a service that could take requests centrally, route them out to local models, and pull them back to the user. <strong>Why? </strong>There&#8217;s a ton of examples out there calling a local model directly, but when you have a fleet of models and agents / users that can call them, you need some way to manage the chaos and deployments. <a href="https://github.com/davenportjw/smartrouter">Smartrouter</a> provides logging and monitoring for these calls, and we can extend it to support &#8216;local AI&#8217;. </p><p>So how did I build it? First, research about how I should run local AI.</p><h2>Considerations for running local AI</h2><p>This is by no means an exhaustive list but incorporate some of the things I&#8217;ve thought about and read up on as I&#8217;m getting up to speed on local AI, keeping in mind the goal is concurrency and increasing the number of requests a cluster could serve for a particular model type.</p><p>First thing I&#8217;ve been reading up on is how to run local AI in clusters. This isn&#8217;t so much an activity like database sharding, more like how you can run multiple services. And there&#8217;s complexity here where if you try to run a large model, you need to take into account how to shard a model across things like different GPU&#8217;s based on vRAM size. In the example of concurrency, we can scale up here with faster GPU&#8217;s or storage like Lustre for model loading. But if we&#8217;re constrained by something like cost (so no GPU usage), or limited to the devices we have (I have 2 AMD Ryzen 5 NUC&#8217;s), that doesn&#8217;t really work. I&#8217;m looking to <em>scale out</em>.</p><p>So, in this example, what I really want is a fleet or pool of workers that take items, work them, and put them back. And there are a number of great existing examples of using queues and workers to complete tasks. So I decided to implement this pattern in smartrouter for local routing.</p><h2>How the local cluster works in smartrouter</h2><p>Smartrouter allows you to register machine runners into a &#8216;local cluster&#8217;, which is a logical service representation. This contains a queue for worker requests, the models available to serve, and any additional queueing or execution limitations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qz0O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qz0O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png 424w, https://substackcdn.com/image/fetch/$s_!Qz0O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png 848w, https://substackcdn.com/image/fetch/$s_!Qz0O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png 1272w, https://substackcdn.com/image/fetch/$s_!Qz0O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qz0O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png" width="1456" height="827" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:827,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:378415,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://davenporter.substack.com/i/200646366?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.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_!Qz0O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png 424w, https://substackcdn.com/image/fetch/$s_!Qz0O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png 848w, https://substackcdn.com/image/fetch/$s_!Qz0O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png 1272w, https://substackcdn.com/image/fetch/$s_!Qz0O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ea131e-69ae-4f17-b24d-f6f5739a6a7e_2626x1492.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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>Next, you can use the existing router architecture to route requests through smartrouter to the local clusters. This includes dynamic routing.</p><p>Here&#8217;s an example of a request that does a few things: first, it routes to a local model. Next, the router actually changes which model the request gets sent to based on the routing rules. Then the runner picks up the request from the queue, works it, and publishes it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eAx0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eAx0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png 424w, https://substackcdn.com/image/fetch/$s_!eAx0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png 848w, https://substackcdn.com/image/fetch/$s_!eAx0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png 1272w, https://substackcdn.com/image/fetch/$s_!eAx0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eAx0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png" width="1456" height="395" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:395,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:124765,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://davenporter.substack.com/i/200646366?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.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_!eAx0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png 424w, https://substackcdn.com/image/fetch/$s_!eAx0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png 848w, https://substackcdn.com/image/fetch/$s_!eAx0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png 1272w, https://substackcdn.com/image/fetch/$s_!eAx0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb8f84c-492d-4d70-8874-1eb346220394_2280x618.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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>A <em>runner </em>in smartrouter is like a machine agent. It registers itself with smartrouter and uses llama.cpp to pull down the model to run. I&#8217;ve created an example using Kubernetes pods that also allow you to run pure CPU or GPU inference, and I&#8217;m working on a Mac and Linux version next (the Mac code exists but I haven&#8217;t been able to give it a thorough working through yet).</p><p>We can also test smartrouter local agents by creating a key just like any other app registered and routing to the appropriate &#8216;model&#8217;:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;f7d32389-7bba-4684-bc57-8b0a19f348a6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">curl -s -X POST "https://gemini-smart-router-your-url-hash-uc.a.run.app/v1/models/gemma2:2b:generateContent" \
      -H "x-goog-api-key: gr_local_cluster_verify_key" \
      -H "X-Client-App-ID: app-local-verify" \
      -H "Content-Type: application/json" \
      -d '{"contents": [{"parts": [{"text": "Write a 3-word quote about coding."}]}], "generationConfig": {"maxOutputTokens": 10}}'</code></pre></div><p>And get a result back:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;921438b6-4243-492f-8656-9592f9126521&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Target Endpoint: https://gemini-smart-router-your-url-hash-uc.a.run.app
------------------------------------------------------------
&#128172; Gemma: "Code, debug, deploy." 
&#128172; Gemma: **Code, create, solve.** 
&#128172; Gemma: "Code it, fix it, thrive." 
&#128172; Gemma: **"Code, Create, Connect."** 
&#128172; Gemma: "Code makes reality." 
&#128172; Gemma: **Lines, logic, build.** 
&#128172; Gemma: **Code. Create. Conquer.** 
&#128172; Gemma: **Write code, build dreams.** </code></pre></div><h2>Feats and pain using AI for development</h2><p><strong>Feat: </strong>Once we defined the desired architecture, LLM&#8217;s are pretty good at writing kubernetes specs in particular and running a playbook. When we got to this point, the process was a lot easier.</p><p><strong>Feat: </strong>The rework cycle is dramatically shorter. I explored some earlier concepts about clusters and runners, and while they worked, the data model needed some heavy revisions to support scaling. LLM&#8217;s make this work significantly faster, to the point that you sometimes have to make sure you didn&#8217;t throw too much out the window.</p><p><strong>Pain: </strong>Definitions really matter. In the first iteration of my local implementation, I called the machine agent an &#8216;agent&#8217;. And that created a number of comprehension problems for the LLM where changes would be made both on the frontend of smartrouter and in the machine agent, which I obviously did not want. After a few rounds of this, I went back to the drawing board and defined very clear and different terms in the application&#8217;s terminology. This helped the LLM generate better context for each of my reuqests going forward. </p><p><strong>Pain: </strong>LLM&#8217;s still like to tell you it worked even though it didn&#8217;t. When I do iterative development, I like to use test driven design, but even that has flaws with the human. The tests look fine, but LLM&#8217;s I&#8217;ve found have a tendency to try to mock services to pass tests rather than run the request to the ground. I also ran into a few instances where a &#8216;200&#8217; was not in fact a success. My learning here is to continue to build out my agent skills on testing so its clear what my expectations are, in this case no mocks in this code and real logs to prove it.</p><h2>Next steps</h2><p>Download and try smartrouter here: <a href="https://github.com/davenportjw/smartrouter">https://github.com/davenportjw/smartrouter</a></p><p>Let me know what you find / excites you / frustrates you!</p><p>I&#8217;m planning to extend smartrouter next week to support more dynamic routing requests and implement more analytic capabilities for routing. Cost in particular is a vector I hear a lot about, and mining current information for future learning is top of mind in a number of areas. Look for more on this in the next few weeks.</p><p>Also, I&#8217;m exploring cool concepts others have in this space, for example Matthew Tracy&#8217;s implementation of a router here: <a href="https://github.com/MatthewTracy/yagami">https://github.com/MatthewTracy/yagami</a></p><p>There&#8217;s a lot of good stuff here.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.com/p/wibtdml-routing-ai-responses-between?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://davenporter.substack.com/p/wibtdml-routing-ai-responses-between?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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[What's worth learning in an AI era?]]></title><description><![CDATA[How AI has changed the question from how to learn quickly to if learning will be useful.]]></description><link>https://davenporter.substack.com/p/whats-worth-learning-in-an-ai-era</link><guid isPermaLink="false">https://davenporter.substack.com/p/whats-worth-learning-in-an-ai-era</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Tue, 02 Jun 2026 17:12:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Sjl6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I grew up when the internet in the US was just beginning its widespread adoption and I remember the first time we got high speed internet (we were the first on the block). It was unlike anything else we&#8217;d had, and put a trough of information quite literally at our fingertips. </p><p>The internet era question for skill building quickly became a question of <strong>&#8216;how do I Google to learn this?&#8217;</strong>. Those that are good at searching for the answer built a system where they can quickly sift through different materials, links in this case, to find the information they need. One of my favorite interview questions was asking someone how they search for something they don&#8217;t know, and seeing the thought process for how people reach the desired answer.</p><p>When you combine this with good rote understanding, you had a superpower for executing work. But in the AI era, how much of this is still relevant?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Sjl6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sjl6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!Sjl6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!Sjl6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!Sjl6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sjl6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9435726,&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://davenporter.substack.com/i/200325862?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.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_!Sjl6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!Sjl6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!Sjl6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!Sjl6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc995ca8d-9765-4875-80b6-3631d7a35749_2816x1536.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"><svg role="img" 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"><g><title></title><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"><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"><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><h2>The key question now is &#8216;do I need to learn this&#8217;?</h2><p>LLM&#8217;s can return responses back to us faster than anything to date, and in increasingly high reliability. I&#8217;d argue that the main question now isn&#8217;t &#8216;<em>how do I find the information&#8217;</em> but &#8216;<em>do I need to learn this information</em>&#8217;? Being able to situationally apply this continues to show how high performers continue to outperform with AI, and it builds on the first two skillsets of architectural understanding, and the ability to know how to find the right information.</p><p>Take an example where you&#8217;ve asked an LLM to write a new feature for an application based on a prompt. There are hard skills we&#8217;re all continuing to learn about prompt and context engineering. But the real challenge comes in managing the response.</p><p>In the example prompt, we may ask the LLM to create a new login feature for a website. The LLM can build any number of pieces of this including authentication patterns, deployment patterns, and things like jwt tokens to make sure a user can call other services. But let&#8217;s assume we&#8217;ve never worked with login and auth before. What of this do we need to learn, if anything? This is the new challenge when we can create faster than ever.</p><h2>My learning plan</h2><p>Understanding what to learn is quickly becoming a new and desirable skillset, in particular when you have do this rapidly. Here are my thoughts on how I do this:</p><ol><li><p>Being a consultant at heart, I&#8217;ve always valued the <a href="https://corporatefinanceinstitute.com/resources/management/t-shaped-skills/">T shape of knowledge</a>. If I&#8217;m doing something with an LLM, I usually try to minimally understand the high level concepts. So in this example above, I&#8217;ll read up on basic auth patterns or ask the agent to explain its coding behavior to me.</p></li><li><p>Next, I usually ask the question &#8216;do I need to do this once, or will I need to do this repeatedly&#8217;. This question helps me prioritize if I need to move on to increase my knowledge depth.</p></li><li><p>If I need to increase my depth, I&#8217;ll typically keep asking the agent or move back to &#8216;Googling that&#8217; to find some informative articles. I leverage adjacent skills in my &#8216;T&#8217; to increase my knowledge depth. For something like authentication, I will cross apply domain knowledge on testing to create different conditions.</p></li><li><p>If I need to increase by breadth in a topic that I don&#8217;t know but should, I find myself using more NotebookLM, or Youtube videos on in the background to read up. Some of these are fun topics like doing home work where I need to get better at breadth in order to improve my ability to prompt. The generalized T here does still go a long way in providing incremental value to LLM usage.</p></li></ol><h2>Applying this in your work</h2><p>With AI I think it&#8217;s important to highlight that, just like &#8216;Googling that&#8217;, there&#8217;s no single strategy that is the best, although there are probably 5 to 10 that work well. A lot of this comes down to practice and repetition. In AI this can feel exhausting with the amount of information you have to go through in much shorter windows. It also feels somewhat evolutionarily opposed: we still need 30 days to build habits, so use it but remember this is a marathon, not a sprint.</p><p>Hope this is useful! Happy Tuesday!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.com/p/whats-worth-learning-in-an-ai-era?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://davenporter.substack.com/p/whats-worth-learning-in-an-ai-era?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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[What I'm building this week: Route your Gemini API calls on your terms]]></title><description><![CDATA[A little router I'm building and improving to use different Gemini (and soon other) models.]]></description><link>https://davenporter.substack.com/p/what-im-building-this-week-route</link><guid isPermaLink="false">https://davenporter.substack.com/p/what-im-building-this-week-route</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Thu, 28 May 2026 16:02:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!P9pV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A question I&#8217;ve received a few times recently is how companies can route Gemini API calls based on their own rules and specs. This usually includes a few things:</p><ul><li><p>How to route calls based on more of a central governance model than letting any developer pick any model for their app</p></li><li><p>How you could dynamically route based on some complexity map</p></li><li><p>or How to control some level of app throttle (including dealing with 429&#8217;s from specific models)</p></li></ul><p>So, I built the <em>smartrouter </em>app over the past two weeks, and I&#8217;m intending to extend it further.</p><h2>What is smartrouter and what does it do?</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P9pV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P9pV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png 424w, https://substackcdn.com/image/fetch/$s_!P9pV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png 848w, https://substackcdn.com/image/fetch/$s_!P9pV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png 1272w, https://substackcdn.com/image/fetch/$s_!P9pV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P9pV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png" width="1456" height="458" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:458,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113813,&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://davenporter.substack.com/i/199599777?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.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_!P9pV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png 424w, https://substackcdn.com/image/fetch/$s_!P9pV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png 848w, https://substackcdn.com/image/fetch/$s_!P9pV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.png 1272w, https://substackcdn.com/image/fetch/$s_!P9pV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc00875-32d9-47e8-8c98-79c14ec1afab_1561x491.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"><svg role="img" 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"><g><title></title><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"><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"><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>Very simply, <a href="https://github.com/davenportjw/smartrouter">smartrouter</a> is compliant with a subset of the Gemini SDK. It allows you to specify a custom endpoint and model type. Then, the call is routed to smartrouter, which runs on Google Cloud Run. It&#8217;s just a container with some services though, so you could run this elsewhere if you wanted.</p><p>Here&#8217;s the architecture:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cU1G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cU1G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png 424w, https://substackcdn.com/image/fetch/$s_!cU1G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png 848w, https://substackcdn.com/image/fetch/$s_!cU1G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png 1272w, https://substackcdn.com/image/fetch/$s_!cU1G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cU1G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png" width="1096" height="876" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:876,&quot;width&quot;:1096,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:121197,&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;:false,&quot;internalRedirect&quot;:&quot;https://davenporter.substack.com/i/199599777?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.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_!cU1G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png 424w, https://substackcdn.com/image/fetch/$s_!cU1G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png 848w, https://substackcdn.com/image/fetch/$s_!cU1G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png 1272w, https://substackcdn.com/image/fetch/$s_!cU1G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6c2c797-6d5a-436b-9ae4-1d64236c7b49_1096x876.png 1456w" sizes="100vw"></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"><svg role="img" 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"><g><title></title><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"><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"><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>For Gemini models, you can specify the Google Cloud region/location you want to run smartrouter in. Then you dynamically detect all of the available models in that region, the multi region of your region, and globally. You can turn models on and off for users to use.</p><p>For requests, these are routed via a <code>gemini-dynamic</code> model. Based on your app you configure, the requests are sent to the models you choose. All requests and metrics are logged via Google Cloud Monitoring and Logging so you can see usage based metrics and track costs in near real time.</p><h2>Features coming soon</h2><p>I&#8217;m a little rusty on my AWS and Azure skills, so I&#8217;m planning to extend this to other clouds and model types as somewhat of a forcing function for me to learn about the updates that have happened since I last used them a few years back. This includes extending the endpoint capabilities to other SDK types.</p><p>I also want to explore more dynamic router methods and I&#8217;m planning to make this more advanced and configurable.</p><p>I&#8217;ll respond to community requests as they come up and are within reason :).</p><h2>How I used AI to do the work</h2><p>Since Antigravity was updated, I've mostly used it to help with the code work. I&#8217;ll work with Antigravity on the feature I want, let it do some coding, and then validate or correct the work. A few quick things I&#8217;ve found work well:</p><ol><li><p>I keep sessions pretty short. I define a small feature, work on it, get the tests done, and then open a new session / conversation.</p></li><li><p>If I need a planning discussion, the only artifact I&#8217;m looking for is a task list to handoff to subsequent sessions to keep the context window small.</p></li><li><p>There were a few features that the agent just struggled with. When this happens, I&#8217;ll usually try a few different approaches. Then I will go back to the <em>old methods</em>, which include Google search. I get a few pages, give these to the agent, and then ask it to correct the work. This pattern works pretty well.</p></li><li><p>As I go along, I ask the agent to update itself. This was part of the inspiration for the session journal, which I intend to extend.</p></li></ol><h2>Next steps</h2><p>The link to get started with smartrouter is: https://github.com/davenportjw/smartrouter</p><p>Try it out, find bugs or enjoy it, and let me know your thoughts!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.com/p/what-im-building-this-week-route?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://davenporter.substack.com/p/what-im-building-this-week-route?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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></p>]]></content:encoded></item><item><title><![CDATA[Can you 'learn' to use AI without being all in?]]></title><description><![CDATA[Explorations about successful learning patterns for AI and how I'm using it currently]]></description><link>https://davenporter.substack.com/p/can-you-learn-to-use-ai-without-being</link><guid isPermaLink="false">https://davenporter.substack.com/p/can-you-learn-to-use-ai-without-being</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Tue, 26 May 2026 16:02:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jgPM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A common pattern I&#8217;ve witnessed with developers and leaders over the past 3-6 months goes something like the following:</p><ol><li><p>Someone is told they should &#8216;try AI&#8217; or has some mandate without a goal.</p></li><li><p>The person installs an AI tool or tries AI in a very specific flow they are accustomed to. AI struggles with a very directive prompt lacking context to the objective, and usually fails. </p></li><li><p>The person assumes that AI is ultimately not helpful and goes back to known ways of doing work.</p></li></ol><p>Honestly, this makes a lot of sense, particularly in the absence of being able to conduct transfer learning from someone who is an expert at prompting and using AI. I was also guilty of this behavior, but I have a few friends at work and a friend personally who were what I consider &#8216;all in&#8217; on AI early, and they quickly shaped my perspective of what is possible when you use AI tools effectively.</p><p>Today, let&#8217;s explore what &#8216;all in&#8217; is, how you find and amplify leaders in your company who are all in, and hopefully give you some starting points based on what AI tools I&#8217;m currently using.</p><h2>What does being &#8216;all in&#8217; mean?</h2><p>In my simple definition, being All in on AI simply means you default to using generative AI or LLMs as your partner or tool first. This doesn&#8217;t mean you&#8217;ve given up control. If anything, this definition, if maximized, maximizes the ability of you, as the individual to exploit as much creativity as possible.</p><h2>Day 1 with AI</h2><p>An easy way to start here is to install a general purpose app or tool of your choice (or allowed corporately), and then design your first prompt to fully &#8216;offload&#8217; a task to the AI agent or model.</p><p>Your goal as you start using AI is to read and learn about the <em>prompting strategies</em> that work or don&#8217;t. A prompt that instructs a model to <code>get the latest 50 results from A table and make a table from that</code> is probably not going to be as successful as a prompt where you provide <em>context</em>, so what the goal is (why are you getting 50 results), and the other relevant information to accomplish the goal. The example above is representative of how I typically see people start with AI in the opening example. Many, if not most, AI tools will struggle as they lack the context to understand the request. </p><p>Moving from directive to <em>intent</em> in prompt strategy is a key learning. If you are using AI to build a machine learning model, consider what would happen if you gave an AI tool the prompt, context, and tools needed to build the model on its own. It will be a struggle the first few times but you&#8217;ll learn about the agent and model preferences, and ultimately be able to scale yourself far faster. You&#8217;re building your own knowledge base about how to use AI and refactoring your work.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jgPM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jgPM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png 424w, https://substackcdn.com/image/fetch/$s_!jgPM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png 848w, https://substackcdn.com/image/fetch/$s_!jgPM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png 1272w, https://substackcdn.com/image/fetch/$s_!jgPM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jgPM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png" width="1456" height="633" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:633,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:105982,&quot;alt&quot;:&quot;Flow of using AI the first time to populate the knowledge base, then subsequently using and refining your knowledge.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://davenporter.substack.com/i/199325483?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Flow of using AI the first time to populate the knowledge base, then subsequently using and refining your knowledge." title="Flow of using AI the first time to populate the knowledge base, then subsequently using and refining your knowledge." srcset="https://substackcdn.com/image/fetch/$s_!jgPM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png 424w, https://substackcdn.com/image/fetch/$s_!jgPM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png 848w, https://substackcdn.com/image/fetch/$s_!jgPM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png 1272w, https://substackcdn.com/image/fetch/$s_!jgPM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fc790d6-b6dd-4daf-953f-37b22f512443_1738x756.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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><strong>Next, </strong>AI is ultimately a team sport. Learnings should be shared, and team member should use the same tools. Each team working on common goals should have a repo for sharing skills, tools, and prompts that are useful with the coding or AI tooling. This commonality streamlines generation and debugging where everyone can help.</p><h3>Day 2+</h3><p>I believe most organizations have pockets of AI usage today, even in organizations that might consider themselves behind. There are other questions about &#8216;shadow AI&#8217; usage that I address in an earlier post to remediate (remember most people are well intentioned, governance needs to enable experimentation with reasonable guardrails).</p><p>The question of &#8216;scaling&#8217; is something I typically give to organization leaders, and it&#8217;s not a complex list:</p><ol><li><p>Share your AI successes and learnings. In an increasing number of companies, I find the leadership being the most extensive AI users. As leaders are more comfortable sharing successes, failures, and learnings, this will give others the confidence to &#8216;try AI out&#8217;</p></li><li><p>If you aren&#8217;t using AI, use it. Of the &#8216;transformation&#8217; paradigms, I&#8217;ve found AI is one where leaders need to <a href="https://blog.staysaasy.com/p/leading-from-the-front">lead from the front</a>.</p></li><li><p>Amplify the champions. Find and celebrate those in the org who are using AI effectively. Learn about what is making AI work for them, and enable governance around the flows users have found work well.</p></li><li><p>Become experts in your business and process. I write about understanding your corporate moat, and why value stream mapping matters in earlier posts. In reality, AI is intertwined with being an expert at your business to keep an advantage. Getting started and becoming an expert mix technical, process, and business capabilities.</p></li></ol><h2>My current AI flows</h2><p>(As of May 2026). Most people know I work at Google so my stack is going to be weighted toward Google tools, but it would be easy enough to swap these out for a number of other options. I view these more about the flow than the tool itself, although some certainly help more than others.</p><h3>Day to day AI</h3><p>My two most used AI products outside of coding tools are as follows:</p><ol><li><p><strong>AI Inbox in Gmail.</strong> This is surprisingly good at taking my inbox and making a to-do list out of it that I can check off for the day. I try to keep an &#8216;inbox minimal&#8217; approach; AI Inbox helps summarize a few threads (sometimes this is where its a little more questionable), but the to-do lists are pretty solid and span across Gmail and other Workspace tools.</p></li><li><p><strong>Gemini in Google Chat.</strong> Working in connection with AI inbox, Gemini in Chat also just helps with the drudgery of punch lists to get done.</p></li><li><p><em><strong>Wildcard: Gemini in Slides and Docs.</strong></em> When these work, they&#8217;re awesome. When they don&#8217;t&#8230;. well, you know. I&#8217;ve found Slides to be good with AI at basic flow charts and Docs to be good at using Gemini to rephrase and summarize with the recent updates, which does help with my conciseness. </p></li></ol><h3>Planning and Coding</h3><p>I&#8217;ll highlight my primary workflows here and also if you wanted to swap out tools, what I&#8217;d probably start with.</p><h3>Planning</h3><ol><li><p><strong>AI Studio or Gemini app. </strong>Usually I find that these do a pretty good job of giving me a list of things that I need to consider or do as a part of starting a project. Most of the time, at least in coding and software engineering, I probably know 75%+ of what needs to happen so I&#8217;m mostly using AI to fill in the gaps. These tools are pretty good here and fast enough that I&#8217;m not waiting.</p></li><li><p><strong>NotebookLM</strong>. If there&#8217;s something I&#8217;m doing (I have one of these projects I&#8217;m starting) where I need to get a good amount of context, I&#8217;ll use NotebookLM along with my good old ability to use Search. I find NotebookLM and Gemini Deep Research to be a bit of a sword. They can scan 50,100,200 articles in a manner of minutes, but sometimes they miss the nuance in creativity that I was searching for. That said, they can also summarize a lot of commonalities at a rate far faster than I could. <strong>Learning: </strong>Use these tools with a purpose.</p></li></ol><h3>Coding</h3><p>I&#8217;m pretty boring here. I use <strong><a href="https://antigravity.google/docs/ide-overview">Antigravity IDE</a></strong> mostly. For whatever reason, the code at left and agent at right view just works for me, in particular with problems that require agent + human co-work. </p><p>I usually have anywhere from 2-4 threads going at once. I try to cap complex work at 1-2 workflows requiring my attention, otherwise I find the context switching for me personally just isn&#8217;t worth it. On the AI adoption levels I&#8217;m probably somewhere between a 4 and 6. </p><p>I have no problem YOLO&#8217;ing, but I find that Gemini in particular can struggle with nuance of time based decision making and implementation (ex. the repo from April 2026 is the one I really wanted even though everything else looked close).</p><p>I&#8217;m hoping to explore more this year full agent handoffs in more complex codebases, which is partially requiring me to build a few codebases. Agents in particular I think you can automate from 0 to 1, but the rails for 1 to N or N to N development aren&#8217;t there yet, nor is the token consumption model that supports this.</p><p>I&#8217;ve never been a heavy CLI user, although I do see the benefits of CLI usage by agents primarily. The SDK is probably the most interesting to me and will fit into some of the experiments below.</p><h3>Experimenting</h3><p>In my flows above, I set a target of trying at least 2-4 things per quarter based on new features that are out and the maturity of the models that we can use at work. This quarter, my list is:</p><ol><li><p>Giving it a real shot with local models and Gemma 4. I&#8217;ve been building a local cluster with some old mini-PC&#8217;s. My colleague wrote about a setup he did <a href="https://www.joe-shirey.com/2026/05/24/always-on-ai-coding-agent.html">here</a>. Mine will probably be similar but I want to lean into the local model benefits and drawbacks as a part of my learning.</p></li><li><p>Implementing <a href="https://stitch.withgoogle.com/docs/design-md/overview">DESIGN.md</a> or giving it the college try. I&#8217;ve read a few articles about the benefits of using DESIGN.md with agentic development and now I want to see if I can really accelerate my frontend work.</p></li><li><p>Standardizing my multi-agent pattern I build with. I&#8217;ve used a few but not enough to consider myself an expert. Local models fall in here somewhere and I&#8217;m hoping to have enough brain space to solidify this by the end of the summer.</p></li></ol><h2>Try things out!</h2><p>The only way I&#8217;ve really learned in this space is being all in. I hope this gives you the confidence to keep trying things out, learning, and trying again with these tools. <a href="https://learningpit.org">The learning pit</a> is a real concept we all go through, AI just amplifies the ups and downs and compacts the overall time spent.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.com/p/can-you-learn-to-use-ai-without-being?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://davenporter.substack.com/p/can-you-learn-to-use-ai-without-being?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p>]]></content:encoded></item><item><title><![CDATA[What I'm building this week(/month/quarter)]]></title><description><![CDATA[This week: How agent skills are improving my session workflows]]></description><link>https://davenporter.substack.com/p/what-im-building-this-weekmonthquarter</link><guid isPermaLink="false">https://davenporter.substack.com/p/what-im-building-this-weekmonthquarter</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Thu, 21 May 2026 17:30:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-3Ve!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd474587a-27eb-4831-9613-f40c7600f5eb_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;m working on a demo that I&#8217;m hoping to share next week. This week&#8217;s &#8216;build&#8217; focuses on where I&#8217;ve created a new agent skill in my workflow that helps manage my session information and make my life a little easier.</p><p>I&#8217;ll be adding skills I create <a href="https://github.com/davenportjw/agent-skills">here</a> for you to use / view!</p><h2>Context</h2><p>I&#8217;ve probably used ~100 sessions or chats in Antigravity this week developing said demo as I&#8217;m trying to be better about flushing and getting new context, iterating on a task, and starting fresh. But, being a data engineer at heart, I was starting to feel like some of the information from prior sessions was getting forgotten by me, and, selfishly, since I work in an outbound Developer team, I was probably losing ideas to talk about.</p><p>Enter the <code>session-journal</code> agent skill.</p><h2>What is the session-journal skill?</h2><p>Agent sessions in Antigravity / other platforms store detailed session logs for each of the sessions they create. I wanted to get rolling summaries of each session, and then create aggregates of sessions to find content, understand key strategies the agent took (or failed at), and ultimately improve my prompting and sharing of things I&#8217;ve been learning along the way.</p><p>Here&#8217;s almost literally the depiction of what this process does:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yk-J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yk-J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png 424w, https://substackcdn.com/image/fetch/$s_!yk-J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png 848w, https://substackcdn.com/image/fetch/$s_!yk-J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png 1272w, https://substackcdn.com/image/fetch/$s_!yk-J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yk-J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png" width="1448" height="276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:276,&quot;width&quot;:1448,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:52118,&quot;alt&quot;:&quot;Flow of session log processing&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://davenporter.substack.com/i/198734822?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Flow of session log processing" title="Flow of session log processing" srcset="https://substackcdn.com/image/fetch/$s_!yk-J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png 424w, https://substackcdn.com/image/fetch/$s_!yk-J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png 848w, https://substackcdn.com/image/fetch/$s_!yk-J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png 1272w, https://substackcdn.com/image/fetch/$s_!yk-J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7f2cdb-d3b4-447b-9c7e-5e41d3985a37_1448x276.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>The session-journal works as a sidecar in Antigravity to continuously summarize sessions. Since I try to create a new session for each task, sometimes there are common things that happen across the tasks or things that I try to fix repeatedly. </p><p>Writing to .local, the session-journal skill creates the summaries for my use, and does a light brainstorm of potential content themes (this part might be optional if you use it).</p><h2>How I built it</h2><p>Most agents are actually pretty decent at using skills to create skills, and this is no different. After some brainstorming on what I actually needed this skill to do, I used Antigravity to create the skill. I have a colleague (@joeshirey) who took another approach using <a href="https://github.com/obra/superpowers">superpowers</a>. We merged the skills together to get the best of both worlds.</p><h2>Try it!</h2><p>Please let me know if you try it and what works or doesn&#8217;t! Next up is to try this on other coding tools and refine how it&#8217;s running (sometimes the sidecar doesn&#8217;t start).</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.com/p/what-im-building-this-weekmonthquarter?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://davenporter.substack.com/p/what-im-building-this-weekmonthquarter?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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></p><p></p>]]></content:encoded></item><item><title><![CDATA[AI and the New Business Moat: Defending Your Competitive Advantage]]></title><description><![CDATA[AI requires you to create another moat of advantage. Here are my thoughts about how to do it.]]></description><link>https://davenporter.substack.com/p/ai-and-the-new-business-moat-defending</link><guid isPermaLink="false">https://davenporter.substack.com/p/ai-and-the-new-business-moat-defending</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Tue, 19 May 2026 16:01:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5f9Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;m fortunate enough each year to lead a number of Google engineers as we build our our keynotes. These activities take a lot of time. We typically start in December on our big launches and themes, then hit the ground running in January when we define our creative canvas, and build out each of the demos. Along the way, we usually discover a lot of things (<em>shocker</em>).  One thing that stood out to me this year in a technical, but non-technical way is how much generalized knowledge LLMs now have to answer most questions I would have outsourced, at least to some cursory level. This represents a new challenge to organizations: if AI can do the work, what are the advantages you have?</p><h2>How AI is challenging your moat</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5f9Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5f9Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png 424w, https://substackcdn.com/image/fetch/$s_!5f9Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png 848w, https://substackcdn.com/image/fetch/$s_!5f9Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png 1272w, https://substackcdn.com/image/fetch/$s_!5f9Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5f9Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png" width="1120" height="488" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:488,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60729,&quot;alt&quot;:&quot;Depiction of the things that provide advantages to a company, and how AI is a disruptor&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://davenporter.substack.com/i/198412077?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Depiction of the things that provide advantages to a company, and how AI is a disruptor" title="Depiction of the things that provide advantages to a company, and how AI is a disruptor" srcset="https://substackcdn.com/image/fetch/$s_!5f9Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png 424w, https://substackcdn.com/image/fetch/$s_!5f9Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png 848w, https://substackcdn.com/image/fetch/$s_!5f9Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.png 1272w, https://substackcdn.com/image/fetch/$s_!5f9Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce83ecf-297f-4234-8b38-1fb2b15e2874_1120x488.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"><svg role="img" 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"><g><title></title><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"><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"><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>In business school, we often talk about the <a href="https://www.investopedia.com/ask/answers/05/economicmoat.asp">competitive advantages</a> of a company. The moat becomes the durable patterns that sustain a company&#8217;s advantages.</p><p>In the software world, patterns might be the data advantage you have (see my prior article), the durable relationship you&#8217;ve built with your customers that no one else can do, or the fact that a switching cost is too high (although switching costs are less of a &#8216;desired advantage&#8217; than a threat to the customer of change).</p><p>AI presents a new challenge to the durability of your moat, but sometimes not in ways you&#8217;d expect. I&#8217;ll present a tangible example I&#8217;ve recently experienced, and then talk about how you can better position yourself and your company to defend against this new competitor.</p><h2>An example: the cost of landscape design</h2><p>We have a rental property pretty close to our house. The front yard is massive, its covered in grass, and gets almost zero shade during the hot Colorado summers. This, in combination with the severe drought, presents a number of challenges (both in terms of the actual cost of water and the philosophical question of being environmentally responsible).</p><p>So I presented a picture of this yard to Gemini, and asked it to xeriscape based on the location the house is at, the size of the yard, and my requirements (very low water usage and maintenance).</p><p>And, unsurprisingly, the list of recommendations including an image of what this looked like are pretty decent!</p><p>In this example, why would I use a landscaping company then? I&#8217;d have to pay for the architect time, and then probably overpay for doing the work (I&#8217;m pretty handy and I like doing this type of work myself). AI did a &#8216;C&#8217; job, which for this example translates to &#8216;good enough&#8217;.</p><h3>The challenge to the existing landscape design and contracting firms</h3><p>In the above, it&#8217;s clear I have some process expertise and I was able to leverage generalized knowledge, and multimodality in a model. I&#8217;m probably not the average customer. I used AI to reduce the knowledge and process component of the moat. </p><p>But how many of these examples exist that start to erode the moat?</p><p>For the landscape architecture firm, the firm must seek to shift and deepen the moat around expertise and design. This can include moving up in the desired customer base and focus, or using AI as a design partner in the flow to accelerate the process with customers to get their yards re-landscaped.  This could also include capturing more data for things like water use or design traits that people really like.</p><p>Alternatively, a company could choose to double down on the <em>execution</em> side. While I know how to do the work, it&#8217;s also highly time intensive and not complex labor. Scaling the advantage of execution may be preferable to some.</p><p>All of these changes are valid approaches, but require &#8216;moving the moat&#8217; from a customer perspective. </p><h2>Tangible steps to defend your moat from AI</h2><p>For any company, AI presents both advantages and threats (we probably should add this to a SWOT or Porter&#8217;s 5 Forces box). What are some things I&#8217;m thinking about to help strengthen the moat?</p><p>Here are a few things I&#8217;ve found along the way that are tactical steps you can take this week to start understanding the potential impact of AI, and what to start hardening.</p><ol><li><p><strong>Pay for AI.</strong> Even a cheap subscription limits the amount of information that could leak from seemingly innocent questions. This is a basic but required step to protecting your intellectual property.</p></li><li><p><strong>Ask AI what it knows.</strong> In the example of Google Cloud Next, we used AI to help us build a skill about planning a marathon (most of us knew comparatively little about the actual event planning process). Someone on our team had worked as a coordinator before and helped validate the steps. The latest models were surprisingly close to understanding the full process. Do this in a paid account to see how much you think is your &#8216;secret sauce&#8217; vs. generalized knowledge in a model.</p></li><li><p><strong>Identify your data and process advantages AI doesn&#8217;t have</strong>. You should assume that as LLMs continue to improve, the 'distinct&#8217; advantages you have will continue to erode. Your first party information (data, processes, relationships), becomes even more valuable in this world. Build around the things only you can do.</p></li><li><p><strong>Leverage AI to harden your advantages.</strong> If you know how to prompt AI, the rate which you&#8217;ll be able to move is probably 2-10x someone else. Take training on AI skills even if you own a small business. In the landscaping example, if you can use AI to even get to a draft faster, this represents ways you can build new advantages in your relationships with your customers. </p></li><li><p><strong>Understand the AI limiting tools at your fingertips</strong>. Most people dont think about robots.txt for internet scraping. There are new methods to help prevent your public knowledge from being used to train models. Consider what these mean, but also if your competitors allow scraping, what you should tangibly protect from training vs. what enables you to be a &#8216;trusted&#8217; provider in <a href="https://www.evertune.ai/resources/a-beginners-guide-to-geo">GEO</a> (generative engine optimization aka being a grounded link in something like a prompt response).</p></li></ol><p>Please let me know what else you&#8217;re thinking about with AI and your organizations! Happy Tuesday!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.com/p/ai-and-the-new-business-moat-defending?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://davenporter.substack.com/p/ai-and-the-new-business-moat-defending?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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></p>]]></content:encoded></item><item><title><![CDATA['Dark data' is your new most valuable data for AI]]></title><description><![CDATA[And why big data is making a comeback to bring data out of the shadows that your agents need in order to be successfully created and trained.]]></description><link>https://davenporter.substack.com/p/dark-data-is-your-new-most-valuable</link><guid isPermaLink="false">https://davenporter.substack.com/p/dark-data-is-your-new-most-valuable</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Wed, 13 May 2026 15:21:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HCyO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Someone asked me a question the other day related to generative AI (because why not AI), and it went something like &#8216;what do you think is going to be the next trend here in 6 to 12 months?&#8217;.</p><p>The simplest answer I have is that big data is coming back, and it&#8217;s going to be highly relevant to many teams as the agentic AI era continues. But the foundation of agents isn&#8217;t built on your structured data. It&#8217;s built on logs, interactions, and the mess of data residing in your Google Workspace, Office (CoPilot365), and other platforms that have been either off limits, too expensive to track, or frankly, just not considered as valuable.</p><h2>A &#8216;simple&#8217; CRM agent example</h2><p>Here&#8217;s a simple business case. Let&#8217;s say you are going to create a chatbot for a sales agent. The agent is designed to be an assistant for your sales team to answer questions about specific deals,  deal designs, customer analysis, and even deal support. You probably have a CRM that has the basics like what the customer account is, some sloppy opportunity data, and some light &#8216;contact&#8217; information.</p><p>But the information your agent needs in order to learn is all about the interactions that take place across prospects, deals, and opportunities. This data might look something like:</p><ul><li><p>Meeting transcripts between a sales representative and a prospect. Other transcripts between your internal teams talking about the deal size, approach, and even contracting.</p></li><li><p>Spreadsheets with analytics in them about the deal and different values.</p></li><li><p>Log data from your other systems (say your actual CRM logs) for changes to the deal over time, or how a what-if scenario engine is used.</p></li></ul><p>For most organizations, this represents a pile of very messy, large data. And frankly, it wasn&#8217;t that useful before. However, agents need to understand the glue (aka processes) that actually create outcomes in order to re-enact and improve. Imagine you have to improve one of your skills, and the only feedback you have is the input, and the outcome. Aligning your own trajectory to the outcome is a hit or miss activity, and where we typically say the agent failed and move on when we didn&#8217;t give the agent anything useful to get started with.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HCyO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HCyO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png 424w, https://substackcdn.com/image/fetch/$s_!HCyO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png 848w, https://substackcdn.com/image/fetch/$s_!HCyO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png 1272w, https://substackcdn.com/image/fetch/$s_!HCyO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HCyO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png" width="1456" height="486" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:486,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:108315,&quot;alt&quot;:&quot;Sales opportunity getting to an outcome with an undefined set of steps in the middle.&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://davenporter.substack.com/i/197523604?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Sales opportunity getting to an outcome with an undefined set of steps in the middle." title="Sales opportunity getting to an outcome with an undefined set of steps in the middle." srcset="https://substackcdn.com/image/fetch/$s_!HCyO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png 424w, https://substackcdn.com/image/fetch/$s_!HCyO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png 848w, https://substackcdn.com/image/fetch/$s_!HCyO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.png 1272w, https://substackcdn.com/image/fetch/$s_!HCyO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055a8504-e415-4d8b-bd00-9d64f52fa4fe_1756x586.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"><svg role="img" 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"><g><title></title><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"><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"><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>This is the &#8216;dark data&#8217; problem in companies, and where big data, in my opinion, is going to make a comeback.</p><h2>Building an agentic &#8216;big&#8217; data foundation</h2><p>So what do data and AI leaders do to get ahead of this?</p><ol><li><p>Get ahead of this problem and hoard as much telemetry and unstructured data as possible. I know we say hoarding creates data swamps, but when change is constant, understanding what in this data is useful is unknown, the compute power these days can sift through it, and not having eval data means your agent is DOA.</p></li><li><p>Get value stream maps of the processes you are looking to &#8216;agentify&#8217; and map your data domains to this. If you don&#8217;t have the data today, identify all the sources you might have available including (gasp: new SaaS systems) that can get this process data for you.</p></li><li><p>Start identifying golden data outcomes from your captured data. This may be something like &#8216;sessions that yielded a sale&#8217; or &#8216;key process moments&#8217;. Labelling data provides you with an eval dataset that can be used when training or modifying agent behavior to yield similar agent trajectories (think an agent session with turns and tool calls).</p></li></ol><p>There are many other things here that you&#8217;ll need like managing sensitive data effectively from the data governance playbook, and building effective and efficient data models over this, but step 1 is still &#8216;collect data&#8217;.</p><p>Happy Wednesday!</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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[Maximizing Developer Value: Using AI Across the Entire Code Lifecycle]]></title><description><![CDATA[There&#8217;s now a wealth of information and tutorials floating around about how you can go from 0 to 1 with AI, or even vibe code personalized apps or prototypes?]]></description><link>https://davenporter.substack.com/p/maximizing-developer-value-using</link><guid isPermaLink="false">https://davenporter.substack.com/p/maximizing-developer-value-using</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Thu, 10 Jul 2025 16:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3yzq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There&#8217;s now a wealth of information and tutorials floating around about how you can go from 0 to 1 with AI, or even vibe code personalized apps or prototypes? But what&#8217;s next, and how do we use AI effectively across all parts of our coding development?</p><h2>Understanding the Code Completion Curve</h2><p>The feature or code completion curve tends to look something like this when you consider the amount of lines of code you write, to what actually ends up shipping based on completing the work:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3yzq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3yzq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png 424w, https://substackcdn.com/image/fetch/$s_!3yzq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png 848w, https://substackcdn.com/image/fetch/$s_!3yzq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png 1272w, https://substackcdn.com/image/fetch/$s_!3yzq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3yzq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png" width="1062" height="718" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:1062,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A curve describing how lines of code goes up as you create it then it refactors and levels off.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="A curve describing how lines of code goes up as you create it then it refactors and levels off." title="A curve describing how lines of code goes up as you create it then it refactors and levels off." srcset="https://substackcdn.com/image/fetch/$s_!3yzq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png 424w, https://substackcdn.com/image/fetch/$s_!3yzq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png 848w, https://substackcdn.com/image/fetch/$s_!3yzq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.png 1272w, https://substackcdn.com/image/fetch/$s_!3yzq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd202b5b9-5b3a-489b-8c1c-d7361a0773f8_1062x718.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"><svg role="img" 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"><g><title></title><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"><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"><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>What happens at certain parts of the graph above roughly equates to how we can think about using AI for different &#8216;tasks&#8217; and &#8216;roles&#8217; in the coding lifecycle, positioning AI for success, and also setting us developers up to maximize our value in the cycle.</p><p>Let&#8217;s talk about the first part of this graph, where we&#8217;re writing code in order to get a feature or requirement working, or what I&#8217;m calling the <em>Generate </em>zone.</p><h2>The &#8216;Generate&#8217; Zone: Using AI as a Creative Foil</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!riqi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!riqi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png 424w, https://substackcdn.com/image/fetch/$s_!riqi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png 848w, https://substackcdn.com/image/fetch/$s_!riqi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png 1272w, https://substackcdn.com/image/fetch/$s_!riqi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!riqi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png" width="1016" height="712" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:712,&quot;width&quot;:1016,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Describing how code generation is where most lines of code are initially written before something is working.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Describing how code generation is where most lines of code are initially written before something is working." title="Describing how code generation is where most lines of code are initially written before something is working." srcset="https://substackcdn.com/image/fetch/$s_!riqi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png 424w, https://substackcdn.com/image/fetch/$s_!riqi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png 848w, https://substackcdn.com/image/fetch/$s_!riqi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png 1272w, https://substackcdn.com/image/fetch/$s_!riqi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4068d2-ff77-4d1d-8494-4cde5a787a13_1016x712.png 1456w" sizes="100vw"></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"><svg role="img" 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"><g><title></title><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"><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"><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>Interestingly (or not), most of the AI examples I find online anymore are heavily weighted to this code zone (I see you vibe coding). If you&#8217;ve attempted an AI experiment, this is probably where you started, and either had success, mixed success, or no success.</p><p>This also happens to be the zone where we, as humans, are the most effective. Creativity isn&#8217;t bred from next token prediction, it&#8217;s about building business context in the broader context of our applications we create and operate, and design ways to creatively implement a requirement. If we just try to put AI in this box, no one ends up happy except for the 30 minute app creators.</p><p>As we shift from generation in a 0 to 1 scenario to an incremental feature, using AI here can also help to improve our ability to onboard to code, learn it, and make changes. Here, we are asserting control over which AI tools we are using, and leveraging components of AI for efficiency and quality. Yet, we are not giving up control over what we learn, and it&#8217;s important to draw the distinction so we use the right AI components.</p><p>You&#8217;ve also generated the most code that you have to maintain when you finally get the thing working the first time, which leads us into the second, or &#8216;Refactor&#8217; zone.</p><h2>The &#8216;Refactor&#8217; Zone: Optimizing Code with AI Assistance</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HtyW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HtyW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png 424w, https://substackcdn.com/image/fetch/$s_!HtyW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png 848w, https://substackcdn.com/image/fetch/$s_!HtyW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png 1272w, https://substackcdn.com/image/fetch/$s_!HtyW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HtyW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png" width="1024" height="704" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:704,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Describing how code lines tend to go down once it works and the code is refactored and optimized.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Describing how code lines tend to go down once it works and the code is refactored and optimized." title="Describing how code lines tend to go down once it works and the code is refactored and optimized." srcset="https://substackcdn.com/image/fetch/$s_!HtyW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png 424w, https://substackcdn.com/image/fetch/$s_!HtyW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png 848w, https://substackcdn.com/image/fetch/$s_!HtyW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png 1272w, https://substackcdn.com/image/fetch/$s_!HtyW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97b17ed-393c-4c0c-979d-743e0999b397_1024x704.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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>Here, in the refactor and optimize zone, we apply our knowledge of coding principles, pain of the past, and other knowledge about things like performance to slowly reduce the code we built, refactor it based on good coding practices, and make the code ready to &#8216;ship&#8217;. Here, there&#8217;s an art and a science, but we&#8217;re using what we&#8217;ve generated as the input, and our standards and observations to reduce and refactor.</p><p>The blue zone also happens to be the next &#8216;underserved&#8217; area I think about more and more for AI. While we need to provide a lot of input here, as developers we can provide specs, build observability platforms, and set goals for code refactoring that tend to rely better on an existing knowledge base than in pure generation. Which leads us to the final, or &#8216;move on&#8217; zone.</p><h2>The &#8216;Move On&#8217; Zone: Knowing When Good Enough is Best</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DFSz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DFSz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png 424w, https://substackcdn.com/image/fetch/$s_!DFSz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png 848w, https://substackcdn.com/image/fetch/$s_!DFSz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png 1272w, https://substackcdn.com/image/fetch/$s_!DFSz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DFSz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png" width="1014" height="686" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:686,&quot;width&quot;:1014,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Depicting where we probably need to stop working on the code as optimization will not yield many line reduction results.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Depicting where we probably need to stop working on the code as optimization will not yield many line reduction results." title="Depicting where we probably need to stop working on the code as optimization will not yield many line reduction results." srcset="https://substackcdn.com/image/fetch/$s_!DFSz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png 424w, https://substackcdn.com/image/fetch/$s_!DFSz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png 848w, https://substackcdn.com/image/fetch/$s_!DFSz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png 1272w, https://substackcdn.com/image/fetch/$s_!DFSz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F845bbfd5-5fec-4888-9cb8-0778e7971515_1014x686.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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>I call this the &#8216;move on&#8217; zone, but you could also call this the danger zone of development. If things are going good enough, we need to know when to stop optimization for optimization sake and move on, and avoid the <a href="https://youtube.com/shorts/4P0HVCMX3kM?si=8RguP76rcjlf5wWp">refactoring loop that can happen</a> as we add features and then continually revisit &#8216;good enough&#8217; code..</p><h2>Why These Zones Matter for Effective AI Integration</h2><p>For starters, when we use AI, it&#8217;s important to recognize the benefit that AI and LLM&#8217;s can provide us while also not losing the creativity and systems thinking that humans can, in fact, provide. In all cases, its about the systems around AI that we need to create and maintain in order for the LLM and us to build good software.</p><h2>Practical Recommendations for Using AI in Each Zone</h2><p>If you&#8217;re getting started, here are a few recommendations I have as you think about the &#8216;zones&#8217;, and using AI in each zone. While not all inclusive, hopefully these provide a few nuggets or places you can use LLMs or your existing systems to improve LLM performance.</p><h3>Generate</h3><ol><li><p>Use AI as your foil. Ask LLM models, based on what you need to do and your ideas, to critique them, find potential holes, and generate potential execution plans.</p></li><li><p>Using thinking models here can be high value to see how an LLM would approach the tasks associated with the outcome you want. This allows you to refine your approach to solving the business problem.</p></li><li><p>Next, you can use an LLM to generate a task list to provide to other LLMs for completion, or even as subsets of activities as you write and test the code.</p></li><li><p>Remember that the LLM is only as good as the context you provide. An LLM doesn&#8217;t know that you&#8217;re only in us-east5, or what models you have access to. Provide this as context to get the best answers.</p></li></ol><h3>Refactor</h3><ol><li><p>Your code is working! Using a new prompt or different model for refactoring starts with a clean slate and ensures you dont overweight context that was needed in generation.</p></li><li><p>Here, ensuring your standards are written down and having few shot examples helps the LLMs refactor code as required. Following some principles for TDD here can be useful: give the LLM the test cases the code needs to pass in order to make sure the refactored code meets the goal.</p></li><li><p>Next, your other tech systems are critical here. Refactoring is an art informed by science. What calls are typically long? Does a specific call need to be optimized further to fit the wall time for an API call? Giving access to this information for an LLM via MCP allows the LLM to get this information as needed to know when to stop.</p></li></ol><h3>Move on</h3><ol><li><p>The code is good enough! You can move on to the next problem.</p></li><li><p>The systems you set up can monitor the code in the context of the platform it operates in. Setting up agents to check for long running processes or tasks is a useful and easy way to find things that may need further optimization while avoiding the trap of &#8216;continuous optimization&#8217;.</p></li></ol><p>Share your own experiences with AI in the code lifecycle in the comments below!</p><h2>This week, in what happened in my mailbox last week:</h2><p>Let&#8217;s address another comment from one of my initial posts about AI usefulness:</p><ul><li><p>AI is helping to remove the drudgery</p></li></ul><p>YES! It can be a big daunting to think about AI especially in the context of the current market where you hear about &#8216;AI taking jobs&#8217; and all these other things (look at annual reports for the full story on these companies and don&#8217;t get sucked into the AI-ness of it).</p><p>In one of my first roles out of college I was a process analyst where we value stream mapped a number of client activities. Value stream mapping is a great way to identify things in the process that arent fun or add value and see how AI can potentially work to remove the work.</p><p>Another way to help remove the drudgery is to consider what the end goals are of any process and simply apply these as a part of a prompt to thinking models. This may prompt new ways to think about a problem and remove the toil, or identify further toil that can be automated or changed.</p><p>Ultimately, the goal is to lean into what humans do best with AI being one of the most capable tools we have available today.</p>]]></content:encoded></item><item><title><![CDATA[AI Isn't Coming for Your Job, It's Coming for Your To-Do List]]></title><description><![CDATA[Ways to use Generative AI to be more productive and make better work]]></description><link>https://davenporter.substack.com/p/ai-isnt-coming-for-your-job-its-coming</link><guid isPermaLink="false">https://davenporter.substack.com/p/ai-isnt-coming-for-your-job-its-coming</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Wed, 18 Jun 2025 15:56:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-3Ve!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd474587a-27eb-4831-9613-f40c7600f5eb_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Ways to use Generative AI to be more productive and make better work</h2><p>If I tried to link the number of posts and blogs about the &#8216;death&#8217; of software engineering, I&#8217;d probably be at 5 or 10 pages printed in single space, 6 pt. Font. It&#8217;s clickbait or justification for some manager or director, and I just don&#8217;t believe it. Call me a luddite. However, I do believe generative AI is coming for the <em>way we work</em>, not the job itself.</p><p>What does this mean as a developer in 2025? As I talk to more developers in the community and at large organizations, the question seems to have shifted from &#8216;will I use AI&#8217; to &#8216;how can we actually use it?&#8217; You can use it to re-create nostalgic video games, but when you go into an existing environment, where there&#8217;s been &#8230; decisions &#8230; and issues, how can you actually start to use AI effectively?</p><p>Here are a few points I&#8217;m coalescing around in my mental model of 2025 and some actions you can take today in your usage / testing of generative AI. And these things go together if you&#8217;re wondering.</p><h3>Outcome vs task completion</h3><p>Remember Cucumber? Most engineering practice changes I see tend to follow a similar pattern, where, in order to re-create the wheel, we first have to go back to the goal we need to deliver. Engineering ultimately exists to apply tools at solving business problems. But why sub-optimize in the process when we should probably be better about writing requirements and defining what the <em>user outcome</em> is that we want to achieve. We cannot expect any AI solutions to know unwritten requirements; the primary value here we have as senior engineers is that we&#8217;ve seen enough of this to have <em>implicit</em> requirements to apply.</p><p><strong>Goal: </strong>Spend more time defining what the <a href="https://www.loadspring.com/post/outcomes-based-vs-capabilities-based-ai-strategies/">actual outcome</a> is of a user goal, and leave no rock unturned.</p><p><em><strong>Bonus:</strong> </em>Using AI to help you here is a powerful tool, here&#8217;s a <a href="https://caseywest.com/unlock-elite-agents-the-art-of-evolving-llm-prompts-into-system-masterpieces/">post</a> from a peer of mine about it.</p><h3>Process and standards management</h3><p>&#8216;I know what looks good&#8217; isn&#8217;t going to cut it. Communities of knowledge built over time at organizations maintain &#8216;silent standards&#8217; across the board, and many dont fully understand the business or technical processes they work in. Whether this is commenting strategies, how to write specific blocks of code, or &#8216;when to use what&#8217;, these are all implicit pieces of knowledge about the process you gain from junior to senior. But we can&#8217;t expect a generative AI model to &#8216;just know&#8217; all the non-standards we follow, and the limits of the standards loaded into LLM&#8217;s that we do follow. The role of senior increasingly will shift to &#8216;managing the system and standards&#8217; from &#8216;writing killer code and mentoring&#8217;. By virtue of improving the system and standards, I expect over time that organizations will also continue to benefit with other employees having the benefit of written and transferred knowledge over time.</p><p><strong>Goal: </strong>Over-document how things are done including the flows so you can build better <a href="https://google.github.io/adk-docs/tutorials/agent-team/">AI workflows</a> and agents, and provide the generative AI models the <a href="https://github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/long-context/intro_long_context.ipynb">context</a> they need to actually write successful code.</p><p><em><strong>Bonus:</strong> </em><a href="https://www.lucidchart.com/pages/value-stream-mapping">Build a value stream map</a> and see how you can flip the system on its head to shift back to outcome based coding.</p><h3>Knowledge graphs</h3><p>Graphs have been around for a long time, but my personal view is that they&#8217;ve struggled with applicability except in specific scenarios (hello Google Search). As we use AI to crawl more information, we need to be better about explicitly stating the relationships between points of data in the information (hello graphs!). I can see where many engineers become &#8216;keepers of the graph of knowledge&#8217; over time, focusing on the curation of knowledge about the components that create value for the company and its customers, and the tech stacks that support value generation. Generative AI has both significantly lowered the experience bar needed to create effective graphs, and increased the need to actually build them. As AI becomes more prevalent, we&#8217;ll need the graph to build better tests, and use the graph to provide the most relevant information (be it code components, or recommendations for a customer).</p><p><strong>Goal: </strong>Create a <a href="https://cloud.google.com/spanner/docs/graph/set-up">graph</a> for a domain of knowledge in your company and apply it, Whether this is customers and sessions, or engineering standards.</p><p><em><strong>Bonus: </strong></em>Find overlapping and conflicting information and build a <a href="https://medium.com/@rakeshmohandas/building-an-ai-powered-catalog-enrichment-using-gemini-for-bigquery-107a0feb4caa">better corpus</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.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 The Davenporter! 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[Is 'Context Engineering' Just Graph Data Engineering for generative AI?]]></title><description><![CDATA[Do we really need another &#8216;engineering&#8217; discipline?]]></description><link>https://davenporter.substack.com/p/is-context-engineering-just-graph</link><guid isPermaLink="false">https://davenporter.substack.com/p/is-context-engineering-just-graph</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Sun, 01 Jun 2025 15:59:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-3Ve!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd474587a-27eb-4831-9613-f40c7600f5eb_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Do we really need another &#8216;engineering&#8217; discipline?</h2><p><a href="https://blog.langchain.com/the-rise-of-context-engineering/">Context engineering</a> is now making the rounds as the next &#8216;engineering&#8217; we need in order to successfully make generative AI work. This after we just introduced &#8216;prompt engineering&#8217; no less than 18 months ago. But do we really need to talk about this as a fully separate discipline or should we reconsider what the need for &#8216;context&#8217; and &#8216;memory&#8217; actually means as it relates to the most common disciplines that already exist: software and data engineering.</p><p>I&#8217;ve been positing internally that data engineering as a discipline needs some evolution. We&#8217;ve gone from databases to warehouses to lakes to multimodal lakehouses, but these still seem stuck in the paradigm that we will make insights of the data, and then humans will take action on the insights in a way that makes sense. I can tell you the breakdown on the last part of that continues to happen. <a href="https://www.linkedin.com/preload/#">Joe Reis</a> writes about <a href="https://joereis.substack.com/p/the-postmodern-data-stack-and-action">action oriented architectures</a> as the next major way to think about data, and I happen to agree.</p><p>So then what about context? If you take the sum of everything above, it&#8217;s all been with the goal in mind of some intent or outcome we want to drive, be it customers, efficiency, or other. Context and memory usually requires that we have the knowledge about all things for a customer: structured sales, unstructured logs, interactions, and even unstructured data like images, video, and audio. We have to make sense of all this. To be fair, the use cases discussed in context engineering and the pipelines are needed, but we need to understand how we can use our existing tools to accomplish these outcomes without making all of this feel exclusive and unknown.</p><p>In some way, graph data engineering to me feels like the pinnacle of all our prior work put together, in the context of taking real time action using our engineered knowledge to make experiences better for our customers. Ultimately, I hope that context engineering becomes another data point and <em>just</em> the next iteration of data engineering, using graph databases of information to drive great business outcomes.</p><h3>How to get started with graph data engineering</h3><p>If you&#8217;re unfamiliar working with graphs currently, that&#8217;s okay! I&#8217;d typically recommend you start with something like <a href="https://codelabs.developers.google.com/codelabs/spanner-graph-getting-started">this</a> where you can learn about graphs in the context of structured data engineering concepts you already know. From there, you can then start storing data in graph formats like <a href="https://cloud.google.com/spanner/docs/graph/manage-schemaless-data">this</a>.</p><p>Once you&#8217;ve got those down, take a spin with LLMs to help you build out graph entities and edges, and see what the LLM&#8217;s will extract from your content. You can use this to tune the graph that you&#8217;re building and maximize value without having preconceived notions about what the edges or entities necessarily should be.</p><h2>This time, in what happened in my mailbox since last time</h2><p>Last post got a lot of great comments and thoughts (even from my parents). Each following post, I&#8217;ll address a few of the comments I have particular feelings about, although they might also come from <a href="https://www.youtube.com/playlist?list=PLIivdWyY5sqLvGdVLJZh2EMax97_T-OIB">Youtube series</a> I also make.</p><ul><li><p>What about the death of the junior engineer?</p></li></ul><p>This one has been top of mind for a while. In my last post I explored what existing engineers need to be doing to start the mindset shift. I think in the next 12-24 months, we will begin to see the software engineering ladder be actually rewritten, and junior engineers who&#8217;ve used AI extensively for the past few years will start to get a leg up. What can you do now if you&#8217;re a junior engineer looking? Here are a few thoughts from someone you might or might not listen to:</p><ol><li><p>Focus on the fundamental components of code and how things like security actually fit. You can&#8217;t trust LLM&#8217;s to hand off the full process without supervision. Do this, and this.</p></li><li><p>Learn about the business. I don&#8217;t know where in engineering we removed accountability from engineers to understand the business they support, but I think it&#8217;s a problem. I&#8217;m a believer that those who understand the business the best, along with understanding AI tools, will be the ultimate winners in whatever this <a href="https://sourcegraph.com/blog/revenge-of-the-junior-developer">reset</a> is. This <a href="https://www.linkedin.com/pulse/growing-need-software-engineers-cross-disciplinary-skills-bxkbf/">article</a> is a good starting point.</p></li></ol><p>Second part of the question. What happens when the pipeline for seniors dwindles?</p><p>I fully believe the pipeline for seniors will go to zero in the current implementation of the engineering ladder. This is not an incremental change in role profiles (see above). If you&#8217;re a senior engineer, don&#8217;t wait to &#8216;blow up the ladder&#8217;. These tools are changing what skills everyone needs, and better to do it to yourself than wait and have it be forced on you. Junior engineers have a fundamentally different skillset, strengths, and issues than when a lot of us entered the workforce as analysts or engineers.</p><h2>Wrap up</h2><p>My hope is to explore more AI in the code lifecycle in the next few posts, but as always, let me know your comments and questions so I can make this useful for everyone.</p>]]></content:encoded></item><item><title><![CDATA[Coming soon]]></title><description><![CDATA[This is The Davenporter.]]></description><link>https://davenporter.substack.com/p/coming-soon</link><guid isPermaLink="false">https://davenporter.substack.com/p/coming-soon</guid><dc:creator><![CDATA[Jason Davenport]]></dc:creator><pubDate>Tue, 31 Oct 2023 01:46:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-3Ve!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd474587a-27eb-4831-9613-f40c7600f5eb_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is The Davenporter.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://davenporter.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://davenporter.substack.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item></channel></rss>