<?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[Shreyas's Substack]]></title><description><![CDATA[My personal Substack]]></description><link>https://shreyaspatro.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png</url><title>Shreyas&apos;s Substack</title><link>https://shreyaspatro.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 06 Jun 2026 01:01:14 GMT</lastBuildDate><atom:link href="https://shreyaspatro.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Shreyas Patro]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[shreyaspatro@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[shreyaspatro@substack.com]]></itunes:email><itunes:name><![CDATA[Shreyas Patro]]></itunes:name></itunes:owner><itunes:author><![CDATA[Shreyas Patro]]></itunes:author><googleplay:owner><![CDATA[shreyaspatro@substack.com]]></googleplay:owner><googleplay:email><![CDATA[shreyaspatro@substack.com]]></googleplay:email><googleplay:author><![CDATA[Shreyas Patro]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Is your website invisible to AI agents? Here's how to fix that.]]></title><description><![CDATA[A practical checklist, with copy-paste prompts to make sure AI tools can find, read, and cite your site.]]></description><link>https://shreyaspatro.substack.com/p/is-your-website-invisible-to-ai-agents</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/is-your-website-invisible-to-ai-agents</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Sun, 24 May 2026 14:08:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QrCU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Search behavior is shifting fast. More people are turning to AI assistants ChatGPT, Claude, Gemini, Perplexity not just to ask questions, but to do research, compare products, and make decisions. And the answers those tools give? They come from websites.</p><p>But not every website. Only the ones these agents can actually reach and understand.</p><p>If your site wasn&#8217;t built with AI crawlers in mind, you may already be invisible to a growing share of your audience  and not know it. The good news: most of these gaps are fixable in under an hour, and you don&#8217;t need a developer for all of them.</p><p>Here are five things worth auditing right now.</p><div><hr></div><p><strong>Step 01</strong></p><h2><strong>Check that AI crawlers can actually reach your site</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oLIN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oLIN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.png 424w, https://substackcdn.com/image/fetch/$s_!oLIN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.png 848w, https://substackcdn.com/image/fetch/$s_!oLIN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.png 1272w, https://substackcdn.com/image/fetch/$s_!oLIN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oLIN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.png" width="1445" height="729" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:729,&quot;width&quot;:1445,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:268184,&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://shreyaspatro.substack.com/i/199070250?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.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_!oLIN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.png 424w, https://substackcdn.com/image/fetch/$s_!oLIN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.png 848w, https://substackcdn.com/image/fetch/$s_!oLIN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.png 1272w, https://substackcdn.com/image/fetch/$s_!oLIN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166038d-3ce5-44dd-b784-9c0e50abdfd4_1445x729.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 July 2025, Cloudflare started blocking AI crawlers by default on new domains. Since Cloudflare powers roughly a fifth of the web, a large chunk of the internet quietly became unreadable to tools like GPTBot and ClaudeBot overnight.</p><p>Check your <code>robots.txt</code> and CDN config. Look for rules that might be blocking these agents: <code>GPTBot</code>, <code>ChatGPT-User</code>, <code>ClaudeBot</code>, <code>PerplexityBot</code>, <code>Google-Extended</code>. If none of them appear in your server logs, that&#8217;s your first clue.<br></p><p>Prompt to paste into your coding tool</p><p>Audit this project for anything blocking AI crawlers. Check robots.txt and CDN config for rules blocking GPTBot, ChatGPT-User, ClaudeBot, Claude-Web, PerplexityBot, and Google-Extended. List what&#8217;s blocked. Don&#8217;t change anything yet.<br><br><strong>Step 02</strong></p><h2><strong>Add structured data with JSON-LD</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A_gn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A_gn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.png 424w, https://substackcdn.com/image/fetch/$s_!A_gn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.png 848w, https://substackcdn.com/image/fetch/$s_!A_gn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.png 1272w, https://substackcdn.com/image/fetch/$s_!A_gn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A_gn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.png" width="1453" height="830" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:830,&quot;width&quot;:1453,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:286247,&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://shreyaspatro.substack.com/i/199070250?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.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_!A_gn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.png 424w, https://substackcdn.com/image/fetch/$s_!A_gn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.png 848w, https://substackcdn.com/image/fetch/$s_!A_gn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.png 1272w, https://substackcdn.com/image/fetch/$s_!A_gn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1564a2-5e3d-4248-a703-79b83d4b2035_1453x830.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>HTML is written for humans to parse visually. JSON-LD is written for machines. It&#8217;s a small block of JSON in your page&#8217;s <code>&lt;head&gt;</code> that explicitly tells crawlers what the page is  a Product, an Article, an FAQ, an Organization  along with details like price, availability, author, and date.</p><p>Without it, agents have to guess from the HTML. With it, they know. Use the right Schema.org type for each page type: <code>Article</code>, <code>Product</code>, <code>FAQPage</code>, <code>Organization</code>.</p><p>Prompt to paste into your coding tool</p><p>Audit this site for JSON-LD structured data. If it&#8217;s missing on any page, add it. If it already exists, enrich it  fill in any missing fields like author, date, price, availability, and description. Use the correct Schema.org type per page: Article for blog posts, Product for product pages, FAQPage for FAQ sections, Organization for the homepage. Pull all values from actual page content. No placeholder text.</p><p><strong>Step 03</strong></p><h2><strong>Use semantic HTML tags</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DH8H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DH8H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.png 424w, https://substackcdn.com/image/fetch/$s_!DH8H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.png 848w, https://substackcdn.com/image/fetch/$s_!DH8H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.png 1272w, https://substackcdn.com/image/fetch/$s_!DH8H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DH8H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.png" width="1437" height="590" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f04325ad-d81e-44b0-826e-45797957ffb1_1437x590.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:590,&quot;width&quot;:1437,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:306402,&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://shreyaspatro.substack.com/i/199070250?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.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_!DH8H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.png 424w, https://substackcdn.com/image/fetch/$s_!DH8H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.png 848w, https://substackcdn.com/image/fetch/$s_!DH8H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.png 1272w, https://substackcdn.com/image/fetch/$s_!DH8H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04325ad-d81e-44b0-826e-45797957ffb1_1437x590.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 <code>&lt;div&gt;</code> is a container with no inherent meaning. A <code>&lt;nav&gt;</code>, <code>&lt;article&gt;</code>, or <code>&lt;footer&gt;</code> tells a machine exactly what role that section plays. Most sites are heavy on divs and light on semantics  which means agents can render the page but struggle to make sense of it.</p><p>This is a low-effort cleanup with real structural benefits: better accessibility, better crawlability, cleaner markup.<br><br>Prompt to paste into your coding tool</p><p>Audit this file for non-semantic divs used as layout containers. Replace with the right HTML tags: &lt;header&gt;, &lt;nav&gt;, &lt;main&gt;, &lt;article&gt;, &lt;section&gt;, &lt;aside&gt;, &lt;footer&gt;. Keep all class names and styles. Don&#8217;t touch anything already semantic.</p><p><strong>Step 04</strong></p><h2><strong>Create an llms.txt file</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QrCU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QrCU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png 424w, https://substackcdn.com/image/fetch/$s_!QrCU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png 848w, https://substackcdn.com/image/fetch/$s_!QrCU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png 1272w, https://substackcdn.com/image/fetch/$s_!QrCU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QrCU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png" width="1446" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1446,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:274642,&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://shreyaspatro.substack.com/i/199070250?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.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_!QrCU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png 424w, https://substackcdn.com/image/fetch/$s_!QrCU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png 848w, https://substackcdn.com/image/fetch/$s_!QrCU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.png 1272w, https://substackcdn.com/image/fetch/$s_!QrCU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cfbc2db-3b58-4c78-a41b-761760f443e6_1446x768.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><br></strong></p><p>Proposed in September 2024 by Jeremy Howard (co-founder of fast.ai), <code>llms.txt</code> is a simple markdown file at the root of your site that summarizes what you do and links to your most important pages. Think of it as a table of contents written specifically for AI.</p><p>The reasoning: AI context windows are limited, and parsing full HTML pages cluttered with nav bars and ads is inefficient. A clean, curated markdown file gives models a direct, token-efficient entry point to your content.</p><p><em>Anthropic, Stripe, Cursor, and Cloudflare already ship one. The cost to add it is near zero.</em></p><p>It&#8217;s most valuable on documentation-heavy sites API docs, SDKs, technical guides. But there&#8217;s no downside to adding it anywhere.</p><p>Prompt to paste into your coding tool</p><p>Create an llms.txt file for my site. Before you build it, ask me the following questions one at a time and wait for my answer before moving to the next:<br><br>1. What is the name of this site or product?<br>2. In one or two sentences, what does it do and who is it for?<br>3. What are the most important pages an AI agent should know about?<br>4. Anything else agents should know shipping, pricing, brand context?<br>5. Any pages to deprioritize or skip?<br><br>Then create the file following the spec at llmstxt.org.</p><p><strong>Step 05</strong></p><h2><strong>Make sure your content is server-side rendered</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2X5Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2X5Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.png 424w, https://substackcdn.com/image/fetch/$s_!2X5Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.png 848w, https://substackcdn.com/image/fetch/$s_!2X5Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.png 1272w, https://substackcdn.com/image/fetch/$s_!2X5Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2X5Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.png" width="1449" height="627" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:627,&quot;width&quot;:1449,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:238544,&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://shreyaspatro.substack.com/i/199070250?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.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_!2X5Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.png 424w, https://substackcdn.com/image/fetch/$s_!2X5Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.png 848w, https://substackcdn.com/image/fetch/$s_!2X5Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.png 1272w, https://substackcdn.com/image/fetch/$s_!2X5Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebf3b3e-579f-44dd-8798-ea9a7d8756b0_1449x627.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>Most AI crawlers don&#8217;t execute JavaScript. They fetch the raw HTML and move on. If your content is rendered client-side loaded into the DOM after the page loads they see an empty shell.<br><br>Test this yourself: view the page source and search for a sentence from your content. If it&#8217;s in the source, you&#8217;re fine. If you see mostly <code>&lt;div id="root"&gt;&lt;/div&gt;</code>, agents are missing everything meaningful on that page.</p><p>Next.js, Astro, Remix, and most CMS platforms handle this automatically. If you&#8217;re running a single-page React or Vue app without server-side rendering, this is the most impactful fix on the list.</p><p>Prompt to paste into your coding tool</p><p>Audit this project for content that only renders client-side. Identify pages where main content is added to the DOM via JavaScript after load. Recommend whether to convert to SSR, static generation, or pre-rendering. Don&#8217;t change anything yet.</p><div><hr></div><p>None of these changes require a full rebuild. Most can be done in an afternoon some in minutes. The sites that are easy for agents to read, understand, and cite are the ones showing up in AI-generated answers. That&#8217;s the new SEO, and it&#8217;s worth getting ahead of.</p><p></p>]]></content:encoded></item><item><title><![CDATA[The Complete 2026 Guide to Voice Search First Strategy for AEO Rankings and SEO.]]></title><description><![CDATA[The Voice-First Blueprint: Turn Your Website Into the Default Answer for Every Question Your Audience Asks]]></description><link>https://shreyaspatro.substack.com/p/the-complete-2026-guide-to-voice</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/the-complete-2026-guide-to-voice</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Sun, 29 Mar 2026 15:33:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Introduction</strong></p><p>Voice search has fundamentally shifted how people discover content. By 2026, voice queries account for approximately 50 percent of all searches, and this trend is accelerating. Whether through smart speakers, mobile devices, or voice assistants, users are increasingly asking questions rather than typing keywords. This guide explores how to restructure your digital strategy around voice search first principles to dominate both answer box placements and voice search rankings.</p><p><strong>Part One: Understanding Voice Search Behavior in 2026</strong></p><p>Voice search differs fundamentally from text search. Users speak in natural, conversational language. They ask complete questions. They expect immediate, concise answers. A text searcher might type &#8220;best coffee machines,&#8221; but a voice searcher asks &#8220;what&#8217;s the best coffee machine under 200 dollars?&#8221;</p><p>This shift matters enormously for AEO. Voice search favors:</p><ul><li><p>Conversational, natural language</p></li><li><p>Direct, immediate answers</p></li><li><p>Featured snippets and answer boxes</p></li><li><p>Long-tail keyword phrases</p></li><li><p>Local intent and context</p></li><li><p>Authority and trustworthiness signals</p></li></ul><p><strong>Part Two: The FAQ Strategy for Voice Search Dominance</strong></p><p>FAQs have become critical infrastructure for voice search.</p><p>Search Behavior in 2026<br><br>Voice search queries differ fundamentally from text search. Users speak in natural language, often phrasing searches as complete questions. Where a text searcher might type &#8220;best coffee shops near me,&#8221; a voice searcher says &#8220;Where can I find a really good coffee shop within walking distance?&#8221; This conversational nature means your content strategy must shift from keyword matching to intent matching and natural language comprehension.<br><br>Voice searches are typically longer, more specific, and often include local intent. They&#8217;re also more likely to trigger featured snippets and answer boxes because voice assistants need concise, direct answers to read aloud. The devices themselves,smart speakers, phones, and wearables,prioritize brevity and clarity. If your content takes three paragraphs to answer a simple question, voice search algorithms will skip it.<br><br><strong>Part Two: The FAQ Strategy</strong><br><br>Structured FAQs have become essential for voice search dominance. Search engines use FAQ schema markup to understand your content better, and voice assistants actively pull from FAQ sections when answering questions.<br><br>Start by conducting intent research. Use tools like Answer the Public, Google Search Console, and voice search analytics to identify the actual questions your audience is asking. Don&#8217;t guess at FAQs,data should drive what you include.<br><br>Structure your FAQs conversationally. Instead of &#8220;What are the benefits of our product?&#8221; try &#8220;How can your product help me save time?&#8221; The second version matches how people actually speak. Keep answers concise,ideally 40 to 60 words per answer. This length is perfect for voice readout and answer box placement.<br><br>Implement proper FAQ schema markup on your website. This tells search engines that your content is structured as questions and answers, increasing the likelihood of appearing in voice search results. Each question-answer pair should be its own distinct unit in your schema.<br><br>Create multiple FAQ sections throughout your content rather than one massive section at the bottom. If you have a blog post about coffee brewing methods, include an FAQ section that addresses common questions related to that specific topic. This contextual relevance boosts voice search performance.<br><br><strong>Part Three: Transforming Blog Content into Voice-Optimized Chunks</strong><br><br>Long-form content still matters for SEO, but its structure must change. Break your articles into digestible sections with clear heading hierarchies. Each section should answer one specific question completely.<br><br>Use short paragraphs. Voice search favors conciseness. Aim for paragraphs of two to three sentences maximum. This makes your content skimmable for readers and easier for algorithms to extract answer snippets.<br><br>Create answer-focused introductions. The first 50 words of your content should directly answer the primary question. Voice assistants often read the opening snippet, so make it count. If someone asks &#8220;How do I fix a leaky faucet?&#8221; your opening should be &#8220;You can fix a leaky faucet by replacing the washer, which typically costs less than five dollars and takes ten minutes.&#8221;<br><br>Use numbered lists and bullet points strategically. These are perfect for voice search because they&#8217;re easy to parse and read aloud. A step-by-step guide with numbered instructions is ideal for voice search rankings.<br><br>Include a summary section at the end that restates the main answer. This gives voice assistants multiple opportunities to find your content as the answer source.<br><br><strong>Part Four: Conversational Content Strategy</strong><br><br>Voice search is fundamentally conversational, so your written content should reflect that tone. Write as if you&#8217;re explaining something to a friend, not lecturing from a podium.<br><br>Use natural language and contractions. Say &#8220;you&#8217;ll&#8221; instead of &#8220;you will,&#8221; &#8220;it&#8217;s&#8221; instead of &#8220;it is.&#8221; This mirrors how people actually speak and improves voice search matching.<br><br>Anticipate follow-up questions within your content. If you&#8217;re explaining a concept, think about what someone might ask next and address it naturally. For instance, if you explain what cryptocurrency is, you might follow up with &#8220;You might be wondering how cryptocurrency differs from regular money&#8221; and then answer that before the reader even asks.<br><br>Include question-and-answer dialogues in your blog posts. Create conversations between personas or imagined reader interactions. This naturally incorporates the conversational patterns that voice search algorithms recognize.<br><br>Address objections and concerns conversationally. Instead of a section titled &#8220;Limitations,&#8221; try &#8220;Some people worry that this approach won&#8217;t work for their situation, and here&#8217;s why it actually will.&#8221; This matches how voice searchers phrase their concerns.<br><br><strong>Part Five: Technical Optimization for Voice and AEO</strong><br><br>Schema markup is critical. Implement Article schema, FAQPage schema, HowTo schema for instructional content, and Product schema if applicable. Each schema type helps search engines understand your content structure.<br><br>Page speed is non-negotiable. Voice search users want answers immediately. Mobile sites should load in under two seconds. Optimize images, minimize code, and use content delivery networks.<br><br>Mobile optimization is essential. Most voice searches happen on mobile devices. Ensure your site is fully responsive, buttons are touch-friendly, and content is accessible on small screens.<br><br>Local SEO matters tremendously for voice search. Optimize your Google Business Profile, include local keywords naturally in your content, and structure your location information with schema markup.<br><br><strong>Part Six: Answer Box Optimization</strong><br><br>Answer boxes are the gateway to voice search results. To win answer boxes, you need to provide clear, concise answers to specific questions.<br><br>Target question-based keywords. Use tools to find questions people ask in your industry. Create dedicated content sections that answer these questions directly and thoroughly.<br><br>Use a featured snippet format. Aim to provide the answer in 40 to 60 words within the first paragraph of your content. Include context, but be direct.<br><br>Use tables and lists strategically. These formats frequently appear in answer boxes and voice search results. A comparison table or numbered list increases your chances of being selected.<br><br>Monitor your answer box performance. Track which queries are triggering your answer boxes and optimize accordingly. If you&#8217;re not appearing in answer boxes yet, analyze competitors who are and adjust your approach.<br><br><strong>Part Seven: Building a Voice-First Content Calendar</strong><br><br>Plan content around voice search intent. Allocate 40 percent of your content to answer specific questions, 30 percent to comprehensive guides that address multiple related questions, and 30 percent to thought leadership and trending topics.<br><br>Create content clusters. Develop a cornerstone piece that comprehensively addresses a main topic, then create satellite content that answers specific questions related to that topic. Link them together logically.<br><br>Prioritize long-tail keywords and question-based keywords. Voice searches are typically longer and more specific than text searches. Focus on keywords with four or more words.<br><br>Update existing content for voice search. Go through your top-performing pages and restructure them with voice search principles. Add FAQs, break content into chunks, and optimize for featured snippets.<br><br><strong>Part Eight: Measuring Voice Search Success</strong><br><br>Voice search metrics differ from traditional SEO metrics. You can&#8217;t directly see voice search traffic in Google Analytics the way you can see text search traffic.<br><br>Track answer box appearances. Monitor which queries are showing your content in answer boxes. This is a strong indicator of voice search visibility.<br><br>Monitor brand search volume. Voice search often includes brand names. If your branded search volume is increasing, voice assistants are likely recommending you.<br><br>Use Google Search Console data strategically. Look for queries with high impressions but low click-through rates. These are often voice search queries where your content is being read aloud without requiring a click.<br><br>Set up conversion tracking for voice-driven traffic. Measure phone calls, form submissions, and purchases that come from voice search traffic.<br><br><strong>Conclusion</strong><br><br>Voice search first strategy isn&#8217;t about abandoning traditional SEO, it&#8217;s about building on it intelligently. By structuring content conversationally, optimizing for featured snippets, implementing proper schema markup, and focusing on answering specific questions, you&#8217;ll dominate both voice search and answer box placements in 2026. The future belongs to businesses that speak their customers&#8217; language,literally.</p>]]></content:encoded></item><item><title><![CDATA[10 AI Startup Ideas With Massive Data Moats]]></title><description><![CDATA[The next generation of AI companies won&#8217;t win because they have better models. They&#8217;ll win because they have better data.]]></description><link>https://shreyaspatro.substack.com/p/10-ai-startup-ideas-with-massive</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/10-ai-startup-ideas-with-massive</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Mon, 16 Mar 2026 14:38:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The companies that quietly build proprietary datasets, feedback loops, and distribution pipelines today will have an almost unbreakable advantage tomorrow.</p><p>Here are <strong>10 AI startups that could build massive data moats.</strong></p><div><hr></div><h1>1. AI Sales Call Intelligence Platform</h1><p><strong>Idea:</strong><br>A platform that records, transcribes, and analyzes sales calls to train companies on what works.</p><p><strong>Product</strong></p><ul><li><p>Record Zoom/Meet calls</p></li><li><p>Analyze tone, objections, closing patterns</p></li><li><p>Generate sales coaching insights</p></li></ul><p><strong>Data Moat</strong></p><p>Over time the platform collects:</p><ul><li><p>Thousands of real sales conversations</p></li><li><p>Objection &#8594; response &#8594; conversion patterns</p></li><li><p>Industry specific closing strategies</p></li></ul><p>This becomes the <strong>largest dataset of real sales conversations</strong>, which can train extremely accurate sales AI agents.</p><p><strong>Why it wins</strong><br>The more companies use it &#8594; the better the dataset &#8594; the better the insights &#8594; more companies join.</p><div><hr></div><h1>2. Construction Site Intelligence AI</h1><p><strong>Idea:</strong><br>AI that monitors construction sites through cameras and detects safety violations, progress delays, and material usage.</p><p><strong>Product</strong></p><ul><li><p>Cameras on site</p></li><li><p>AI detects:</p><ul><li><p>safety violations</p></li><li><p>progress tracking</p></li><li><p>worker movement</p></li><li><p>material inventory</p></li></ul></li></ul><p><strong>Data Moat</strong></p><p>This creates a massive dataset of:</p><ul><li><p>construction progress timelines</p></li><li><p>safety violations</p></li><li><p>real-world building workflows</p></li></ul><p>No public dataset exists for this today.</p><div><hr></div><h1>3. AI Hiring Interview Intelligence</h1><p><strong>Idea</strong></p><p>An AI tool that records job interviews and learns what predicts successful employees.</p><p><strong>Product</strong></p><ul><li><p>Interview recording + transcription</p></li><li><p>AI analyzes candidate responses</p></li><li><p>Predicts job success probability</p></li></ul><p><strong>Data Moat</strong></p><p>After thousands of interviews the system learns:</p><ul><li><p>which answers correlate with performance</p></li><li><p>personality traits vs job success</p></li><li><p>interview &#8594; performance correlations</p></li></ul><p>This dataset becomes <strong>the most valuable hiring intelligence layer.</strong></p><div><hr></div><h1>4. AI Supply Chain Intelligence Platform</h1><p><strong>Idea</strong></p><p>An AI platform that aggregates supplier pricing, delays, logistics data, and predicts disruptions.</p><p><strong>Product</strong></p><ul><li><p>Integrates with ERP systems</p></li><li><p>Tracks supplier performance</p></li><li><p>Predicts delivery delays</p></li></ul><p><strong>Data Moat</strong></p><p>Over time the system builds:</p><ul><li><p>supplier reliability datasets</p></li><li><p>global logistics delays</p></li><li><p>pricing fluctuations</p></li><li><p>manufacturing timelines</p></li></ul><p>This becomes a <strong>global supply chain intelligence layer.</strong></p><div><hr></div><h1>5. AI Real Estate Pricing Intelligence</h1><p><strong>Idea</strong></p><p>An AI that predicts property prices better than traditional valuation models.</p><p><strong>Product</strong></p><ul><li><p>Scrapes listings</p></li><li><p>analyzes neighborhood development</p></li><li><p>tracks transactions</p></li></ul><p><strong>Data Moat</strong></p><p>The platform collects:</p><ul><li><p>listing &#8594; final sale price data</p></li><li><p>time on market</p></li><li><p>buyer behavior</p></li><li><p>micro-neighborhood price trends</p></li></ul><p>This becomes the <strong>largest real estate transaction intelligence dataset.</strong></p><p><em>(Very relevant in cities like Bangalore.)</em></p><div><hr></div><h1>6. AI Doctor Assistant That Learns From Consultations</h1><p><strong>Idea</strong></p><p>An AI assistant that listens to doctor consultations and helps with diagnosis and note taking.</p><p><strong>Product</strong></p><ul><li><p>records doctor-patient conversations</p></li><li><p>suggests possible diagnoses</p></li><li><p>auto generates medical notes</p></li></ul><p><strong>Data Moat</strong></p><p>Over time the system collects:</p><ul><li><p>symptoms &#8594; diagnosis mappings</p></li><li><p>doctor reasoning patterns</p></li><li><p>treatment effectiveness</p></li></ul><p>This becomes <strong>one of the most valuable healthcare datasets.</strong></p><div><hr></div><h1>7. AI Startup Intelligence Platform</h1><p><strong>Idea</strong></p><p>A platform that tracks startup launches, traction signals, hiring trends, and product launches.</p><p><strong>Product</strong></p><ul><li><p>scans GitHub</p></li><li><p>scans product launches</p></li><li><p>tracks hiring</p></li><li><p>tracks funding</p></li></ul><p><strong>Data Moat</strong></p><p>Over time it builds:</p><ul><li><p>startup traction signals</p></li><li><p>founder patterns</p></li><li><p>growth signals before funding</p></li></ul><p>Essentially <strong>Bloomberg for startups.</strong></p><div><hr></div><h1>8. AI Customer Support Intelligence Layer</h1><p><strong>Idea</strong></p><p>An AI platform that aggregates millions of customer support interactions.</p><p><strong>Product</strong></p><ul><li><p>ticket analysis</p></li><li><p>response optimization</p></li><li><p>auto responses</p></li></ul><p><strong>Data Moat</strong></p><p>Over time the platform builds:</p><ul><li><p>issue &#8594; resolution datasets</p></li><li><p>product failure patterns</p></li><li><p>customer sentiment signals</p></li></ul><p>This becomes the <strong>largest customer problem dataset in the world.</strong></p><div><hr></div><h1>9. AI Personal Finance Behavior Dataset</h1><p><strong>Idea</strong></p><p>An AI finance assistant that learns spending behavior across millions of users.</p><p><strong>Product</strong></p><ul><li><p>expense tracking</p></li><li><p>investment suggestions</p></li><li><p>budgeting automation</p></li></ul><p><strong>Data Moat</strong></p><p>Over time it collects:</p><ul><li><p>spending patterns</p></li><li><p>savings habits</p></li><li><p>investment decisions</p></li><li><p>financial life cycles</p></li></ul><p>This becomes the <strong>largest behavioral finance dataset.</strong></p><div><hr></div><h1>10. AI Creator Content Intelligence</h1><p><strong>Idea</strong></p><p>An AI that analyzes millions of social media posts and learns what content performs.</p><p><strong>Product</strong></p><ul><li><p>analyzes reels / TikTok / YouTube</p></li><li><p>predicts viral probability</p></li><li><p>generates content suggestions</p></li></ul><p><strong>Data Moat</strong></p><p>The platform learns:</p><ul><li><p>hook effectiveness</p></li><li><p>storytelling patterns</p></li><li><p>topic virality</p></li><li><p>creator growth patterns</p></li></ul><p>This becomes the <strong>largest dataset of viral content mechanics.</strong></p><div><hr></div><h1>The Real Lesson</h1><p>The best AI companies don&#8217;t start with <strong>models</strong>.</p><p>They start with <strong>data loops</strong>.</p><p>The winning playbook:</p><ol><li><p>Build a useful tool</p></li><li><p>Collect proprietary data</p></li><li><p>Train AI on that data</p></li><li><p>Improve the product</p></li><li><p>Repeat</p></li></ol><p>The companies that control the <strong>best data layers</strong> will quietly dominate the next decade of AI.</p>]]></content:encoded></item><item><title><![CDATA[How to Use AI at Work Without Breaking Your Systems?]]></title><description><![CDATA[AI coding assistants have changed the way engineers work.]]></description><link>https://shreyaspatro.substack.com/p/how-to-use-ai-at-work-without-breaking</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/how-to-use-ai-at-work-without-breaking</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Wed, 11 Mar 2026 14:49:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI coding assistants have changed the way engineers work. Tools like Claude Code, GitHub Copilot, Cursor, and ChatGPT can now write functions, debug errors, refactor entire codebases, and generate infrastructure scripts in seconds. For developers, this feels like a superpower  and in many ways, it is.</p><p>But superpowers come with risk.</p><p> A developer lost 2.5 years of work after an AI coding assistant executed <code>terraform destroy</code> while attempting to fix a configuration issue. The AI didn&#8217;t malfunction. It didn&#8217;t go rogue. It simply did what it was asked,  and nobody stopped it.</p><p>That&#8217;s the uncomfortable truth about AI in engineering workflows: the tool isn&#8217;t the problem. Over-reliance on it without safeguards is.</p><p>The right mental model is this: treat AI like a brilliant junior engineer. Incredibly fast, impressively knowledgeable, but lacking real-world judgment. You wouldn&#8217;t give a junior developer unsupervised access to your production database on day one. The same logic applies here. AI should always be supervised, verified, and contained ,never autonomous.</p><div><hr></div><h2>The Real Risks of AI in Engineering Workflows</h2><p>Most engineers understand that AI can generate buggy code. What they underestimate is that AI can also take destructive, irreversible actions ,and do so confidently.</p><p>Here&#8217;s what that looks like in practice:</p><p><strong>Destructive commands.</strong> AI assistants operating in agentic mode can run terminal commands directly. Without guardrails, a prompt like &#8220;clean up unused infrastructure&#8221; could trigger <code>terraform destroy</code> or <code>rm -rf</code> on critical directories.</p><p><strong>Database deletion.</strong> An AI tasked with &#8220;resetting the dev environment&#8221; may not distinguish between a local test database and a production one &#8212; especially if permissions aren&#8217;t scoped correctly.</p><p><strong>File overwrites.</strong> AI-generated scripts that write to the filesystem can silently overwrite configuration files, environment variables, or deployment scripts without warning.</p><p><strong>Infrastructure misconfiguration.</strong> AI-generated Terraform, Kubernetes, or Ansible files often look correct at a glance but contain subtle errors, open security groups, misconfigured IAM roles, or exposed ports, that create serious vulnerabilities.</p><p><strong>Broken deployments.</strong> AI may generate code that passes basic tests but fails under production conditions, and if there&#8217;s no human review gate, that code ships.</p><p>The underlying issue is consistent: AI executes instructions but does not understand consequences. It has no concept of &#8220;this will take down your system&#8221; or &#8220;there&#8217;s no undoing this.&#8221; That judgment belongs to the human in the loop,  which means the human must actually be in the loop.</p><div><hr></div><h2>The AI Safety Checklist</h2><p>This is the section to save, share, and pin to your team&#8217;s Notion.</p><h3>Access Control</h3><ul><li><p><strong>Never give AI direct production access.</strong> AI tools should operate in sandboxed or development environments only.</p></li><li><p><strong>Use scoped permissions.</strong> If an AI agent needs database access, give it read-only credentials, not admin.</p></li><li><p><strong>Audit what your AI tool can touch.</strong> Know exactly which systems, APIs, and filesystems an AI assistant has access to before you run anything.</p></li></ul><h3>Command Verification</h3><ul><li><p><strong>Always read AI-generated commands before running them.</strong> Every single time, without exception.</p></li><li><p><strong>Never blindly copy-paste terminal commands.</strong> If you don&#8217;t understand what a command does, look it up before executing it.</p></li><li><p><strong>Be especially cautious with flags.</strong> Commands like <code>--force</code>, <code>--all</code>, <code>-r</code>, or <code>--delete</code> are red flags that warrant extra scrutiny.</p></li></ul><h3>Infrastructure Protection</h3><ul><li><p><strong>Treat destructive commands as radioactive.</strong> <code>terraform destroy</code>, <code>rm -rf</code>, <code>DROP TABLE</code>, <code>kubectl delete namespace</code>, these require human confirmation, full stop.</p></li><li><p><strong>Add confirmation steps to critical operations.</strong> If your tooling allows it, require explicit approval before any command that modifies or deletes infrastructure.</p></li><li><p><strong>Version control your infrastructure code.</strong> Changes to Terraform, Helm charts, or deployment configs should go through pull requests, not direct execution.</p></li></ul><h3>Backup Strategy</h3><ul><li><p><strong>Maintain multiple backups, in multiple locations.</strong> Local, cloud, and offsite. The developer who lost 2.5 years of data had none.</p></li><li><p><strong>Test your recovery procedures.</strong> A backup you&#8217;ve never restored is a backup you can&#8217;t trust.</p></li><li><p><strong>Automate backups and verify them regularly.</strong> Don&#8217;t rely on manual processes for something this critical.</p></li></ul><h3>Deployment Safety</h3><ul><li><p><strong>Always use a staging environment.</strong> AI-generated code should be tested in an environment that mirrors production, not in production itself.</p></li><li><p><strong>Use CI/CD pipelines with human approval gates.</strong> Automated checks catch many issues; human review catches the rest.</p></li><li><p><strong>Never let AI push directly to main.</strong> PRs exist for a reason. Use them.</p></li></ul><div><hr></div><h2>Best Practices for Using AI at Work</h2><p>The checklist tells you what to avoid. Here&#8217;s how to get the most out of AI while staying safe.</p><p><strong>Use AI for drafting, not executing.</strong> AI is exceptional at generating code, writing scripts, and proposing solutions. Let it do that. Reserve execution for humans who&#8217;ve reviewed the output.</p><p><strong>Make incremental changes.</strong> Instead of asking AI to &#8220;refactor the entire authentication system,&#8221; ask it to refactor one function. Smaller changes are easier to review, easier to test, and easier to roll back.</p><p><strong>Use AI suggestions as proposals, not instructions.</strong> When an AI says &#8220;run this command,&#8221; treat it the way you&#8217;d treat advice from a colleague, worth considering, but requiring your own judgment before acting.</p><p><strong>Keep humans in the loop for critical operations.</strong> Anything touching production, customer data, or infrastructure should have a human review step. No exceptions.</p><p><strong>Document your AI-assisted changes.</strong> If AI helped write a migration script or infrastructure change, note that in your commit message or PR description. Your future self and teammates will thank you.</p><div><hr></div><h2>A Simple Rule Engineers Should Remember</h2><p>When in doubt, come back to this framework:</p><p><strong>AI &#8594; Suggests. Human &#8594; Verifies. System &#8594; Executes.</strong></p><p>AI is a proposal engine, not a decision-maker. The moment you remove the human verification step  because you&#8217;re tired, rushed, or just confident,  is the moment you&#8217;re exposed. The <code>terraform destroy</code> incident didn&#8217;t happen because AI is dangerous. It happened because the human step was skipped.</p><p>Build workflows where skipping that step is impossible. Review before you run. Verify before you deploy. Back up before you change anything critical.</p><p>The engineers who use AI most effectively aren&#8217;t the ones who trust it most. They&#8217;re the ones who&#8217;ve built just enough friction to stay in control.</p>]]></content:encoded></item><item><title><![CDATA[Why AI-Built Websites Don’t Show Up on Google (And How to Fix It)]]></title><description><![CDATA[SEO guide for AI generated websites in 2026]]></description><link>https://shreyaspatro.substack.com/p/why-ai-built-websites-dont-show-up</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/why-ai-built-websites-dont-show-up</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Sat, 21 Feb 2026 16:15:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><p>You shipped your product. The landing page looks clean. You used Lovable, Replit, or a GPT-powered scaffold to build it in a weekend. You&#8217;re proud of it. Then you check Google a few weeks later and your site is essentially invisible.</p><p>This isn&#8217;t bad luck. It&#8217;s architecture.</p><p>Most AI-generated web apps have a structural problem baked in from the start , one that makes them nearly impossible for search engines to index properly. The good news: it&#8217;s fixable. But first, you need to understand what&#8217;s actually happening under the hood.</p><div><hr></div><h2>Your Website Might Be Invisible to Google by Default</h2><p>When Google&#8217;s crawler visits a webpage, it reads HTML. That&#8217;s it. It doesn&#8217;t wait around. It doesn&#8217;t have patience. It just reads whatever markup is present at the moment it arrives, takes notes, and moves on.</p><p>Here&#8217;s the problem: a huge portion of AI-generated apps send the crawler an almost empty HTML file ,a shell  and then load all the actual content using JavaScript running in the browser. Google <em>sometimes</em> comes back to execute that JavaScript, but it&#8217;s delayed, inconsistent, and often incomplete. In competitive search environments, &#8220;sometimes&#8221; isn&#8217;t good enough.</p><p>Your content exists. Users who open your site in Chrome see it. But to Google&#8217;s crawler, your beautifully designed landing page might look like a blank document with a loading spinner.</p><div><hr></div><h2>What Client-Side Rendering Actually Means</h2><p>Client-side rendering (CSR) means your server sends a near-empty HTML file to the browser. The browser then downloads a JavaScript bundle, runs it, and <em>generates</em> the page content on the fly , inside the user&#8217;s device.</p><p>Think of it like receiving a flat-pack piece of furniture. You get the parts, and you assemble it yourself. The browser is doing the assembly work.</p><p>This is how React works by default. It&#8217;s how most Vite, Create React App, and AI-scaffolded projects are built out of the box. It&#8217;s fast to develop, easy to prototype, and perfectly fine for app dashboards or tools where SEO doesn&#8217;t matter.</p><p>For public-facing pages , landing pages, blog posts, product pages, docs, it&#8217;s a liability.</p><div><hr></div><h2>What Server-Side Rendering Actually Means</h2><p>Server-side rendering (SSR) flips the model. Instead of sending a blank shell and letting the browser do the work, your server generates the full HTML before sending it to anyone. When the crawler arrives, the page is already assembled. The text, the headings, the meta tags , all present, all readable.</p><p>Back to the furniture analogy: SSR is like receiving a piece that&#8217;s already built. It&#8217;s heavier to ship (more server computation per request), but it arrives ready to use.</p><p>Static generation is a related approach worth knowing: instead of building the page per request, you build it once at deploy time and serve a pre-rendered HTML file to everyone. For content that doesn&#8217;t change constantlymarketing pages, blogs, documentation , static generation is often the best of all worlds: fast, indexable, and cheap to serve.</p><div><hr></div><h2>Why AI Tools Default to CSR</h2><p>This isn&#8217;t a conspiracy. It&#8217;s a matter of simplicity.</p><p>CSR is easier to generate. A React app with client-side rendering is structurally simpler &#8212; no server logic, no data fetching at build time, no configuration for hydration or streaming. When an AI coding tool generates a project scaffold, it&#8217;s optimizing for getting something running quickly, not for production SEO.</p><p>Replit, Lovable, v0, and similar tools are excellent for rapid prototyping. They&#8217;re genuinely impressive. But they&#8217;re solving the &#8220;make something visible on screen&#8221; problem, not the &#8220;make something discoverable on Google&#8221; problem. Those are different problems with different solutions.</p><p>Nobody is doing anything wrong here. The default just happens to be wrong for founders who want organic traffic.</p><div><hr></div><h2>The SEO Implications Are Worse Than You Think</h2><p>It&#8217;s not just that Google might miss your content. It&#8217;s what that means downstream.</p><p>If your pages aren&#8217;t indexed, you don&#8217;t show up in search results. If you don&#8217;t show up, you don&#8217;t get organic clicks. If you don&#8217;t get organic clicks, you&#8217;re entirely dependent on paid ads, social, or word of mouth &#8212; channels that stop working the moment you stop paying or posting.</p><p>For early-stage founders, organic search is often the difference between a sustainable acquisition channel and a leaky bucket. A blog post that ranks can send traffic for years. A page that never gets indexed sends traffic for exactly as long as you manually promote it.</p><p>Beyond indexability, CSR also tends to produce poor Core Web Vitals scores &#8212; Google&#8217;s performance metrics. Slow JavaScript execution, large bundle sizes, and deferred rendering all hurt your rankings even when the content does eventually get indexed.</p><div><hr></div><h2>The Fix: Switch to Next.js with SSR or Static Generation</h2><p>Next.js is the most practical path forward for most founders building on React. It gives you SSR and static generation as first-class features, without forcing you to abandon the React ecosystem you&#8217;re probably already in.</p><p>Here&#8217;s how to approach it:</p><p><strong>For marketing pages and blogs</strong> , use Static Site Generation (SSG). In Next.js, this means using <code>getStaticProps</code> (in the Pages Router) or simply making your component a Server Component by default (in the App Router). Your content gets pre-rendered at build time and served as plain HTML. Google loves it.</p><p><strong>For pages with dynamic data</strong> ,  use Server-Side Rendering. In the App Router, any component that fetches data on the server is rendered server-side by default. In the Pages Router, <code>getServerSideProps</code> does the job. The page is assembled on the server before delivery.</p><p><strong>For hybrid apps</strong>, mix and match. Your dashboard can stay client-side. Your landing page, pricing page, and blog posts should be statically generated or server-rendered.</p><p>Migrating an existing CSR app to Next.js isn&#8217;t painless, but it&#8217;s not a rewrite either. Move your components over, shift your data fetching to server functions, and configure your metadata using Next.js&#8217;s built-in <code>&lt;Head&gt;</code> component or the Metadata API in the App Router.</p><p>One more thing: make sure you&#8217;re setting proper <code>&lt;title&gt;</code> and <code>&lt;meta description&gt;</code> tags on every public-facing page. AI-generated apps frequently skip this entirely, which is its own separate SEO problem.</p><div><hr></div><h2>Practical Checklist Before You Launch</h2><p>Run through this before your next public-facing page goes live:</p><ul><li><p>Confirm your framework uses SSR or static generation for all public routes, not just the dashboard</p></li><li><p>Open your page source (<code>View Page Source</code> in Chrome, not DevTools) and check that your actual content appears in the raw HTML &#8212; not a <code>&lt;div id="root"&gt;&lt;/div&gt;</code> and nothing else</p></li><li><p>Verify that every page has a unique <code>&lt;title&gt;</code> and a <code>&lt;meta name="description"&gt;</code> tag</p></li><li><p>Submit your sitemap to Google Search Console and request indexing for your key pages</p></li><li><p>Run a Lighthouse audit and target a Performance score above 80 on mobile</p></li><li><p>Check that your <code>robots.txt</code> isn&#8217;t accidentally blocking Googlebot</p></li><li><p>Use the URL Inspection tool in Google Search Console to see exactly what Google sees when it crawls your pages</p></li></ul><div><hr></div><h2>SEO Is Architecture, Not an Afterthought</h2><p>Here&#8217;s the insight most people miss: SEO isn&#8217;t a marketing task. It&#8217;s an engineering decision made at the beginning of a project, not a checklist item added at the end.</p><p>The choice between CSR and SSR determines whether search engines can read your site at all. The structure of your URLs determines how your site gets crawled. The speed of your server response determines how your pages rank. These are architectural choices, not copy tweaks.</p><p>If you build on CSR and then wonder why your SEO isn&#8217;t working, you&#8217;re asking the right question six months too late. The answer was always in the foundation.</p><p>AI tools are getting better at scaffolding SEO-friendly defaults, but they&#8217;re not there yet. Until they are, the burden falls on you to know what you&#8217;re building, not just that it runs.</p><p>Build in public. Build fast. But build on something Google can actually read.</p>]]></content:encoded></item><item><title><![CDATA[The VALUE Lens: How to Work on Things That Actually Matter]]></title><description><![CDATA[Most people waste time because they lack clarity, not discipline.]]></description><link>https://shreyaspatro.substack.com/p/the-value-lens-how-to-work-on-things</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/the-value-lens-how-to-work-on-things</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Sun, 08 Feb 2026 14:08:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most people waste time because they lack clarity, not discipline.</p><p>They work hard. They ship things. But the impact doesn&#8217;t match the effort.</p><p>Sarah spent three months building a dashboard no one asked for. It had beautiful charts, real-time updates, and custom filters. Her manager thanked her. Then they kept using the old spreadsheet.</p><p>The problem isn&#8217;t laziness. It&#8217;s that most work feels productive without being valuable.</p><p>The VALUE lens is a filter. It asks one question before you start: <em>Is this worth doing?</em></p><p>Not &#8220;Can I do this?&#8221; or &#8220;Should someone do this?&#8221;</p><p>Just: <em>Is this worth doing?</em></p><div><hr></div><h2>The Lens</h2><p>All high-impact work does at least one of three things:</p><p><strong>It makes something faster.</strong></p><p><strong>It makes someone more money.</strong></p><p><strong>It prevents costly problems.</strong></p><p>That&#8217;s it.</p><p>Marcus was building a new feature. Before writing code, he asked: which path does this serve?</p><p>The feature would save support teams 15 minutes per ticket. They handled 200 tickets daily. That&#8217;s 50 hours a week back.</p><p>He shipped it in two days instead of planning for two weeks.</p><div><hr></div><p>Work that falls outside these categories can feel important. It can keep you busy. It can even get praised.</p><p>But it rarely creates value.</p><p>Elena ran weekly strategy meetings. Everyone attended. Nothing changed afterward.</p><p>She killed the meetings. Started a shared doc instead. Decisions that took a week now took a day.</p><p>Her team delivered more. She worked less.</p><div><hr></div><h2>How to Use It</h2><p>Before you commit, ask yourself three questions:</p><p><strong>What becomes easier after this is done?</strong></p><div><hr></div><p><strong>Who benefits  , and how?</strong></p><p>Anna proposed a new onboarding flow. Her answer: &#8220;New users will understand the product better.&#8221;</p><p>That&#8217;s not an answer. That&#8217;s a hope.</p><p>She dug deeper. She found that 40% of trial users churned because they couldn&#8217;t find the import feature. The new flow would surface it immediately.</p><p>Now she had an answer: trial users would convert 20% more. That&#8217;s measurable value.</p><div><hr></div><h2>Close</h2><p>Hard work is common.</p><p>Valuable work is rare.</p><p>This lens doesn&#8217;t make you work harder. It makes you work on the right things, not more things.</p><p>The people who create disproportionate impact aren&#8217;t working longer hours. They&#8217;re just better at saying no to everything else.</p>]]></content:encoded></item><item><title><![CDATA[2026 Code to Systems Playbook]]></title><description><![CDATA[The Missing Skills Engineers Need in 2026]]></description><link>https://shreyaspatro.substack.com/p/2026-code-to-systems-playbook</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/2026-code-to-systems-playbook</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Tue, 27 Jan 2026 10:39:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FzQj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Introduction</h2><p>Somewhere around 2023, &#8220;I can code&#8221; stopped being a useful signal. Not because coding became less important, but because it became assumed, the way literacy is assumed in office work. You wouldn&#8217;t put &#8220;can read and write&#8221; on a resume. By 2026, listing programming languages feels roughly the same.</p><p>What replaced it isn&#8217;t another certification or framework. It&#8217;s the ability to think in systems: understanding trade-offs, owning outcomes beyond your pull request, and treating AI as infrastructure rather than magic. The engineers who feel replaceable in 2026 are the ones still optimizing for output. The ones moving forward are optimizing for judgment.</p><p>This isn&#8217;t about becoming a genius. It&#8217;s about closing a specific gap: the distance between writing code that works and building systems that matter.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FzQj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FzQj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png 424w, https://substackcdn.com/image/fetch/$s_!FzQj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png 848w, https://substackcdn.com/image/fetch/$s_!FzQj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!FzQj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FzQj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png" width="706" height="1056" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1056,&quot;width&quot;:706,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1176877,&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://shreyaspatro.substack.com/i/185944308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.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_!FzQj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png 424w, https://substackcdn.com/image/fetch/$s_!FzQj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png 848w, https://substackcdn.com/image/fetch/$s_!FzQj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!FzQj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b3399d5-dda7-44c6-9d08-15454af0cbc1_706x1056.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><div><hr></div><h2>Why Coding Became the Baseline</h2><p>In 2020, writing a React component or a Flask API was still a marketable skill. By 2026, Claude, Cursor, and GitHub Copilot can scaffold most of that work in minutes. A junior engineer with good prompting skills can produce clean, functional code faster than a senior engineer could five years ago.</p><p>This isn&#8217;t speculative. It&#8217;s observable. Code generation tools didn&#8217;t replace engineers, they raised the floor. The result is that <em>everyone&#8217;s</em> output looks competent. A well-prompted AI produces code that passes linting, follows conventions, and handles edge cases. It doesn&#8217;t produce code with taste, context, or strategic awareness, but it produces code that <em>works</em>.</p><p>When everyone can ship features quickly, output stops being a differentiator. What matters now is whether you understand <em>why</em> you&#8217;re building something, what breaks when it scales, and what happens when the assumptions change.</p><p>The commoditization of coding isn&#8217;t a crisis. It&#8217;s a forcing function. It pushes engineers toward the skills that were always more valuable but previously hidden behind the barrier of simply getting things to run.</p><div><hr></div><h2>System Design as a Survival Skill</h2><p>System design used to be something you learned after years of production incidents. In 2026, it&#8217;s a survival skill you need from day one.</p><p>This doesn&#8217;t mean drawing architecture diagrams or memorizing CAP theorem. It means thinking in trade-offs. When you add a caching layer, you&#8217;re not just making things faster,you&#8217;re introducing stale data, complexity, and a new failure mode. When you choose a database, you&#8217;re committing to operational characteristics that will outlive your tenure at the company.</p><p>Engineers who think in systems ask different questions:</p><ul><li><p>What happens when this breaks?</p></li><li><p>What are we optimizing for, and what are we giving up?</p></li><li><p>Who owns this when I&#8217;m gone?</p></li></ul><p>These aren&#8217;t abstract concerns. They&#8217;re the difference between a feature that works in staging and a feature that works in production at 3 AM when the on-call engineer isn&#8217;t you.</p><p>The shift from &#8220;coder&#8221; to &#8220;systems thinker&#8221; is also a shift in responsibility. You&#8217;re no longer just implementing a spec. You&#8217;re accountable for whether the spec was correct, whether the implementation will hold up under load, and whether the monitoring will catch the failure before customers do.</p><p>This is uncomfortable. It means you can&#8217;t hide behind &#8220;I did what I was told.&#8221; But it&#8217;s also leverage. Engineers who own outcomes,who think past the immediate task to the second-order effects, become the ones leadership trusts with harder problems.</p><div><hr></div><h2>AI Skills That Actually Matter (Not Tools)</h2><p>Every few months, someone asks: &#8220;What AI tool should I learn?&#8221; Wrong question. Tools change every quarter. What matters is understanding AI as infrastructure.</p><p>By 2026, AI isn&#8217;t a product feature. It&#8217;s a reliability problem. You don&#8217;t &#8220;integrate ChatGPT&#8221;, you build a system that uses an LLM, handles failures gracefully, monitors for drift, and stays within budget. This requires the same discipline as any other infrastructure: evaluation, cost modeling, and failure awareness.</p><p><strong>Automation as infrastructure, not magic.</strong> Most engineers treat AI-generated code as a faster way to write functions. That&#8217;s fine for prototyping. In production, you need to think about automation as a system you&#8217;re responsible for. What happens when the model hallucinates? What&#8217;s the fallback? How do you validate outputs without human review becoming a bottleneck?</p><p><strong>RAG as a reliability problem.</strong> Retrieval-augmented generation (RAG) is useful, but it&#8217;s not magic. It&#8217;s a pipeline: embedding, retrieval, context injection, generation. Each step can fail. The embeddings might not capture semantic meaning. The retrieval might return irrelevant documents. The context window might be too small. Engineers who understand RAG as a system, not a library, know where to look when things break.</p><p><strong>Evaluation, cost, and failure awareness.</strong> In 2026, running inference isn&#8217;t free. A poorly optimized prompt can cost thousands of dollars a month. A model that&#8217;s 95% accurate sounds great until you realize the 5% failure rate applies to every user interaction. Engineers who succeed with AI aren&#8217;t the ones who know the most tools,they&#8217;re the ones who understand when <em>not</em> to use AI, how to measure success, and how to fail gracefully.</p><p>The hard part isn&#8217;t using AI. It&#8217;s knowing when your system is making things worse.</p><div><hr></div><h2>Reading the Tech Bloodstream</h2><p>In 2026, staying relevant isn&#8217;t about learning the newest framework. It&#8217;s about understanding how technology actually moves, what&#8217;s changing, why it matters, and what comes next.</p><p>This isn&#8217;t trend-chasing. It&#8217;s pattern recognition. When Kubernetes became the standard for orchestration, it wasn&#8217;t because it was the best tool&#8212;it was because it solved the right abstraction at the right time for enough companies to create momentum. Engineers who saw that early didn&#8217;t just learn Kubernetes; they understood <em>why</em> it won.</p><p>The same thing is happening now with AI infrastructure, with observability, with edge computing. The engineers who get ahead aren&#8217;t the ones who adopt every new tool&#8212;they&#8217;re the ones who can tell which shifts are durable and which are noise.</p><p>What to pay attention to:</p><ul><li><p><strong>Second-order effects.</strong> When a new tool or technique gets adopted, what changes downstream? When LLMs became reliable enough for production, it didn&#8217;t just mean &#8220;chatbots everywhere.&#8221; It meant customer support workflows changed, documentation strategies changed, and QA processes changed.</p></li><li><p><strong>Where the pain is.</strong> The best signals come from listening to what engineers are complaining about. If everyone&#8217;s talking about flaky tests, that&#8217;s not random, it&#8217;s a sign that the tooling hasn&#8217;t caught up to the complexity of modern systems.</p></li><li><p><strong>What&#8217;s getting easier.</strong> When something that used to take a week now takes an hour, that&#8217;s a forcing function. It means the bar just moved. The engineers who notice early adapt their skillset before the market adjusts.</p></li></ul><p>What to ignore:</p><ul><li><p>Hype cycles with no production users</p></li><li><p>&#8220;Revolutionary&#8221; tools from companies that don&#8217;t use them internally</p></li><li><p>Anything that promises to eliminate the need for engineering judgment</p></li></ul><p>The skill isn&#8217;t knowing everything. It&#8217;s knowing what to pay attention to.</p><div><hr></div><h2>The New Engineer Profile (2026)</h2><p>The difference between a coder and a systems engineer in 2026 isn&#8217;t years of experience. It&#8217;s orientation.</p><p><strong>A coder:</strong></p><ul><li><p>Implements specifications</p></li><li><p>Optimizes for output (lines of code, tickets closed)</p></li><li><p>Focuses on the immediate task</p></li><li><p>Relies on others to define success</p></li></ul><p><strong>A systems engineer:</strong></p><ul><li><p>Owns outcomes</p></li><li><p>Optimizes for reliability, maintainability, and impact</p></li><li><p>Thinks in trade-offs and failure modes</p></li><li><p>Defines success metrics and measures against them</p></li></ul><p>This isn&#8217;t about seniority. There are senior engineers who operate like coders&#8212;waiting for clear instructions, avoiding ownership beyond their pull request. There are junior engineers who operate like systems engineers&#8212;asking hard questions, anticipating failure modes, and taking responsibility for what happens after the code ships.</p><p>The shift is psychological. Systems engineers treat their work as infrastructure, not output. They understand that code is a liability&#8212;every line written is a line that needs to be maintained, debugged, and eventually replaced. They ship less, but what they ship lasts longer.</p><p>This is the profile companies are hiring for in 2026. Not &#8220;knows Python.&#8221; Not &#8220;has used Kubernetes.&#8221; But: understands systems, owns outcomes, and exercises judgment.</p><div><hr></div><h2>What to Learn Next (Actionable, Non-Overwhelming)</h2><p>If you&#8217;re reading this and feel behind, here&#8217;s the uncomfortable truth: you can&#8217;t catch up by collecting more tools. You catch up by building depth in the areas that matter.</p><p><strong>Start with systems thinking.</strong> Pick a system you use every day, your company&#8217;s API, your deployment pipeline, your monitoring stack, and understand it deeply. What are the failure modes? What are the trade-offs? What would you change if you owned it?</p><p><strong>Treat AI as infrastructure.</strong> Build something non-trivial with an LLM. Not a chatbot. Something where reliability, cost, and failure modes matter. Learn how to evaluate outputs, handle errors, and stay within budget.</p><p><strong>Read the architecture decisions at companies you respect.</strong> Most engineering blogs aren&#8217;t marketing they&#8217;re honest post-mortems about what worked and what didn&#8217;t. Read Uber&#8217;s microservices migration. Read Stripe&#8217;s API design principles. Read Netflix&#8217;s chaos engineering philosophy. Not to copy them, but to understand how they think.</p><p><strong>Own something in production.</strong> If you&#8217;re not on-call for something you built, you&#8217;re missing critical feedback. Production teaches you things no tutorial can: what breaks, how users actually behave, and what trade-offs matter.</p><p>The goal isn&#8217;t to learn everything. It&#8217;s to learn how to think in systems, own outcomes, and exercise judgment. Those skills compound. Tools don&#8217;t.</p><div><hr></div><h2>Conclusion</h2><p>In 2026, coding is table stakes. What separates engineers who feel replaceable from engineers who feel indispensable isn&#8217;t the languages they know or the frameworks they&#8217;ve used. It&#8217;s whether they think in systems, own outcomes, and understand how technology actually moves.</p><p>This isn&#8217;t a race. It&#8217;s a reorientation. The skills that matter now systems thinking, AI as infrastructure, reading the tech bloodstream, aren&#8217;t quick wins. They&#8217;re long-term leverage. You don&#8217;t acquire them in a weekend, but every production system you deeply understand, every failure mode you anticipate, and every trade-off you evaluate correctly compounds into judgment.</p><p>The uncomfortable part is that no one will tell you to do this. No manager will hand you a syllabus. The engineers who make this shift do it because they&#8217;ve realized that &#8220;I can code&#8221; is no longer enough, and they&#8217;d rather own their trajectory than wait for the market to tell them they&#8217;re behind.</p><p>You already know how to code. Now learn how to build systems that matter.</p>]]></content:encoded></item><item><title><![CDATA[Errors Are Instructions: How Product-Minded Engineers Design Failure]]></title><description><![CDATA[How Product-Minded Engineers Design Failure]]></description><link>https://shreyaspatro.substack.com/p/errors-are-instructions-how-product</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/errors-are-instructions-how-product</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Wed, 21 Jan 2026 06:36:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8O4C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>1. Introduction: Why Errors Matter More Than You Think</h2><p>Most people don&#8217;t experience your software through your features. They experience it through your failures.</p><p>Think about the last time you used an app. What do you remember? Probably not the smooth parts. You remember where it broke. Where you got stuck. Where you had to guess what went wrong.</p><p>Here&#8217;s the core idea: <strong>Errors are not edge cases. They are part of your product interface.</strong></p><p>This matters more in 2026 than ever before. AI systems fail quietly. Automation runs at scales where human oversight is impossible. The gap between &#8220;something broke&#8221; and &#8220;the user knows what to do&#8221; has never been wider. How you handle that gap defines whether your product feels reliable or broken.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8O4C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8O4C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png 424w, https://substackcdn.com/image/fetch/$s_!8O4C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png 848w, https://substackcdn.com/image/fetch/$s_!8O4C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!8O4C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8O4C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png" width="1020" height="1086" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1086,&quot;width&quot;:1020,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2482724,&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://shreyaspatro.substack.com/i/185271334?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3df449e0-6850-46d9-864c-5f11d9b4f57f_1024x1536.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_!8O4C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png 424w, https://substackcdn.com/image/fetch/$s_!8O4C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png 848w, https://substackcdn.com/image/fetch/$s_!8O4C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!8O4C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2911ab81-ec89-4cbb-8538-e9e855394d11_1020x1086.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>2. The Common Engineering Mistake</h2><p>Most engineers think about errors the wrong way.</p><p>We treat them as:</p><ul><li><p>Accidents that shouldn&#8217;t have happened</p></li><li><p>Bugs to fix later</p></li><li><p>Technical details to log and suppress</p></li></ul><p>This mindset makes sense from a code perspective. But it creates terrible user experiences.</p><p>Here&#8217;s what actually happens: A user tries to do something. It doesn&#8217;t work. They see an error message. Now they&#8217;re confused, blocked, or uncertain about what went wrong. They don&#8217;t care about your stack trace. They just want to keep moving.</p><p>The mistake is thinking errors are explanations of what broke. Users don&#8217;t need explanations. They need directions for what to do next.</p><h2>3. The Core Mental Model: Errors as Instructions</h2><p>Here&#8217;s the reframe: <strong>Errors are not explanations. They are directions.</strong></p><p>Think of errors like traffic signs. A bad error is a roadblock with no information. A good error is a detour sign that shows you the alternate route.</p><p>The key principle is forward motion. Every error should move the user toward resolution, not leave them stranded.</p><p>When you write an error message, you&#8217;re not documenting what broke. You&#8217;re giving instructions for what to do next. That&#8217;s the entire job.</p><h2>4. A Simple Example: Bad Error vs Good Error</h2><h3>4.1 Bad Error Example</h3><pre><code><code>Something went wrong. Please try again.</code></code></pre><p>Why this fails:</p><ul><li><p>No context about what &#8220;something&#8221; means</p></li><li><p>No action beyond &#8220;try again&#8221; (which might fail the same way)</p></li><li><p>Forces the user to guess what changed or what they did wrong</p></li></ul><p>This error answers none of the user&#8217;s questions. It just confirms that yes, something is broken.</p><h3>4.2 Good Error Example</h3><pre><code><code>Your file upload failed because it's larger than 10MB. 
Try compressing it or splitting it into smaller files.</code></code></pre><p>This works because it answers three questions:</p><ol><li><p><strong>What happened:</strong> The upload failed</p></li><li><p><strong>Why it happened:</strong> File too large (with the specific limit)</p></li><li><p><strong>What to do next:</strong> Compress or split the file</p></li></ol><p>The user now has a clear path forward. They&#8217;re not stuck. They&#8217;re not confused. They know exactly what to change.</p><h2>5. Why This Becomes Critical in AI Systems</h2><p>AI systems fail differently than traditional software.</p><p>Traditional software crashes loudly. You get a 500 error. The page doesn&#8217;t load. It&#8217;s obvious something broke.</p><p>AI systems fail quietly. They return results with confidence. They complete the request. But the output is wrong. Incomplete. Hallucinated. And because there&#8217;s no obvious crash, users often don&#8217;t realize it failed at all.</p><p>This changes everything about error design.</p><p><strong>Confidence does not equal correctness.</strong> An AI can sound extremely certain about something completely false. When this happens without any error signal, users are misled rather than informed.</p><p>Poor error handling in AI systems leads to:</p><ul><li><p>Silent failures that propagate downstream</p></li><li><p>Users making decisions based on incorrect information</p></li><li><p>Broken trust that&#8217;s hard to rebuild</p></li></ul><p>Here&#8217;s the key insight: <strong>In AI systems, errors are safety mechanisms, not just UX details.</strong> They&#8217;re how you prevent quiet failures from becoming real-world problems.</p><h2>6. Product-Minded Error Design: A Practical Framework</h2><p>Every error should answer three questions:</p><ol><li><p><strong>What just happened?</strong> (State the outcome clearly)</p></li><li><p><strong>Why did it happen?</strong> (In terms the user understands, not technical jargon)</p></li><li><p><strong>What should I do next?</strong> (Give a specific action they can take)</p></li></ol><p>The third question is the most important. If your error doesn&#8217;t tell users what to do next, it&#8217;s not an instruction. It&#8217;s just a notification of failure.</p><p>Design errors intentionally, not as afterthoughts. When you&#8217;re building a feature, spend time thinking through the failure cases. What could go wrong? What will users need to know when it does?</p><p>Treat error states like any other part of the interface. They deserve the same care as your success states.</p><h2>7. Where Errors Should Be Designed (Not Just Written)</h2><p>Errors should be designed at the interface level, where you know the user&#8217;s intent.</p><p>Low-level system errors confuse users because they lack context. &#8220;Database connection timeout&#8221; means nothing to someone trying to save their work. &#8220;We couldn&#8217;t save your changes. Check your internet connection and try again&#8221; gives them something to act on.</p><p>This means pushing error handling up the stack to where you have context about what the user was trying to do. The best place to handle an error is the place where you can translate technical failure into user-facing guidance.</p><p>Think &#8220;shift left&#8221; for errors. The earlier you can give feedback, the less costly the failure. A form that validates on blur is better than one that waits until submit. An upload that checks file size before starting is better than one that fails after a 10-minute upload completes.</p><h2>8. The Clear Takeaway</h2><p><strong>If your errors don&#8217;t guide users forward, your product feels broken &#8212; even if it works.</strong></p><p>This is what product-minded engineering means in practice. You&#8217;re not just making the system function. You&#8217;re making it usable when it doesn&#8217;t function.</p><p>Good error design is how you maintain trust when things go wrong. And things always go wrong eventually.</p><p>In 2026 and beyond, as systems get more complex and failures get harder to predict, this skill becomes more valuable, not less.</p><h2>9. Closing: Invitation to Go Deeper</h2><p>Writing good errors is hard. It requires thinking from the user&#8217;s perspective. It requires translating technical failures into actionable guidance. It requires designing for the moments when your system lets people down.</p><p>But it&#8217;s a learnable skill. With practice, you start seeing error cases differently. You start designing for failure with the same care you design for success.</p><p>If you want a practical starting point, I&#8217;ve put together a concise guide with a checklist you can use when reviewing your error messages. It breaks down the framework into specific questions and examples you can apply immediately.</p><p>The best products aren&#8217;t the ones that never fail. They&#8217;re the ones that fail gracefully and guide you through it</p><p>.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Stop Building Apps That Don't Make Money]]></title><description><![CDATA[10 Boring Projects That Actually Make Money or Signal Real Value]]></description><link>https://shreyaspatro.substack.com/p/stop-building-apps-that-dont-make</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/stop-building-apps-that-dont-make</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Thu, 15 Jan 2026 13:40:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Stop Building Apps That Don&#8217;t Make Money</h1><p>Most developers waste years building things nobody will ever pay for.</p><p>You pour months into a habit tracker with beautiful animations. You clone Airbnb &#8220;but for X.&#8221; You build a social platform for a niche hobby. You add auth, deploy to Vercel, write a launch post, get 47 upvotes on Reddit, and then... nothing. No users. No revenue. No leverage.</p><p>Meanwhile, someone builds a PDF invoice generator, charges $29/month, and makes more in a weekend than you made all year.</p><p>The difference isn&#8217;t talent. It&#8217;s understanding what software is actually worth.</p><h2>The Illusion: Consumer Apps Feel Like Progress</h2><p>Consumer apps are a trap disguised as ambition.</p><p>They feel legitimate because they&#8217;re visible. You can show your parents. You can tweet screenshots. They look like the apps you use daily, so building them feels like &#8220;real&#8221; software development.</p><p>But visibility doesn&#8217;t equal value. A polished to-do app with tags, filters, and dark mode is impressive engineering. It&#8217;s also worth exactly $0 to 99.9% of the market, because Notion exists, Apple Notes is free, and switching costs are brutal for consumer software.</p><p>The cold truth: consumer apps compete on brand, distribution, and network effects, things solo developers and small teams will never have. You&#8217;re not failing because your code isn&#8217;t good enough. You&#8217;re failing because you picked a market where code quality doesn&#8217;t matter.</p><h2>The Real Reason Companies Pay for Software</h2><p>Businesses don&#8217;t buy software because it&#8217;s elegant or fun to use. They buy it because it makes or saves money, reduces risk, or automates what humans do badly.</p><p>Here&#8217;s what actually drives software purchases:</p><p><strong>Cost reduction</strong>: A tool that eliminates manual work or replaces expensive labor gets approved instantly. If your software saves a company $5,000/month in employee hours, a $500/month subscription is a rounding error.</p><p><strong>Reliability and compliance</strong>: Companies pay obscene amounts for boring software that just works. Payroll systems. Backup solutions. Audit log generators. These aren&#8217;t exciting, but failure costs millions in fines, lawsuits, or lost business.</p><p><strong>Leverage and automation</strong>: Businesses will pay for anything that lets one person do the work of three. Scripts that auto-generate reports. APIs that sync data between systems. Tools that eliminate busywork.</p><p><strong>Risk mitigation</strong>: Enterprise software isn&#8217;t about features,it&#8217;s about not getting fired. A CTO will pay $10K/year for error monitoring because the alternative is waking up to a site outage with no diagnostics.</p><p>Notice what&#8217;s missing from this list? User experience. Virality. Community features. Gamification. The things developers obsess over are noise to the people who actually sign checks.</p><h2>The Shift: Build Infrastructure, Not Experiences</h2><p>The moment you stop thinking like a consumer and start thinking like a business, everything changes.</p><p>Consumer apps ask: &#8220;What do users want?&#8221;<br>Enterprise tools ask: &#8220;What problem costs money to ignore?&#8221;</p><p>Stop building full products. Start building single-purpose systems that solve one expensive problem extremely well.</p><p>Don&#8217;t build a project management app. Build an API that auto-generates burn-down charts from Jira data and emails them to management every Monday. Sell it to CTOs who are tired of manually compiling reports.</p><p>Don&#8217;t build a social network for book lovers. Build a service that monitors copyright infringement across ebook piracy sites and sends DMCA notices automatically. Sell it to publishers.</p><p>Don&#8217;t build a meditation app. Build a HIPAA-compliant video API for telehealth platforms. Sell it to startups that need video calling but can&#8217;t afford to build compliance from scratch.</p><p>See the pattern? Narrow problem. Clear buyer. Expensive alternative.</p><h2>The Value Lens: Who Pays and Why?</h2><p>Before you write a single line of code, answer these three questions:</p><ol><li><p><strong>Who has this problem badly enough to pay?</strong> If your answer is &#8220;everyone&#8221; or &#8220;users who care about productivity,&#8221; you don&#8217;t have an answer.</p></li><li><p><strong>What does solving this problem save or make them?</strong> If you can&#8217;t quantify this in dollars or hours, you can&#8217;t price your product.</p></li><li><p><strong>Why can&#8217;t they solve it themselves?</strong> If the answer is &#8220;they could, but it would take time,&#8221; that&#8217;s not enough. It needs to be: &#8220;They can&#8217;t because it requires specialized knowledge, constant maintenance, or regulatory expertise.&#8221;</p></li></ol><p>This lens kills 90% of your ideas immediately. Good. Those ideas were going to fail anyway.</p><h2>What to Build Instead</h2><p>Here&#8217;s what separates developers who make money from developers who collect GitHub stars:</p><p><strong>Build for businesses, not consumers.</strong><br>Businesses have budgets. Consumers have objections.</p><p><strong>Build tools, not platforms.</strong><br>Platforms need network effects. Tools need to solve one problem well.</p><p><strong>Build boring infrastructure.</strong><br>Nobody brags about their backup solution, but everyone pays for it.</p><p><strong>Build things that prevent disasters.</strong><br>Companies pay more to avoid losses than to chase gains.</p><p>Let me be specific.</p><div><hr></div><h1>10 Boring Projects That Actually Make Money or Signal Real Value</h1><h2>1. Automated Compliance Report Generator</h2><p><strong>What it solves</strong>: Companies waste dozens of hours monthly compiling SOC 2, GDPR, or HIPAA compliance reports from logs, access records, and audit trails.</p><p><strong>Who pays</strong>: SaaS startups, healthcare tech companies, fintech platforms&#8212;anyone facing audits.</p><p><strong>Why it&#8217;s valuable</strong>: Manual compliance reporting costs $5K&#8211;$20K per audit. A tool that auto-generates reports from existing systems and maintains an audit-ready trail is worth $500&#8211;$2K/month.</p><p><strong>Why it&#8217;s boring</strong>: No one talks about compliance at parties. But every regulated company needs it, and lawyers charge $400/hour to review documentation.</p><div><hr></div><h2>2. API Gateway with Built-in Rate Limiting and Usage Billing</h2><p><strong>What it solves</strong>: Companies exposing APIs need to rate-limit users, track consumption, and generate invoices based on usage. Building this from scratch takes weeks.</p><p><strong>Who pays</strong>: B2B SaaS companies, API-first startups, any platform selling metered access.</p><p><strong>Why it&#8217;s valuable</strong>: Usage-based billing is a moat. Companies will pay $200&#8211;$1K/month to avoid building rate limiting, analytics, and billing integration themselves.</p><p><strong>Why it&#8217;s boring</strong>: It&#8217;s pure infrastructure. No UI. No virality. Just middleware that works.</p><div><hr></div><h2>3. White-label Audit Log Service</h2><p><strong>What it solves</strong>: Enterprise customers demand audit logs showing who accessed what and when. Most startups hard-code these into their app, making them slow and hard to query.</p><p><strong>Who pays</strong>: Any B2B SaaS selling to enterprise customers (they require audit logs in contracts).</p><p><strong>Why it&#8217;s valuable</strong>: Audit logs are table stakes for enterprise deals. A tamper-proof, searchable, exportable log service saves months of dev time and satisfies security reviews.</p><p><strong>Why it&#8217;s boring</strong>: It&#8217;s literally just a log. But enterprises pay $500+/month for logs that meet their compliance requirements.</p><div><hr></div><h2>4. Scheduled Screenshot and PDF Archiving Service</h2><p><strong>What it solves</strong>: Legal, finance, and compliance teams need timestamped snapshots of web pages, invoices, and contracts for records and disputes.</p><p><strong>Who pays</strong>: Law firms, insurance companies, financial institutions, e-commerce platforms.</p><p><strong>Why it&#8217;s valuable</strong>: Manual archiving is error-prone. Automated, legally defensible snapshots with metadata prevent fraud claims and regulatory penalties.</p><p><strong>Why it&#8217;s boring</strong>: You&#8217;re taking screenshots on a schedule. But law firms pay $1K+/month for tools that create admissible evidence.</p><div><hr></div><h2>5. Dependency Update and Security Patch Automation</h2><p><strong>What it solves</strong>: Keeping dependencies updated is tedious. Security patches require manual testing. Most teams ignore updates until a CVE becomes a crisis.</p><p><strong>Who pays</strong>: Development teams, CTOs, security-conscious startups.</p><p><strong>Why it&#8217;s valuable</strong>: A service that monitors dependencies, auto-generates PRs with tested patches, and flags breaking changes saves hours weekly and prevents breaches.</p><p><strong>Why it&#8217;s boring</strong>: Dependency management is maintenance work. But companies pay $300&#8211;$1K/month to avoid being hacked.</p><div><hr></div><h2>6. Database Backup and Point-in-Time Recovery Service</h2><p><strong>What it solves</strong>: Database backups fail silently. Most teams don&#8217;t test restores until disaster strikes. A service that backs up, verifies, and provides instant rollback prevents catastrophic data loss.</p><p><strong>Who pays</strong>: Startups, agencies, any company running production databases.</p><p><strong>Why it&#8217;s valuable</strong>: One corrupted database can destroy a business. Reliable, tested backups with one-click restore are worth $200&#8211;$1K/month.</p><p><strong>Why it&#8217;s boring</strong>: Backups are invisible until they&#8217;re not. But everyone needs them, and few test them properly.</p><div><hr></div><h2>7. Contract and Invoice Data Extraction API</h2><p><strong>What it solves</strong>: Accounting and legal teams manually extract data from PDFs and scanned contracts. OCR tools exist but require custom integration and cleanup.</p><p><strong>Who pays</strong>: Accounting firms, legal departments, procurement teams, invoicing platforms.</p><p><strong>Why it&#8217;s valuable</strong>: A reliable API that extracts line items, dates, totals, and terms from invoices and contracts saves hours per document. Bill per document processed.</p><p><strong>Why it&#8217;s boring</strong>: Data extraction is grunt work. But finance teams pay $0.10&#8211;$1 per document to avoid manual entry.</p><div><hr></div><h2>8. Internal Tool for Managing Rotating API Keys and Secrets</h2><p><strong>What it solves</strong>: Teams hardcode API keys, share them via Slack, and forget to rotate them. A central system for storing, rotating, and auditing secrets prevents breaches.</p><p><strong>Who pays</strong>: Engineering teams, CTOs, DevOps managers.</p><p><strong>Why it&#8217;s valuable</strong>: A leaked key can cost millions. Centralized secret management with automatic rotation and audit logs is mandatory for security-conscious companies.</p><p><strong>Why it&#8217;s boring</strong>: It&#8217;s secret management. But a single breach makes a $500/month tool look like a bargain.</p><div><hr></div><h2>9. Automated Data Pipeline Health Monitoring</h2><p><strong>What it solves</strong>: Data pipelines break silently. Teams discover ETL failures days later when reports are wrong or executives ask questions.</p><p><strong>Who pays</strong>: Data teams, analytics managers, BI departments.</p><p><strong>Why it&#8217;s valuable</strong>: A service that monitors pipelines, detects anomalies (missing data, schema changes, late runs), and alerts before stakeholders notice is worth $500&#8211;$2K/month.</p><p><strong>Why it&#8217;s boring</strong>: Monitoring isn&#8217;t sexy. But broken dashboards cost trust and time.</p><div><hr></div><h2>10. Multi-Region Uptime and Performance Monitoring with SLA Verification</h2><p><strong>What it solves</strong>: Generic uptime monitors ping from one location. Enterprises need proof their app works globally and meets contractual SLAs.</p><p><strong>Who pays</strong>: SaaS companies with enterprise SLAs, global platforms, anyone with uptime guarantees in contracts.</p><p><strong>Why it&#8217;s valuable</strong>: Failing SLAs triggers refunds and contract penalties. A service that monitors from multiple regions, logs performance, and generates SLA reports is insurance.</p><p><strong>Why it&#8217;s boring</strong>: It&#8217;s just pinging endpoints. But proving 99.9% uptime to auditors is worth $300&#8211;$1K/month.</p><div><hr></div><h2>The Real Takeaway</h2><p>You don&#8217;t need a breakthrough idea. You need to solve a problem someone is already paying to solve poorly.</p><p>Stop chasing applause. Start chasing dollars.</p><p>The developers who make real money aren&#8217;t the ones building the next viral app. They&#8217;re the ones who realized that boring, reliable, enterprise-grade systems are how software actually creates value.</p><p>Choose projects based on leverage, not popularity. Build things companies can&#8217;t afford to ignore. Make yourself unfirable by understanding what businesses actually pay for.</p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[GITHUB CHEATCODE]]></title><description><![CDATA[Why Every Developer Should Master Git and Version Control]]></description><link>https://shreyaspatro.substack.com/p/github-cheatcode</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/github-cheatcode</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Tue, 13 Jan 2026 13:49:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Everything You Need to Learn in Git: A Complete Roadmap</h1><p>Mastering Git is a journey from basic commands to sophisticated workflows. Here&#8217;s a comprehensive breakdown of what you need to learn, organized from foundational concepts to advanced techniques.</p><h2>Foundation: Core Concepts</h2><p>Before touching commands, understand these fundamental ideas that make Git work.</p><p><strong>What Version Control Actually Is</strong> You need to grasp why version control exists and what problems it solves. Understand the difference between centralized systems like SVN and distributed systems like Git. Know why distributed version control revolutionized software development.</p><p><strong>How Git Thinks About Data</strong> Git doesn&#8217;t store file differences&#8212;it stores snapshots. Each commit is a complete snapshot of your project at that moment. Understanding this mental model makes everything else click into place.</p><p><strong>The Three States</strong> Files in Git exist in three states: modified, staged, and committed. Learn what each state means and how files move between them. This concept underpins every Git operation you&#8217;ll perform.</p><p><strong>The Working Directory, Staging Area, and Repository</strong> Understand these three areas where your project lives. The working directory is where you edit files. The staging area is where you prepare commits. The repository is where Git stores your project&#8217;s history.</p><h2>Level 1: Basic Operations</h2><p>These are the commands you&#8217;ll use daily, the minimum viable skillset for productive work.</p><p><strong>Initializing and Cloning</strong> Learn to create new repositories with <code>git init</code> and clone existing ones with <code>git clone</code>. Understand what happens when you initialize a repository and what you&#8217;re actually downloading when you clone.</p><p><strong>Checking Status</strong> Master <code>git status</code> to see what&#8217;s changed, what&#8217;s staged, and what Git is tracking. This command is your constant companion for understanding your repository&#8217;s current state.</p><p><strong>Adding and Committing</strong> Learn <code>git add</code> to stage changes and <code>git commit</code> to save snapshots. Understand the difference between <code>git add .</code> and <code>git add -A</code>. Learn to write meaningful commit messages that explain why changes were made, not just what changed.</p><p><strong>Viewing History</strong> Use <code>git log</code> to see your commit history. Learn variations like <code>git log --oneline</code>, <code>git log --graph</code>, and <code>git log --all --decorate</code> to visualize your project&#8217;s evolution.</p><p><strong>Seeing Changes</strong> Master <code>git diff</code> to see what changed. Learn <code>git diff</code> for unstaged changes, <code>git diff --staged</code> for staged changes, and <code>git diff commit1 commit2</code> to compare commits.</p><h2>Level 2: Branching and Merging</h2><p>Branching is where Git&#8217;s power truly emerges. This is essential for any collaborative work.</p><p><strong>Understanding Branches</strong> Learn what branches actually are&#8212;they&#8217;re just pointers to commits. Understand that creating branches is cheap and fast in Git, unlike other version control systems.</p><p><strong>Creating and Switching Branches</strong> Use <code>git branch</code> to create branches and <code>git checkout</code> or <code>git switch</code> to move between them. Learn <code>git checkout -b</code> to create and switch in one command.</p><p><strong>Merging Branches</strong> Master <code>git merge</code> to combine branches. Understand fast-forward merges versus three-way merges. Know when each happens and what they mean for your history.</p><p><strong>Handling Merge Conflicts</strong> Learn to recognize, understand, and resolve merge conflicts. Know how to read conflict markers, choose which changes to keep, and complete the merge process.</p><p><strong>Deleting Branches</strong> Use <code>git branch -d</code> to delete merged branches and <code>git branch -D</code> to force-delete unmerged branches. Understand when each is appropriate.</p><h2>Level 3: Remote Repositories</h2><p>Working with others requires understanding remote repositories and synchronization.</p><p><strong>Understanding Remotes</strong> Learn what remote repositories are and why they matter. Understand that <code>origin</code> is just a conventional name for your primary remote, not something magical.</p><p><strong>Adding Remotes</strong> Use <code>git remote add</code> to connect to remote repositories. Learn <code>git remote -v</code> to see your configured remotes.</p><p><strong>Pushing Changes</strong> Master <code>git push</code> to upload your commits. Understand <code>git push origin branch-name</code> and learn about tracking branches with <code>git push -u</code>.</p><p><strong>Pulling Changes</strong> Learn <code>git pull</code> to download and integrate remote changes. Understand that pull is actually fetch plus merge.</p><p><strong>Fetching Without Merging</strong> Use <code>git fetch</code> to download remote changes without merging them. Learn when fetching without merging is preferable to pulling.</p><p><strong>Tracking Branches</strong> Understand remote-tracking branches and how they differ from local branches. Learn about <code>origin/main</code> versus <code>main</code>.</p><h2>Level 4: Undoing and Correcting</h2><p>Mistakes happen. Learn how to fix them without panic.</p><p><strong>Unstaging Files</strong> Use <code>git reset HEAD file</code> or <code>git restore --staged file</code> to unstage changes while keeping your modifications.</p><p><strong>Discarding Changes</strong> Learn <code>git checkout -- file</code> or <code>git restore file</code> to discard modifications in your working directory. Understand that this is destructive&#8212;changes are lost.</p><p><strong>Amending Commits</strong> Use <code>git commit --amend</code> to modify your most recent commit. Learn when this is safe and when it&#8217;s dangerous.</p><p><strong>Reverting Commits</strong> Master <code>git revert</code> to undo commits by creating new commits that reverse changes. This is the safe way to undo public history.</p><p><strong>Resetting Commits</strong> Understand <code>git reset</code> with its three modes: <code>--soft</code>, <code>--mixed</code>, and <code>--hard</code>. Know when to use each and why hard reset is dangerous.</p><p><strong>Finding Lost Commits</strong> Learn <code>git reflog</code> to see a history of where HEAD has been. This is your safety net for recovering &#8220;lost&#8221; commits.</p><h2>Level 5: Intermediate Workflows</h2><p>These skills make you a more efficient and sophisticated Git user.</p><p><strong>Stashing Changes</strong> Use <code>git stash</code> to temporarily save uncommitted changes. Learn <code>git stash pop</code>, <code>git stash apply</code>, and <code>git stash list</code> to manage your stashes.</p><p><strong>Tagging</strong> Create tags with <code>git tag</code> to mark important points in history like releases. Understand lightweight versus annotated tags.</p><p><strong>Cherry-Picking</strong> Use <code>git cherry-pick</code> to apply specific commits from one branch to another. Know when this is useful and when it creates problems.</p><p><strong>Viewing File History</strong> Master <code>git log -- filename</code> to see a file&#8217;s history. Use <code>git blame</code> to see who last modified each line and why.</p><p><strong>Interactive Staging</strong> Learn <code>git add -p</code> to stage parts of files rather than entire files. This enables cleaner, more focused commits.</p><h2>Level 6: Advanced Techniques</h2><p>These skills separate good Git users from great ones.</p><p><strong>Rebasing</strong> Understand <code>git rebase</code> and how it differs from merging. Learn when to rebase, when to merge, and why you should never rebase public history.</p><p><strong>Interactive Rebasing</strong> Master <code>git rebase -i</code> to rewrite history. Learn to reorder commits, combine commits with squash, edit commit messages, and split commits.</p><p><strong>Bisecting</strong> Use <code>git bisect</code> to binary search through history to find which commit introduced a bug. Understand how to automate this with scripts.</p><p><strong>Submodules</strong> Learn <code>git submodule</code> to include other repositories within your repository. Understand when submodules are appropriate and their limitations.</p><p><strong>Worktrees</strong> Use <code>git worktree</code> to check out multiple branches simultaneously in different directories. This is powerful for comparing branches or working on multiple features.</p><p><strong>Hooks</strong> Understand Git hooks to automate tasks at various points in the Git workflow. Learn client-side hooks like pre-commit and server-side hooks like pre-receive.</p><h2>Level 7: Collaboration Patterns</h2><p>Understanding team workflows is crucial for professional development.</p><p><strong>Branching Strategies</strong> Learn common branching models like Git Flow, GitHub Flow, and trunk-based development. Understand when each is appropriate.</p><p><strong>Pull Requests and Code Review</strong> Master the pull request workflow on platforms like GitHub or GitLab. Learn to create descriptive PRs, respond to feedback, and review others&#8217; code.</p><p><strong>Forking Workflow</strong> Understand the fork and pull request model used in open source. Learn how to keep your fork synchronized with the upstream repository.</p><p><strong>Conflict Resolution Strategies</strong> Develop skills for preventing and resolving conflicts. Learn communication patterns that reduce conflict frequency.</p><h2>Level 8: Configuration and Optimization</h2><p>Customize Git to work the way you want.</p><p><strong>Global Configuration</strong> Learn to configure your name, email, and preferred editor with <code>git config --global</code>. Understand the difference between global, local, and system configuration.</p><p><strong>Aliases</strong> Create shortcuts for common commands with Git aliases. Turn <code>git status</code> into <code>git st</code> and customize complex commands into simple shortcuts.</p><p><strong>Ignore Files</strong> Master <code>.gitignore</code> to exclude files from version control. Understand pattern matching and when to use global versus local ignore files.</p><p><strong>Attributes</strong> Learn <code>.gitattributes</code> to configure how Git handles specific files. This is crucial for line ending consistency and merge strategies for specific file types.</p><h2>Level 9: Understanding the Internals</h2><p>These concepts aren&#8217;t necessary for daily work but provide deep understanding.</p><p><strong>The Object Model</strong> Understand Git&#8217;s four object types: blobs, trees, commits, and tags. Learn how they reference each other to form your repository&#8217;s history.</p><p><strong>SHA-1 Hashes</strong> Learn how Git uses cryptographic hashing to identify objects. Understand what a commit hash actually represents.</p><p><strong>References</strong> Understand how branches, tags, and HEAD are just references to commits. Learn about symbolic references and detached HEAD state.</p><p><strong>The Git Directory Structure</strong> Explore the <code>.git</code> directory to see how Git stores information. Understand the objects directory, refs directory, and HEAD file.</p><h2>Level 10: Troubleshooting and Recovery</h2><p>When things go wrong, these skills save the day.</p><p><strong>Reading Error Messages</strong> Learn to actually read Git&#8217;s error messages&#8212;they&#8217;re usually helpful. Understand common errors and what they mean.</p><p><strong>Recovering Deleted Branches</strong> Use reflog to find and recover deleted branches. Understand that commits aren&#8217;t truly deleted until garbage collection runs.</p><p><strong>Fixing Detached HEAD</strong> Learn what detached HEAD state is, how to get into it, and how to recover from it without losing work.</p><p><strong>Cleaning Up</strong> Use <code>git clean</code> to remove untracked files and <code>git gc</code> to optimize repository size. Understand when these operations are safe.</p><h2>Essential Tools and Platforms</h2><p>Beyond Git itself, learn the ecosystem.</p><p><strong>GitHub/GitLab/Bitbucket</strong> Understand at least one major Git hosting platform. Learn their unique features like GitHub Actions, GitLab CI/CD, or Bitbucket Pipelines.</p><p><strong>GUI Clients</strong> Explore visual Git clients like GitKraken, Sourcetree, or GitHub Desktop. These can help visualize complex histories.</p><p><strong>IDE Integration</strong> Learn how your preferred IDE integrates with Git. Most modern editors have excellent Git support built in.</p><h2>The Learning Path</h2><p>Start with levels 1-3. These fundamentals will make you immediately productive. Practice them daily until they&#8217;re second nature.</p><p>Move to levels 4-6 as situations demand. You&#8217;ll naturally encounter scenarios that require these skills.</p><p>Explore levels 7-10 as you grow professionally. These skills emerge through experience and curiosity.</p><p>The key is consistent practice. Use Git for every project, even personal ones. Make mistakes in safe environments. Read other developers&#8217; commit histories. Ask questions. The more you use Git, the more intuitive it becomes.</p><p>Git mastery isn&#8217;t about memorizing commands&#8212;it&#8217;s about understanding the underlying model so well that you know which tool to reach for in any situation. Focus on concepts first, commands second, and you&#8217;ll develop true proficiency.</p>]]></content:encoded></item><item><title><![CDATA[How Do Netflix Recommendations Work?]]></title><description><![CDATA[The Machine Learning concepts behind It.]]></description><link>https://shreyaspatro.substack.com/p/how-do-netflix-recommendations-work</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/how-do-netflix-recommendations-work</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Wed, 07 Jan 2026 12:48:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You&#8217;ve probably experienced it: you finish a show, and Netflix immediately suggests three more you actually want to watch. It feels like magic, but it&#8217;s not. It&#8217;s a deliberate engineering solution to a genuinely hard problem.</p><h2>Why This Problem Is Hard</h2><p>Netflix has millions of users and tens of thousands of titles. Most users have seen only a tiny fraction of what&#8217;s available. If you ask people what they want to watch, they&#8217;ll give unreliable answers , ratings and reviews don&#8217;t predict behavior well. The real challenge is working with sparse, noisy data: incomplete watch histories, abandoned episodes, background noise.</p><p>The key insight: recommendations must be inferred from what people do, not what they say they want.</p><h2>The Core Intuition</h2><p>Here&#8217;s the foundation everything else builds on: people with similar watching behavior tend to like similar things.</p><p>If you and I both watched <em>Breaking Bad</em>, <em>Ozark</em>, and <em>Better Call Saul</em>, there&#8217;s a pattern there. If I then watched <em>Narcos</em> and loved it, there&#8217;s a decent chance you will too even if Netflix has no idea what any of these shows are &#8220;about.&#8221;</p><p>Recommendations work by comparing behavior, not content. The system never needs to understand a movie. It just needs to find patterns in what people watch.</p><h2>What &#8220;Collaborative Filtering&#8221; Actually Means</h2><p>You&#8217;ll hear this term everywhere in recommendation systems. It&#8217;s simpler than it sounds.</p><ul><li><p><strong>Collaborative</strong> = learning from groups of users</p></li><li><p><strong>Filtering</strong> = predicting what you haven&#8217;t seen yet</p></li></ul><p>The system answers one question: <em>given what similar users did, what are you likely to watch next?</em></p><p>That&#8217;s it. No complex diagrams needed.</p><h2>How the Model Learns Your Preferences (Without Labels)</h2><p>Netflix doesn&#8217;t ask you to fill out a survey about your taste. It watches what you do:</p><ul><li><p>What you start</p></li><li><p>What you stop after 5 minutes</p></li><li><p>What you binge in one sitting</p></li><li><p>What you rewatch</p></li></ul><p>From this stream of behavior, the system learns hidden patterns &#8212; often called <em>latent preferences</em>. These might include things like:</p><ul><li><p>Fast-paced vs slow-burn storytelling</p></li><li><p>Light tone vs dark themes</p></li><li><p>Episodic structure vs serialized arcs</p></li><li><p>Visual style preferences</p></li></ul><p>None of these are tagged manually. The model discovers them by finding what separates users who watch one set of shows from users who watch another.</p><h2>Why This Works Without Understanding Content</h2><p>This is the counterintuitive part: Netflix&#8217;s recommendation engine doesn&#8217;t need to know what <em>Stranger Things</em> is about. It doesn&#8217;t parse genres, analyze plot summaries, or label content at scale.</p><p>It works because:</p><ul><li><p>Behavior is more consistent than language</p></li><li><p>Users reveal preferences unconsciously through their actions</p></li><li><p>Patterns in what people watch are stronger signals than how they describe what they want</p></li></ul><p>A recommendation system that analyzed plot keywords would struggle to connect <em>The Queen&#8217;s Gambit</em> and <em>The Social Network</em>. But users who watched one often watched the other, and the system picked up on that.</p><h2>Where This Approach Breaks Down</h2><p>No system is perfect. Collaborative filtering has known failure modes:</p><p><strong>Cold start problem</strong>: New users with no watch history get generic recommendations. New shows with no viewer data are hard to surface.</p><p><strong>Popularity bias</strong>: The system gravitates toward what&#8217;s already popular, making it harder for niche content to break through.</p><p><strong>Feedback loops</strong>: If the system only recommends what you&#8217;ve watched before, you get stuck in a filter bubble.</p><p>This is why Netflix doesn&#8217;t rely on collaborative filtering alone, it blends it with content-based signals, explicit user inputs, and diversity mechanisms.</p><h2>How Engineers Think About This System</h2><p>From a systems perspective, here&#8217;s the architecture:</p><p><strong>Input</strong>: Streams of user behavior (clicks, watches, skips, completion rates)<br><strong>Learning</strong>: Finding similarity between users and predicting preferences<br><strong>Output</strong>: Ranked list of recommendations, personalized per user</p><p>The engineering challenges are less about the algorithm and more about:</p><ul><li><p><strong>Scalability</strong>: Processing billions of interactions in real time</p></li><li><p><strong>Continual learning</strong>: Updating models as new data arrives</p></li><li><p><strong>Evaluation</strong>: A/B testing to measure what actually improves engagement</p></li></ul><p>Recommendation systems are production ML systems first, research projects second.</p><h2>Where You&#8217;ll See This Pattern Again</h2><p>The same core idea, learn from user behavior, predict from similarity &#8212; powers recommendations across the internet:</p><ul><li><p>Spotify&#8217;s Discover Weekly playlists</p></li><li><p>Amazon&#8217;s &#8220;customers who bought this also bought&#8221;</p></li><li><p>YouTube&#8217;s homepage feed</p></li><li><p>Social media &#8220;for you&#8221; pages</p></li></ul><p>Once you understand the intuition, you start seeing it everywhere.</p><h2>If You Want to Go Deeper</h2><p>You don&#8217;t need to implement these techniques to understand how they work, but here&#8217;s where the rabbit hole goes:</p><ul><li><p><strong>Collaborative filtering variants</strong>: User-based vs item-based approaches</p></li><li><p><strong>Matrix factorization</strong>: Decomposing the user-item interaction matrix to find latent factors</p></li><li><p><strong>Embeddings</strong>: Representing users and items in the same vector space to compute similarity</p></li></ul><p>Knowing the intuition matters more than the math. But if you&#8217;re building this stuff, the math eventually matters too.</p><h2>Closing Note</h2><p>Recommendation systems don&#8217;t understand products. They understand people, through patterns.</p><p>That&#8217;s the shift. Netflix doesn&#8217;t need to know what makes a good thriller. It just needs to know that people who watched A, B, and C also watched D. The intelligence isn&#8217;t in analyzing content. It&#8217;s in analyzing us.</p><ol><li><p></p></li></ol>]]></content:encoded></item><item><title><![CDATA[Two Skills That Make You Irreplaceable in the AI Era]]></title><description><![CDATA[An engineer's perspective on staying relevant when AI writes most of the code]]></description><link>https://shreyaspatro.substack.com/p/two-skills-that-make-you-irreplaceable</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/two-skills-that-make-you-irreplaceable</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Mon, 05 Jan 2026 13:23:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!i__X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;m not going to sugarcoat this: AI is getting scary good at writing code.</p><p><strong>The engineers getting replaced aren&#8217;t the ones who code slowly. They&#8217;re the ones who don&#8217;t know how to direct intelligence at scale.</strong></p><p>Let me show you exactly what that means.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i__X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i__X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png 424w, https://substackcdn.com/image/fetch/$s_!i__X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png 848w, https://substackcdn.com/image/fetch/$s_!i__X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png 1272w, https://substackcdn.com/image/fetch/$s_!i__X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i__X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png" width="711" height="934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:934,&quot;width&quot;:711,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1250554,&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://shreyaspatro.substack.com/i/183545598?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.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_!i__X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png 424w, https://substackcdn.com/image/fetch/$s_!i__X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png 848w, https://substackcdn.com/image/fetch/$s_!i__X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.png 1272w, https://substackcdn.com/image/fetch/$s_!i__X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c838da-b0f5-443c-b08b-5f81edce0de3_711x934.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><h2>The Shift Nobody&#8217;s Talking About</h2><p>Your job isn&#8217;t to write code anymore. Your job is to <strong>architect how AI writes code</strong>.</p><p>Two skills separate engineers who thrive from engineers who struggle:</p><ol><li><p><strong>Context Engineering</strong> &#8211; Designing what information AI sees</p></li><li><p><strong>Agentic Workflows</strong> &#8211; Orchestrating multiple AI agents like a distributed system</p></li></ol><p>Master these, and you&#8217;re not competing with AI. You&#8217;re multiplying yourself by 10x.</p><p>Let me break down each one.</p><div><hr></div><h2>Skill #1: Context Engineering (The New Core Competency)</h2><h3>What It Actually Is</h3><p>Context engineering is deciding: <em>What should the AI know to make the right decision?</em></p><p>Not &#8220;what&#8217;s the right prompt.&#8221; That&#8217;s amateur hour.</p><p><strong>Bad engineer:</strong></p><pre><code><code>"Hey AI, fix this bug" 
*dumps 50,000 lines of code*</code></code></pre><p><strong>Good engineer:</strong></p><pre><code><code>Here's what you need to know:
- The specific module with the bug (300 lines)
- What it's supposed to do (from our tests)
- What changed recently (last 3 commits)
- Similar bugs we fixed before
- Our definition of "fixed" (these tests must pass)</code></code></pre><p>The difference? The AI went from guessing to executing with precision.</p><h3>Why You Already Have This Skill (You Just Don&#8217;t Know It)</h3><p>You&#8217;re a CS engineer. You already think in:</p><ul><li><p><strong>Abstractions</strong> (what to hide vs. expose)</p></li><li><p><strong>Interfaces</strong> (contracts between components)</p></li><li><p><strong>State</strong> (what&#8217;s valid at this moment)</p></li></ul><p>Context engineering is the exact same skill, applied to intelligence instead of functions.</p><p>When you design an API, you ask: <em>&#8220;What&#8217;s the minimum this function needs to work correctly?&#8221;</em></p><p>When you engineer context, you ask: <em>&#8220;What&#8217;s the minimum this AI needs to decide correctly?&#8221;</em></p><p>Same brain. Different substrate.</p><h3>Real Example That&#8217;ll Make It Click</h3><p>I built a code review agent. First version was useless:</p><pre><code><code>"Review this code: [dump entire PR]"</code></code></pre><p>It gave me generic garbage: <em>&#8220;Consider adding error handling.&#8221;</em> Thanks, bot.</p><p>Then I engineered the context:</p><pre><code><code>You're a senior backend engineer focused on security.

Our stack:
- PostgreSQL with row-level security  
- JWT authentication
- All queries MUST use parameterized statements

Your job:
- Find security vulnerabilities
- Suggest specific code fixes
- Flag anything that needs human review

Recent incidents we're paranoid about:
- Last month: SQL injection in search
- Last week: Broken access control in /admin

Now review this PR:
[minimal diff + 20 lines of surrounding context]</code></code></pre><p><strong>Result:</strong> It caught a real SQL injection vulnerability. Because it knew <em>what to look for</em> and <em>why it mattered</em>.</p><p>That&#8217;s context engineering.</p><h3>The One Technique That Changed Everything For Me</h3><p><strong>Hierarchical Context Layering</strong></p><p>Structure your context like memory in an OS:</p><pre><code><code>Layer 1 (Global): "You're a senior SRE"
Layer 2 (Project): "This is a microservices system built on K8s"  
Layer 3 (Task): "We're debugging a latency spike in the auth service"
Layer 4 (Immediate): "Here are the last 50 error logs"</code></code></pre><p>Why this works: The AI reasons <em>from general principles down to specifics</em>, just like you do.</p><h3>How to Practice This Today</h3><p><strong>Build a &#8220;Bug Triage Bot&#8221;</strong></p><p>Challenge: Given a bug report, route it to the right team (backend, frontend, DevOps, etc.)</p><p>Forces you to:</p><ul><li><p>Build a &#8220;context profile&#8221; for each team (what they own, keywords, past bugs)</p></li><li><p>Dynamically select relevant info from the bug report</p></li><li><p>Decide what&#8217;s signal vs. noise</p></li></ul><p><strong>Success metric:</strong> 80%+ accuracy routing bugs correctly.</p><p>Start simple. Hardcode context. Measure accuracy. Iterate.</p><p>That&#8217;s the practice loop for context engineering.</p><div><hr></div><h2>Skill #2: Agentic Workflows (How Work Actually Happens Now)</h2><h3>The Core Insight</h3><p>Single prompts don&#8217;t scale. <strong>Workflows scale.</strong></p><p>Asking AI to &#8220;build a feature&#8221; in one shot is like asking one person to design, code, test, and deploy alone.</p><p>Works for toy problems. Falls apart for real engineering.</p><p>The future is <strong>multiple specialized AI agents collaborating like a team</strong>.</p><h3>Mental Model Shift</h3><p><strong>Old world:</strong></p><pre><code><code>You &#8594; Write Code &#8594; Ship Feature</code></code></pre><p><strong>New world:</strong></p><pre><code><code>You &#8594; Design Workflow &#8594; Agents Execute &#8594; You Validate</code></code></pre><p>You&#8217;re not coding. You&#8217;re <strong>architecting cognition</strong>.</p><h3>What This Looks Like in Practice</h3><p>Here&#8217;s a workflow I built for automated bug fixes:</p><pre><code><code>1. Investigator Agent
   - Reads bug report + error logs
   - Identifies affected code
   - Finds recent changes

2. Root Cause Agent  
   - Analyzes the investigation
   - Looks at similar past bugs
   - Proposes hypothesis

3. Fixer Agent
   - Writes a proposed fix
   - Follows our code standards
   - No breaking changes allowed

4. Tester Agent
   - Runs existing tests
   - Generates new test cases
   - Validates the fix works

5. Human Engineer (You)
   - Reviews the fix
   - Approves or rejects
   - Ships if confident</code></code></pre><p><strong>Key insight:</strong> Each agent has a specialized role. Each has limited, focused context. Each has a clear interface with the next agent.</p><p>Sound familiar? <strong>It&#8217;s microservices, but for intelligence.</strong></p><h3>Real Numbers</h3><p>This workflow automatically fixes ~40% of bugs with zero human intervention.</p><p>The other 60% still need me. But I&#8217;m reviewing, not grinding.</p><p>I went from fixing 3-5 bugs per day to <em>validating</em> 15-20 fixes per day.</p><p>That&#8217;s the leverage.</p><h3>The Pattern That Unlocks Everything</h3><p><strong>Debate / Critique Workflow:</strong></p><pre><code><code>Builder Agent: "Here's my solution"
Critic Agent: "Here are 3 problems with it"  
Builder Agent: "Here's my revised solution"
Critic Agent: "Looks good now"</code></code></pre><p>This is how I get production-quality code from AI:</p><p>python</p><pre><code><code>for round in range(3):
    code = builder_agent.write(task)
    
    critique = critic_agent.review(
        code=code,
        focus=["security", "performance", "maintainability"]
    )
    
    if critique.severity == "low":
        break
    
    # Builder revises based on critique
    code = builder_agent.revise(code, critique)</code></code></pre><p>Two agents. Three rounds. Output quality jumped 10x.</p><p>Why? <strong>AI catching AI&#8217;s mistakes is more reliable than AI getting it right first try.</strong></p><h3>How to Build Your First Workflow Today</h3><p><strong>Start stupid simple: &#8220;Two-Agent Code Reviewer&#8221;</strong></p><p>Agent 1: Finds issues in code<br>Agent 2: Suggests specific fixes</p><p>That&#8217;s it. Two sequential calls to Claude.</p><p>python</p><pre><code><code># Agent 1
issues = claude.find_issues(code)

# Agent 2  
fixes = claude.suggest_fixes(code, issues)</code></code></pre><p><strong>Practice loop:</strong></p><ol><li><p>Run it on 10 buggy code samples</p></li><li><p>Measure: Did it find the bugs? Are fixes correct?</p></li><li><p>Tweak the context each agent sees</p></li><li><p>Repeat</p></li></ol><p>Once that works, add Agent 3 (tester). Then Agent 4 (validator).</p><p>You&#8217;re building production skills&#8212;one agent at a time.</p><div><hr></div><h2>The Brutal Truth</h2><p><strong>Code is becoming a commodity. Judgment is becoming scarce.</strong></p><p>The engineers who survive aren&#8217;t the ones who code faster.</p><p>They&#8217;re the ones who:</p><ul><li><p>Know what context an AI needs to be effective</p></li><li><p>Can orchestrate 10 agents to do the work of 10 engineers</p></li><li><p>Can validate quality at 10x speed</p></li><li><p>Can debug workflows when agents make mistakes</p></li></ul><p>This isn&#8217;t &#8220;prompt engineering.&#8221; This is <strong>system design for intelligence</strong>.</p><p>And if you&#8217;re a CS engineer? You already have the foundational skills. You just need to reapply them.</p><div><hr></div><h2>Where to Start Tomorrow</h2><p><strong>Week 1:</strong> Build a simple context-engineered prompt</p><ul><li><p>Take a task you do manually</p></li><li><p>Write detailed context (role, constraints, examples, success criteria)</p></li><li><p>Compare output quality vs. a naive prompt</p></li></ul><p><strong>Week 2:</strong> Build a two-agent workflow</p><ul><li><p>Agent 1: Analyzes something</p></li><li><p>Agent 2: Acts on that analysis</p></li><li><p>Measure accuracy</p></li></ul><p><strong>Week 3:</strong> Add a critique loop</p><ul><li><p>Agent proposes solution</p></li><li><p>Second agent critiques it</p></li><li><p>First agent revises</p></li><li><p>Compare quality vs. single-pass</p></li></ul><p><strong>Week 4:</strong> Build something real for your job</p><ul><li><p>Automated PR summaries</p></li><li><p>Bug triage bot</p></li><li><p>Test case generator</p></li><li><p>Code documentation writer</p></li></ul><div><hr></div><h2>Final Word</h2><p>In the AI era, engineers who learn context engineering and agentic workflows won&#8217;t get replaced by AI.</p><p><strong>They&#8217;ll be the ones deciding how AI works.</strong></p><p>The choice is yours: Learn to direct intelligence at scale, or compete with it at human scale.</p><p>I know which fight I&#8217;d rather be in.</p>]]></content:encoded></item><item><title><![CDATA[The Day WhatsApp, Instagram, and Facebook Went Down — An Engineering Breakdown]]></title><description><![CDATA[How a single internal mistake caused a global outage , and what software engineers should actually learn from it]]></description><link>https://shreyaspatro.substack.com/p/the-day-whatsapp-instagram-and-facebook</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/the-day-whatsapp-instagram-and-facebook</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Fri, 02 Jan 2026 13:11:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In 2021, WhatsApp stopped working. Then Instagram. Then Facebook.</p><p>For six hours, most of the world&#8217;s social media was unreachable &#8212; not because of a hack, not because of an attack, but because of a single internal mistake.</p><p>Billions of users affected. One of the largest outages in internet history. And a masterclass in how distributed systems fail.</p><h2>What Actually Went Down</h2><p>October 4, 2021. WhatsApp, Instagram, and Facebook &#8212; all Meta properties &#8212; vanished from the internet for approximately six hours.</p><p>Let&#8217;s be clear early:</p><ul><li><p>Not a cyberattack</p></li><li><p> Not a DDoS</p></li><li><p> Not a traffic spike</p></li></ul><p>This was an infrastructure failure, and it happened during routine maintenance.</p><h2>The Trigger: A Routine Maintenance Change</h2><p>Engineers were performing routine backbone network maintenance to assess capacity between their data centers. This type of change had been done before. It was standard procedure.</p><p>This wasn&#8217;t reckless engineering. It was normal engineering.</p><p>And that&#8217;s precisely what makes it terrifying.</p><h2>The Real Failure: Backbone Network Disconnection</h2><p>During the maintenance, a command unintentionally removed BGP routes connecting Meta&#8217;s data centers to the rest of the internet. Their backbone network , the core infrastructure connecting all their services  disconnected.</p><p>When the backbone disappeared, everything built on top of it followed. Applications, services, internal tools ,all gone.</p><h2>The Cascade: DNS and BGP Failures</h2><p>Here&#8217;s where systems thinking matters.</p><p>Meta&#8217;s authoritative DNS servers became unreachable. BGP routes were withdrawn. From the internet&#8217;s perspective, Facebook&#8217;s IP addresses simply ceased to exist.</p><p>The internet didn&#8217;t break. Facebook disappeared from it.</p><p>DNS queries for <code>facebook.com</code> failed globally. No routes, no resolution, no access. The entire stack collapsed from the bottom up.</p><h2>The Scariest Part: Engineers Were Locked Out</h2><p>Internal tools relied on the same network infrastructure that just failed. Authentication systems? Unreachable. VPNs? Down. Remote access? Gone.</p><p>Engineers couldn&#8217;t remotely fix the issue because the tools they needed to fix it were part of the outage.</p><p>The resolution required physical access to data centers, on-site badge entry, and manual intervention on hardware that hadn&#8217;t been touched in years.</p><h2>Why This Took So Long to Fix</h2><p>Six hours seems excessive for a configuration rollback. But consider the reality:</p><ul><li><p>No remote access to critical systems</p></li><li><p>Manual coordination across multiple data centers</p></li><li><p>Careful, deliberate restoration to avoid cascading the problem further</p></li><li><p>Physical access requirements and security protocols</p></li></ul><p>Fixing outages is exponentially harder when your observability, deployment, and communication tools are inside the outage perimeter.</p><div><hr></div><h2>Engineering Lessons</h2><h3>1. Control Planes Are More Dangerous Than Applications</h3><p>Application failures are expected and tolerable. Control-plane failures are existential.</p><p>Your deployment system, your network control plane, your DNS infrastructure, these are not &#8220;just&#8221; infrastructure. They&#8217;re the foundation. When they fail, everything fails.</p><p><strong>Protect the systems that manage your systems.</strong></p><h3>2. Internal Tools Are Production Systems</h3><p>Observability tools, auth systems, deployment pipelines, incident response dashboards ,  if engineers can&#8217;t access these during a failure, you don&#8217;t have observability.</p><p>You have optimism.</p><p>Treat internal tooling with the same redundancy, isolation, and failure planning as customer-facing services. Your engineers are users too, and they&#8217;re the ones who&#8217;ll save you when things break.</p><h3>3. Invisible Dependencies Are the Real Risk</h3><p>Shared infrastructure creates hidden coupling. One backbone network. One authentication service. One DNS resolver. These become single points of failure that span your entire system.</p><p>At scale, the most dangerous dependencies aren&#8217;t the ones in your dependency graph  they&#8217;re the ones that aren&#8217;t.</p><p><strong>Scale doesn&#8217;t kill systems. Hidden dependencies do.</strong></p><h3>4. Failure Reports Are Better Than Success Stories</h3><p>Senior engineers read postmortems obsessively. Not because they enjoy failure, but because failure exposes system design in ways success never will.</p><p>&#8220;How we scaled to 1M users&#8221; blogs are marketing. Incident reports are education.</p><p>Success hides complexity. Failure exposes it.</p><h2>What Meta Changed After the Outage</h2><p>Meta published a detailed postmortem and implemented changes:</p><ul><li><p>Enhanced safety checks and validation before executing network changes</p></li><li><p>Improved isolation between control-plane systems and production infrastructure</p></li><li><p>Out-of-band access mechanisms that don&#8217;t rely on the primary network</p></li></ul><p>The response was measured, transparent, and technically sound. This is how mature engineering organizations handle failure.</p><h2>Final Takeaway</h2><p>This outage wasn&#8217;t about one bad command. It was about systems that were too tightly coupled to fail safely.</p><p>Facebook&#8217;s infrastructure is among the most sophisticated on the planet, built by world-class engineers. And it still went down for six hours because a routine change had blast radius that exceeded anyone&#8217;s mental model.</p><p>Great engineers don&#8217;t just build features, they study how systems break.</p>]]></content:encoded></item><item><title><![CDATA[How Senior Engineers Design Prompts (And Why Model Size Is Secondary)]]></title><description><![CDATA[For engineers building with AI in production, not just prototyping.]]></description><link>https://shreyaspatro.substack.com/p/how-senior-engineers-design-prompts</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/how-senior-engineers-design-prompts</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Thu, 01 Jan 2026 16:15:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Mistake Most Teams Make First</h2><p>When an AI feature breaks in production, the instinct is immediate: &#8220;Let&#8217;s try GPT-4&#8221; or &#8220;Maybe we need the bigger model.&#8221;</p><p>I&#8217;ve watched this happen dozens of times. A more capable model patches over the ambiguity, handles an edge case through sheer reasoning power, compensates for poorly structured inputs. It works. And that occasional success teaches the wrong lesson.</p><p>Most AI failures aren&#8217;t capacity problems. They&#8217;re interface problems.</p><p>Upgrading the model when your prompt is vague is like buying a faster CPU when your algorithm is O(n&#179;). You get a temporary improvement that scales terribly and costs more. I learned this the expensive way, both in compute bills and debugging time at 2am.</p><p>The pattern is predictable. The prototype works beautifully on Claude Opus. You ship to production. Edge cases emerge. The model handles them inconsistently. Someone says &#8220;we need the next model tier.&#8221; But the real issue? The prompt treated the model like a mind reader instead of an API.</p><p><strong>Most AI failures happen before inference.</strong> The model receives unclear instructions, has no constraints on output format, and lacks explicit failure conditions. No amount of parameters fixes bad input design.</p><h2>The Mental Shift: Prompts Are Decision Interfaces</h2><p>Stop thinking of prompts as instructions you give an assistant. Start thinking of them as <strong>interfaces you design for a decision-making system.</strong></p><p>This isn&#8217;t semantic. It changes everything.</p><p>When I say I&#8217;m &#8220;designing&#8221; a prompt, I mean:</p><ul><li><p>Defining the decision space (what exactly is this model choosing between?)</p></li><li><p>Constraining the output (what are the valid responses?)</p></li><li><p>Specifying failure modes (what happens when inputs are malformed?)</p></li></ul><p>This is closer to designing an API endpoint than writing instructions for a person. You wouldn&#8217;t build a REST API that accepts &#8220;do something useful with this data&#8221; and hope for valid JSON back.</p><p><strong>The difference between asking and constraining:</strong></p><p>Asking:</p><pre><code><code>Analyze this customer message and suggest a response.</code></code></pre><p>Constraining:</p><pre><code><code>Classify this customer message into exactly one category:
TECHNICAL_ISSUE, BILLING_QUESTION, FEATURE_REQUEST, or OTHER

Respond only with the category name.</code></code></pre><p>The second prompt is an interface. Defined inputs, defined outputs, zero ambiguity about success.</p><p>If a human could reasonably misunderstand what you want, the model will definitely misunderstand it&#8212;and do so inconsistently across requests.</p><h2>Rule #1: Eliminate Open-Ended Prompts</h2><p>Open-ended prompts create open-ended behavior. In production, variance is your enemy.</p><p>Words like &#8220;explain,&#8221; &#8220;suggest,&#8221; &#8220;analyze,&#8221; and &#8220;describe&#8221; are dangerous without constraints. They invite the model to choose its own scope, format, and level of detail. Sometimes you get three sentences. Sometimes three paragraphs. Sometimes markdown tables.</p><p><strong>Before:</strong></p><pre><code><code>Explain why this transaction was flagged.</code></code></pre><p><strong>After:</strong></p><pre><code><code>State the single rule that caused this transaction to be flagged. 
Use this format: "Flagged due to: [rule name]"
If multiple rules triggered, list only the highest priority rule.</code></code></pre><p><strong>Before:</strong></p><pre><code><code>Suggest improvements for this code.</code></code></pre><p><strong>After:</strong></p><pre><code><code>Identify exactly one improvement from this list that applies:
- Remove unused variables
- Extract duplicate logic into function
- Add error handling
- Improve variable names
- None apply

Respond with: "[Category]: [specific line numbers]"</code></code></pre><p><strong>Three questions I ask before any prompt goes to production:</strong></p><ol><li><p>What is the output type? (String? JSON? One of N choices?)</p></li><li><p>What is the acceptable range? (Length? Format? Valid values?)</p></li><li><p>What is explicitly out of scope? (What should the model NOT do?)</p></li></ol><p>If you can&#8217;t answer these precisely, your prompt will fail. Not immediately, but reliably, under edge cases you didn&#8217;t anticipate.</p><h2>Rule #2: Force Explicit Choices</h2><p>The most reliable prompts in production don&#8217;t generate text. They <strong>classify inputs into predefined buckets.</strong></p><p>This shows up everywhere in my work:</p><ul><li><p>Instead of &#8220;write a response&#8221; &#8594; classify intent, then template the response</p></li><li><p>Instead of &#8220;score this from 1 to 10&#8221; &#8594; choose from LOW, MEDIUM, HIGH</p></li><li><p>Instead of &#8220;summarize the key points&#8221; &#8594; answer yes/no to each of 5 specific questions</p></li></ul><p><strong>Why classification beats generation:</strong></p><p>Models are better at choosing than creating. Fewer valid outputs means less variance. You can programmatically verify the response. When it fails, you know exactly what went wrong.</p><p><strong>Common patterns that work:</strong></p><p>Binary:</p><pre><code><code>Does this message require immediate escalation?
Answer only: YES or NO</code></code></pre><p>Multi-class:</p><pre><code><code>Select the single best category:
A) Bug report
B) Feature request  
C) Question
D) Feedback

Respond with only the letter.</code></code></pre><p>Ranked:</p><pre><code><code>Rank these three options from most to least relevant:
Option A: [description]
Option B: [description]
Option C: [description]

Respond with: "A &gt; B &gt; C" (or other valid orderings)</code></code></pre><p><strong>The universal pattern:</strong></p><pre><code><code>Choose one of the following options. Do not explain. Do not elaborate.
If none apply, respond with: NONE</code></code></pre><p>That last line matters. Always give the model an escape hatch that&#8217;s still structured.</p><h2>Rule #3: Define Failure Before Success</h2><p>This is where I see the biggest gap between junior and senior engineers.</p><p>Before specifying what good output looks like, define what bad output looks like and how the model should handle it.</p><p>Production systems receive malformed inputs constantly. User messages with missing context. Corrupted data. Inputs from deprecated API versions. A model without explicit failure conditions will try to succeed anyway, producing confident-sounding nonsense.</p><p><strong>Without failure conditions:</strong></p><pre><code><code>Extract the customer's account number from this message.</code></code></pre><p>Result: The model finds something that looks like an account number (maybe a phone number, maybe a reference ID) and returns it confidently.</p><p><strong>With failure conditions:</strong></p><pre><code><code>Extract the customer's account number from this message.
An account number is exactly 8 digits starting with 3 or 4.

If no valid account number is found, respond with: ERROR_NO_ACCOUNT_NUMBER
If multiple account numbers are found, respond with: ERROR_MULTIPLE_ACCOUNTS</code></code></pre><p>Now failures are explicit, structured, and loggable. You can monitor error rates, catch upstream issues, and handle edge cases gracefully.</p><p>This improves reliability far more than temperature tuning ever will. You&#8217;re designing the failure modes instead of discovering them in production at 3am.</p><h2>Why Smaller Models Often Win</h2><p>Here&#8217;s what surprised me most: <strong>Tight inputs beat raw capacity.</strong></p><p>I routinely use smaller, faster, cheaper models in production. Not to cut costs, but because well-constrained prompts work better on them.</p><p>A model with 405B parameters and a vague prompt gives you:</p><ul><li><p>High variance in output format</p></li><li><p>Occasional overconfident reasoning</p></li><li><p>Expensive compute per request</p></li><li><p>Slower response times</p></li></ul><p>A model with 7B parameters and a tightly constrained prompt gives you:</p><ul><li><p>Consistent output (fewer valid options)</p></li><li><p>Predictable behavior (bounded decision space)</p></li><li><p>50 to 100x lower cost per request</p></li><li><p>Sub-second latency</p></li></ul><p><strong>The underlying principle:</strong> Bigger models amplify your input quality. If your prompt is vague, a bigger model explores more of the ambiguity space&#8212;sometimes finding clever solutions, often finding creative ways to misunderstand you.</p><p>Smaller models are less forgiving. They reward clarity. When your prompt is tight, a small model often matches or exceeds the reliability of a larger one because there&#8217;s simply less room for interpretation.</p><p><strong>The decision tree I actually use:</strong></p><p>Can this be a classification task? &#8594; Small model<br>Can this be constrained to 3 to 5 valid outputs? &#8594; Small model<br>Do you actually need generation? &#8594; Reconsider the design<br>Still need generation? &#8594; You&#8217;ve earned a large model</p><h2>The Prompt Design Checklist</h2><p>Before any prompt goes to production, I ask four questions:</p><p><strong>1. What decision am I delegating?</strong></p><p>Not &#8220;what do I want the model to do&#8221; but &#8220;what specific decision point am I asking it to resolve?&#8221; Classifying an input? Extracting a field? Choosing between options? Validating data?</p><p>If you can&#8217;t state the decision clearly, the prompt will fail.</p><p><strong>2. What are the valid outputs?</strong></p><p>List them exhaustively. If there are 5 valid responses, list all 5. If it&#8217;s JSON, provide the exact schema. If it&#8217;s a number, specify the range.</p><p>Invalid: &#8220;A helpful response&#8221;<br>Valid: &#8220;One of: APPROVED, REJECTED, NEEDS_REVIEW&#8221;</p><p><strong>3. What does failure look like?</strong></p><p>What happens when required data is missing? Input is malformed? Multiple interpretations are possible? The model lacks information to decide?</p><p>For each failure mode, specify the exact response you want.</p><p><strong>4. What should the model NOT do?</strong></p><p>Explicitly list what&#8217;s out of scope:</p><ul><li><p>Don&#8217;t explain your reasoning</p></li><li><p>Don&#8217;t ask follow-up questions</p></li><li><p>Don&#8217;t make assumptions about missing data</p></li><li><p>Don&#8217;t format as markdown</p></li></ul><p>This seems pedantic. It&#8217;s not. Models are trained to be helpful, which often means adding unrequested context. In production systems, this &#8220;helpfulness&#8221; is variance.</p><p><strong>The one-minute audit:</strong></p><p>Pull up your most critical AI prompt right now. Can you answer all four questions precisely?</p><p>If not, that&#8217;s your highest-leverage improvement. Not the model version. Not the temperature setting. The prompt itself.</p><h2>When to Upgrade the Model (Rare, But Real)</h2><p>Tight prompts on small models solve most production AI problems. But there are legitimate cases where you need more capability.</p><p><strong>The litmus test: Capability gap vs clarity gap</strong></p><p>A clarity gap looks like:</p><ul><li><p>The model sometimes gets it right</p></li><li><p>More examples help</p></li><li><p>Rephrasing changes behavior</p></li><li><p>Temperature tuning affects output</p></li></ul><p>&#8594; Your prompt needs work, not a bigger model.</p><p>A capability gap looks like:</p><ul><li><p>The model consistently fails despite clear instructions</p></li><li><p>The task requires reasoning beyond classification</p></li><li><p>Multiple sequential decisions are required</p></li><li><p>The input format is too complex to preprocess</p></li></ul><p>&#8594; You might actually need more capacity.</p><p><strong>Signs your prompt is already tight:</strong></p><p>&#10003; Output format is defined precisely<br>&#10003; Failure modes are explicit<br>&#10003; The decision space is bounded<br>&#10003; You&#8217;ve tested 20+ edge cases successfully<br>&#10003; The current model fails consistently, not randomly</p><p>If all five are true, you&#8217;ve earned a model upgrade.</p><p><strong>Real examples from my work:</strong></p><p>Needs a better prompt:</p><ul><li><p>&#8220;Sometimes the model returns markdown, sometimes plaintext&#8221;</p></li><li><p>&#8220;It&#8217;s usually right but occasionally hallucinates&#8221;</p></li><li><p>&#8220;Works on test cases but breaks in production&#8221;</p></li></ul><p>Actually needs a bigger model:</p><ul><li><p>&#8220;Need to analyze a 50-page legal contract and extract dependencies&#8221;</p></li><li><p>&#8220;Require multi-step reasoning with state tracking&#8221;</p></li><li><p>&#8220;Input is structured data with complex relationships&#8221;</p></li></ul><p>Before upgrading, I document why the current model fails, show that tightening the prompt didn&#8217;t help, estimate the cost increase, and define success metrics.</p><p>Most teams skip this. They upgrade reactively, then wonder why costs ballooned while reliability stayed mediocre.</p><h2>Final Thought</h2><p>Prompting isn&#8217;t an AI skill. It&#8217;s an engineering skill.</p><p>The best prompt engineers I know come from systems programming, API design, and data pipelines. Not because they understand transformers, but because they understand <strong>interfaces.</strong></p><p>They know that ambiguity scales poorly. Constraints improve reliability. Failure modes must be designed. Variance is the enemy of production systems.</p><p><strong>Good prompts are boring.</strong></p><p>They&#8217;re not clever. They don&#8217;t showcase the model&#8217;s creativity. They&#8217;re explicit, constrained, and predictable.</p><p>They read like API documentation because that&#8217;s what they are.</p><p><strong>A real prompt from production:</strong></p><pre><code><code>Classify this support ticket into exactly one category:
BUG (software not working as documented)
FEATURE (request for new functionality)
QUESTION (how to or clarification)
OTHER (anything else)

Respond with only the category name in UPPERCASE.

If the ticket is empty or less than 10 characters, respond with: INVALID_INPUT
If the ticket contains multiple issues, classify by the primary issue.</code></code></pre><p>No personality. No creativity. No ambiguity.</p><p>Just a clear interface that works the same way every time.</p><p>That&#8217;s the entire philosophy.</p>]]></content:encoded></item><item><title><![CDATA[Agentic AI Safety Checklist]]></title><description><![CDATA[What Engineers Should Think About Before Trusting Autonomy]]></description><link>https://shreyaspatro.substack.com/p/agentic-ai-safety-checklist</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/agentic-ai-safety-checklist</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Tue, 30 Dec 2025 13:27:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sam Altman recently said something that should make every engineer pause: AI agents are becoming a problem.</p><p>Not because they&#8217;re evil. Not because of science fiction scenarios. But because AI systems are starting to behave in ways we didn&#8217;t explicitly plan for.</p><p>When the CEO of OpenAI,the company at the center of the AI boom,talks publicly about preparedness and risk, it&#8217;s not panic. It&#8217;s maturity. And for engineers, it&#8217;s a signal to think more clearly about what we&#8217;re building.</p><h2>This Isn&#8217;t an AI Problem. It&#8217;s an Engineering Problem.</h2><p>An AI agent isn&#8217;t just software that responds to inputs. It&#8217;s software that <strong>acts</strong>.</p><p>You give it a goal. You give it tools. You give it freedom. And then you trust it to behave.</p><p>That&#8217;s where things get interesting and risky.</p><p>Most engineering failures don&#8217;t come from bad code. They come from bad assumptions. AI agents don&#8217;t create new classes of failure. They simply surface old ones faster, at scale, and often silently.</p><p>This checklist exists to help you reason about that, before trust turns into regret.</p><h2>Why &#8220;It Works in Testing&#8221; Is No Longer Enough</h2><p>Traditional software follows deterministic paths. Input A produces output B. You can test every branch. You can predict behavior.</p><p>AI agents operate differently. They interpret goals, choose strategies, and adapt to context. Two identical inputs can produce different actions. Testing shows you what <em>can</em> happen, not what <em>will</em> happen.</p><p>This is a systems problem, not an AI hype piece. The challenge isn&#8217;t whether the model is smart enough&#8212;it&#8217;s whether the system around it is robust enough.</p><h2>What Is an AI Agent, Really?</h2><p>Let&#8217;s be precise about what we&#8217;re discussing.</p><p><strong>A tool</strong> waits for commands and executes them. A calculator. An API endpoint. Predictable.</p><p><strong>A script</strong> follows predetermined logic. If X, then Y. Automated, but fixed.</p><p><strong>An agent</strong> pursues goals autonomously. It decides <em>how</em> to achieve what you&#8217;ve asked for. It chains actions together. It uses tools you&#8217;ve given it access to. It keeps going until it believes the goal is met, or until something stops it.</p><p>Think of it like this: hiring a contractor versus giving someone a company credit card and saying &#8220;handle it.&#8221; The autonomy fundamentally changes the risk profile.</p><h2>The Core Shift Engineers Must Make</h2><p>Building AI agents requires a mental model shift:</p><p><strong>From feature-thinking &#8594; failure-mode thinking</strong></p><p>Stop asking &#8220;Can it do this?&#8221; Start asking &#8220;What happens when it goes wrong?&#8221;</p><p><strong>From capability-testing &#8594; behavior-testing</strong></p><p>Stop measuring what it can accomplish. Start measuring what it won&#8217;t do.</p><p><strong>From optimization &#8594; constraint design</strong></p><p>The question isn&#8217;t how much you can let it do. It&#8217;s how tightly you can bound what it shouldn&#8217;t do.</p><p>This shift matters because agents amplify both your best intentions and your blind spots.</p><h2>The AI Agent Safety Checklist</h2><h3>1. Goal Clarity</h3><p>Ambiguous goals produce unpredictable behavior. Agents optimize for what you say, not what you mean.</p><p><strong>Check:</strong></p><ul><li><p>Can you state the goal in one sentence without qualifiers?</p></li><li><p>Have you defined what &#8220;success&#8221; looks like in measurable terms?</p></li><li><p>What happens if the goal becomes impossible to achieve?</p></li></ul><h3>2. Boundaries &amp; Permissions</h3><p>Agents explore solution spaces. Without boundaries, they&#8217;ll find paths you never imagined,and some you&#8217;d never approve.</p><p><strong>Check:</strong></p><ul><li><p>What resources can this agent access? (APIs, databases, file systems)</p></li><li><p>What actions can it take? (read-only vs. write, internal vs. external)</p></li><li><p>Are there explicit &#8220;never do this&#8221; constraints in place?</p></li></ul><h3>3. Assumptions</h3><p>Every agent operates on assumptions about the world. When those assumptions break, behavior breaks.</p><p><strong>Check:</strong></p><ul><li><p>What does this agent assume about input data? (format, quality, availability)</p></li><li><p>What does it assume about external systems? (uptime, response times, correctness)</p></li><li><p>Have you documented these assumptions for people who&#8217;ll maintain this later?</p></li></ul><h3>4. Tool Access</h3><p>Tools are force multipliers. An agent with email access can notify users. It can also spam thousands of people.</p><p><strong>Check:</strong></p><ul><li><p>Does the agent need this tool to accomplish its goal, or is it &#8220;nice to have&#8221;?</p></li><li><p>What&#8217;s the blast radius if this tool is misused?</p></li><li><p>Can you limit the scope of tool access? (rate limits, sandboxing, scoped credentials)</p></li></ul><h3>5. Human Oversight</h3><p>Not every decision should be autonomous. Some require human judgment.</p><p><strong>Check:</strong></p><ul><li><p>Which decisions require human approval before execution?</p></li><li><p>How does the agent surface its reasoning for review?</p></li><li><p>What&#8217;s the latency tolerance for human-in-the-loop workflows?</p></li></ul><h3>6. Failure Modes</h3><p>Agents don&#8217;t crash gracefully. They often look like they&#8217;re working correctly&#8212;while doing exactly the wrong thing.</p><p><strong>Check:</strong></p><ul><li><p>What does &#8220;stuck&#8221; look like for this agent? (infinite loops, repeated failures)</p></li><li><p>How do you detect when the agent is making progress vs. spinning?</p></li><li><p>What&#8217;s the recovery plan when something goes wrong mid-execution?</p></li></ul><h3>7. Observability</h3><p>You can&#8217;t fix what you can&#8217;t see. Agents that act autonomously need detailed logging.</p><p><strong>Check:</strong></p><ul><li><p>Are you logging every action the agent takes, not just the final result?</p></li><li><p>Can you reconstruct the agent&#8217;s decision-making process from logs?</p></li><li><p>Do you have alerts for unusual patterns? (unexpected tool usage, high error rates)</p></li></ul><h3>8. Incentives</h3><p>Agents optimize for the metrics you give them. Choose metrics poorly, and you get perverse outcomes.</p><p><strong>Check:</strong></p><ul><li><p>Are you measuring what you actually care about, or a proxy?</p></li><li><p>What shortcuts could an agent take to &#8220;win&#8221; without achieving the real goal?</p></li><li><p>Have you tested the agent in adversarial conditions?</p></li></ul><h3>9. Kill Switch</h3><p>Every autonomous system needs an immediate, reliable way to stop.</p><p><strong>Check:</strong></p><ul><li><p>Can you halt the agent instantly without waiting for it to &#8220;finish&#8221;?</p></li><li><p>Does stopping the agent also revoke its access to tools and resources?</p></li><li><p>Who has the authority to trigger the kill switch, and do they know how?</p></li></ul><h2>Why Most Failures Look &#8220;Correct&#8221; at First</h2><p>Here&#8217;s the unsettling part: most AI agent failures don&#8217;t look like errors.</p><p>The system behaves exactly as designed. The agent follows instructions. It uses tools correctly. It completes tasks. And yet, something goes deeply wrong.</p><p>Consider an agent tasked with &#8220;reducing customer support ticket backlog.&#8221; It could:</p><ul><li><p>Archive unanswered tickets</p></li><li><p>Auto-close tickets after 24 hours</p></li><li><p>Stop routing new tickets to human agents</p></li></ul><p>All of these actions reduce the backlog. None of them help customers.</p><p>This is the danger of silent failures,systems that work as programmed but fail to achieve the intended outcome. Traditional software crashes loudly. AI agents fail quietly, often with perfect execution metrics.</p><p>Agents amplify this risk because they operate at scale and speed. A bad decision gets replicated hundreds or thousands of times before anyone notices.</p><h2>Apply This Even If You Don&#8217;t Use AI</h2><p>This checklist isn&#8217;t just for AI agents. It&#8217;s for any system that acts with autonomy.</p><p><strong>Background jobs:</strong> A cron job that cleans up old data could delete everything if date logic fails.</p><p><strong>Automation:</strong> A deployment script with broad permissions could take down production.</p><p><strong>Recommendation systems:</strong> A feedback loop could amplify bias or create filter bubbles.</p><p><strong>Any system with side effects:</strong> If it writes data, sends messages, or triggers actions, it can fail in these ways.</p><p>The principles remain the same:</p><ul><li><p>Clarify goals</p></li><li><p>Define boundaries</p></li><li><p>Anticipate failure modes</p></li><li><p>Build observability</p></li><li><p>Always have a kill switch</p></li></ul><p>These aren&#8217;t AI-specific problems. They&#8217;re systems problems that AI makes more visible and more urgent.</p><h2>Final Takeaway: Trust Comes From Constraints</h2><p>Autonomy without constraints is fragility.</p><p>The goal isn&#8217;t to prevent agents from doing things. It&#8217;s to ensure they can&#8217;t do things you&#8217;d regret.</p><p>Safety isn&#8217;t a patch you add after deployment. It&#8217;s a design problem. It requires thinking through failure modes before they happen, building guardrails before they&#8217;re needed, and accepting that trust is earned through constraint, not capability.</p><p>The engineers who understand this,who can reason clearly about risk, boundaries, and observability will matter more as AI systems become more capable.</p><p>Because the question isn&#8217;t whether AI agents will become more autonomous. They will.</p><p>The question is whether we&#8217;ll be ready when they do.</p><div><hr></div><p><strong>How to Use This Checklist</strong></p><p>This is not a compliance document. It&#8217;s not an ethics manifesto. It&#8217;s a thinking tool.</p><p>Use it:</p><ul><li><p>Before deploying an AI agent</p></li><li><p>Before adding autonomy to any system</p></li><li><p>Before trusting automation with real-world impact</p></li></ul><p>If you can answer these questions clearly, you&#8217;re already ahead of most teams.</p><p>And if you can&#8217;t? That&#8217;s your signal to pause and think harder, before something else does it for you.</p>]]></content:encoded></item><item><title><![CDATA[Falsehoods Programmers Believe About Time]]></title><description><![CDATA[What Y2K Actually Taught Us]]></description><link>https://shreyaspatro.substack.com/p/falsehoods-programmers-believe-about</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/falsehoods-programmers-believe-about</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Thu, 25 Dec 2025 13:35:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3fzi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Time breaks more systems than developers expect. Not because time is inherently difficult, but because our assumptions about it are consistently wrong. The Y2K crisis revealed a fundamental truth that most engineers still haven&#8217;t internalized: time is not a constant, it&#8217;s an unreliable input with more edge cases than you can imagine.</p><p>This article catalogs the most dangerous misconceptions about time in software systems, the real-world failures they cause, and the engineering principles that prevent them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3fzi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3fzi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!3fzi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!3fzi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!3fzi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3fzi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:307074,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://shreyaspatro.substack.com/i/182566997?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3fzi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!3fzi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!3fzi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!3fzi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01621847-c0fb-45eb-9eb1-aed8d5cd10f4_1024x1024.jpeg 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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://shreyaspatro.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://shreyaspatro.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Falsehood #1: &#8220;Time is the same everywhere&#8221;</h2><p><strong>Reality: It isn&#8217;t.</strong></p><h3>Why This Breaks Systems</h3><p>Time exists in layers, and each layer can drift from the others:</p><ul><li><p><strong>Server Infrastructure</strong>: Your application server runs in one timezone, your database in another, your CDN nodes scattered across continents</p></li><li><p><strong>Container Orchestration</strong>: Docker containers inherit the host&#8217;s timezone by default, which varies by deployment environment</p></li><li><p><strong>Cloud Regions</strong>: AWS us-east-1 and eu-west-1 don&#8217;t share the same clock reference</p></li><li><p><strong>User Perception</strong>: A user in Tokyo thinks it&#8217;s Tuesday morning while your server thinks it&#8217;s Monday night</p></li></ul><p>The mismatch isn&#8217;t theoretical. When your payment processor stamps a transaction at 23:58 EST but your fraud detection system evaluates it against a 00:02 UTC threshold, you&#8217;ve just processed a fraudulent payment.</p><h3>Real Failures</h3><p><strong>Duplicate Payments</strong>: A major fintech company processed the same recurring payment twice because their billing system compared timestamps across different timezones, treating &#8220;2023-03-15 00:00:00 EST&#8221; and &#8220;2023-03-15 00:00:00 PST&#8221; as different billing cycles.</p><p><strong>Cron Job Chaos</strong>: Deploy your application from a laptop in California (PST) with a cron job scheduled for &#8220;06:00&#8221;, then watch it fire at 06:00 UTC when it hits production. Your morning batch job now runs at 10 PM Pacific.</p><p><strong>Expired Tokens Still Valid</strong>: Session tokens checked for expiration against server time but generated based on user local time create a window where expired credentials remain accepted.</p><h3>The Rule</h3><p><strong>Store everything in UTC. Convert to local time only at display boundaries.</strong></p><p>Never store user-facing times like &#8220;2024-03-15 14:30&#8221; without timezone information. Use ISO 8601 with timezone offsets (<code>2024-03-15T14:30:00+05:30</code>) or store Unix timestamps alongside timezone identifiers.</p><div><hr></div><h2>Falsehood #2: &#8220;Clocks are perfectly synchronized&#8221;</h2><p><strong>Reality: They drift, pause, and jump.</strong></p><h3>Why Clocks Diverge</h3><p><strong>NTP Drift</strong>: Network Time Protocol synchronizes clocks periodically, not continuously. Between syncs, clocks drift based on hardware quality. Consumer-grade hardware drifts by milliseconds per day; that&#8217;s enough to break distributed systems.</p><p><strong>Virtual Machine Pauses</strong>: When a</p><p> hypervisor migrates a VM or pauses it for resource allocation, the guest clock freezes. From the VM&#8217;s perspective, time just skipped forward several seconds.</p><p><strong>Leap Seconds</strong>: Added irregularly to account for Earth&#8217;s rotation slowing down. On leap second days, 23:59:59 is followed by 23:59:60, then 00:00:00. Systems that assume seconds always increment by one break spectacularly.</p><h3>Failure Modes</h3><p><strong>Distributed Lock Disasters</strong>: A Redis lock expires after 10 seconds. But if the lock holder&#8217;s clock runs fast and the Redis server&#8217;s clock runs slow, the lock holder thinks it still has 3 seconds when Redis has already released it. Two processes now hold the same &#8220;exclusive&#8221; lock.</p><p><strong>Cache Invalidation Fails</strong>: You cache an API response with a 5-minute TTL based on your server&#8217;s clock. The CDN edge node&#8217;s clock is 2 minutes ahead. Your cache expires 2 minutes early for that region.</p><p><strong>Event Ordering Breaks</strong>: Microservice A timestamps an event at T1, microservice B timestamps its response at T2. Due to clock skew, T2 &lt; T1. Your event log now shows responses arriving before requests.</p><h3>The Rule</h3><p><strong>Use monotonic clocks for anything that measures duration or ordering.</strong></p><p>Monotonic clocks (like <code>System.nanoTime()</code> in Java or <code>time.monotonic()</code> in Python) measure elapsed time and are immune to clock adjustments. They never go backward, never skip forward during NTP syncs, and ignore leap seconds. Use them for timeouts, rate limiting, and performance measurements.</p><p>Wall-clock time (like <code>System.currentTimeMillis()</code> or <code>time.time()</code>) is for absolute timestamps only: when something happened in human terms, not how long it took.</p><div><hr></div><h2>Falsehood #3: &#8220;Time always moves forward&#8221;</h2><p><strong>Reality: It doesn&#8217;t.</strong></p><h3>Why Time Goes Backward</h3><p><strong>Daylight Saving Time Transitions</strong>: When clocks &#8220;fall back&#8221; in autumn, the hour from 01:00 to 02:00 happens twice. Any event timestamped in that window is ambiguous. Did it happen during the first 01:30 or the second 01:30?</p><p><strong>Manual Clock Adjustments</strong>: Administrators fix misconfigured servers by setting the clock backward. NTP can also step the clock backward if the drift is large enough.</p><p><strong>Leap Seconds</strong>: While technically moving forward, systems that insert a duplicate second (23:59:60) or smear it across a longer period effectively slow time down.</p><h3>Failure Modes</h3><p><strong>Negative Durations</strong>: Calculate elapsed time as <code>end_time - start_time</code>. If a clock adjustment happens between measurements, you get a negative number. Your retry logic that waits <code>max(0, backoff_time - elapsed)</code> now thinks zero time has passed and retries immediately.</p><p><strong>Infinite Retry Loops</strong>: A distributed system component timestamps its heartbeat. During a clock adjustment, the timestamp goes backward. The monitoring system interprets this as the component being stuck, kills it, and restarts it&#8212;repeatedly.</p><p><strong>Rate Limit Bypass</strong>: A rate limiter stores &#8220;requests per minute&#8221; keyed by the current minute: <code>2024-03-15T14:23:00Z</code>. During a fall-back DST transition, 14:23 happens again. The rate limiter resets the count. An attacker who knows the DST schedule just doubled their request quota.</p><h3>The Rule</h3><p><strong>Measure durations with monotonic time, not timestamp subtraction.</strong></p><p>For scheduling, use monotonic deadlines: &#8220;fire in 60 seconds from now&#8221; rather than &#8220;fire at timestamp T+60&#8221;. For comparisons, use sequence numbers or logical clocks (like Lamport timestamps) instead of wall-clock ordering.</p><div><hr></div><h2>Falsehood #4: &#8220;A timestamp uniquely identifies a moment&#8221;</h2><p><strong>Reality: Timestamps can be ambiguous, duplicate, or skip entirely.</strong></p><h3>Why Timestamps Aren&#8217;t Unique</h3><p><strong>DST Repeats</strong>: During the fall-back transition, <code>2024-11-03T01:30:00</code> in New York happens twice. Without the timezone offset, it&#8217;s ambiguous.</p><p><strong>Timezones That Skip</strong>: When Samoa crossed the International Date Line in 2011, December 30th never happened. Any system scheduling events for that day malfunctioned.</p><p><strong>Leap Seconds</strong>: <code>2016-12-31T23:59:60Z</code> is a valid timestamp. Some systems represent it as <code>2017-01-01T00:00:00Z</code> instead, creating a duplicate.</p><h3>Failure Modes</h3><p><strong>Logs Out of Order</strong>: Two microservices log events during a DST transition. When you merge the logs by timestamp, events appear in the wrong sequence because one service&#8217;s <code>01:30</code> is chronologically before the other&#8217;s <code>01:30</code>.</p><p><strong>Idempotency Key Collisions</strong>: A payment API uses <code>user_id + timestamp</code> as an idempotency key. During DST fall-back, the same key is generated twice. The second payment goes through even though it should have been deduplicated.</p><p><strong>Audit Trail Gaps</strong>: A compliance system records that a user action occurred at <code>2011-12-30T14:00:00</code> in Samoa. That timestamp never existed. The audit trail now has a gap that looks suspicious to regulators.</p><h3>The Rule</h3><p><strong>Time &#8800; identity. Use sequence numbers or UUIDs for uniqueness.</strong></p><p>For deduplication, use cryptographically random UUIDs or incrementing sequence numbers from a database. For ordering, use hybrid logical clocks or vector clocks. Timestamps are useful for human consumption, not system invariants.</p><div><hr></div><h2>Falsehood #5: &#8220;Two timestamps can be safely subtracted&#8221;</h2><p><strong>Reality: Not if they come from different sources.</strong></p><h3>Why Subtraction Fails</h3><p><strong>Different Clock Sources</strong>: Subtract a client-side timestamp from a server-side timestamp, and you&#8217;re measuring the difference between two independent clocks, not the actual elapsed time.</p><p><strong>Different Epochs</strong>: Unix timestamps start at January 1, 1970 UTC. Windows FILETIME starts at January 1, 1601. Subtract them and you get nonsense.</p><p><strong>Clock Drift and Adjustments</strong>: Even timestamps from the same system at different times can be unreliable if the clock was adjusted between measurements.</p><h3>Failure Modes</h3><p><strong>SLA Calculations Wrong</strong>: Your API measures request latency as <code>response_timestamp - request_timestamp</code>. The request came from a mobile client whose clock is 30 seconds fast. Your metrics now show 30-second latency spikes that never happened.</p><p><strong>Billing Errors</strong>: A cloud provider calculates usage duration as <code>stop_time - start_time</code>. A VM that ran for exactly one hour shows 59 minutes 30 seconds of usage because the host clock was adjusted during the run. The customer is either overcharged or undercharged.</p><p><strong>Negative Latency Metrics</strong>: Distributed tracing subtracts span start times across microservices. Clock skew makes it appear that a response arrived before the request was sent. Your trace visualization shows arrows pointing backward in time.</p><h3>The Rule</h3><p><strong>Only subtract timestamps from the same clock on the same system.</strong></p><p>For distributed latency measurements, include a monotonic timestamp from the sender and have the receiver measure elapsed time using its own monotonic clock. For billing or SLA, track state transitions with monotonic durations, not timestamp arithmetic.</p><div><hr></div><h2>Falsehood #6: &#8220;Human time equals system time&#8221;</h2><p><strong>Reality: They&#8217;re fundamentally incompatible.</strong></p><h3>Why They Differ</h3><p><strong>Human Calendars Are Irregular</strong>: Months have different numbers of days. February sometimes has 29 days. Weeks don&#8217;t align with months. DST transitions split or duplicate hours.</p><p><strong>Business Rules Don&#8217;t Map Cleanly</strong>: &#8220;Net 30&#8221; payment terms mean 30 days, but what if that ends on a weekend? Or a holiday? Different businesses have different rules.</p><p><strong>Legal Definitions Vary</strong>: Some jurisdictions define &#8220;midnight&#8221; as the end of a day, others as the start. Contract law in different countries interprets &#8220;one month from now&#8221; differently (calendar month vs. 30 days).</p><h3>Failure Modes</h3><p><strong>Wrong Expiry Dates</strong>: A subscription service calculates expiry as <code>start_date + 30 days</code>. But the business promised &#8220;one month&#8221; which should extend to the same day of the next month. A subscription starting January 31st expires March 2nd instead of February 28th.</p><p><strong>Legal Compliance Issues</strong>: GDPR requires deleting user data &#8220;30 days after request&#8221;. If you calculate this as seconds since epoch, you might delete data on day 29 or day 31 depending on DST transitions, violating the regulation.</p><p><strong>Payroll Disasters</strong>: Hourly workers paid for &#8220;time worked&#8221; get underpaid during DST spring-forward (23-hour shift becomes 22 hours) and overpaid during fall-back (23-hour shift becomes 24 hours).</p><h3>The Rule</h3><p><strong>Maintain separate representations for business time and system time.</strong></p><p>Store system time as UTC timestamps for precise ordering and calculations. Store business time as structured data: date, time, timezone, and the business rules that apply. Don&#8217;t convert between them automatically; make the conversion explicit with clear handling of edge cases.</p><div><hr></div><h2>Falsehood #7: &#8220;Date representations don&#8217;t need versioning&#8221;</h2><p><strong>Reality: Y2K proved assumptions expire.</strong></p><h3>Why Formats Age Badly</h3><p><strong>Assumptions Expire</strong>: Y2K happened because storing years as two digits seemed efficient in 1960 when storage was expensive. By 2000, the assumption that &#8220;all dates fall between 1900-1999&#8221; had expired, but billions of lines of code depended on it.</p><p><strong>Formats Change</strong>: ISO 8601 wasn&#8217;t standardized until 1988. Systems built before then used dozens of incompatible formats. Migrating between them requires knowing which format was used when.</p><p><strong>Storage Optimizations Age Badly</strong>: 32-bit Unix timestamps overflow in 2038. This seemed distant when Unix was created in 1970, but legacy systems will still be running in 2038.</p><h3>Failure Modes</h3><p><strong>Y2K-Style Rollovers</strong>: GPS systems had a &#8220;week number rollover&#8221; event in 2019 because GPS time uses a 10-bit week counter that resets every 1,024 weeks (approximately 19.7 years). Older GPS devices stopped working.</p><p><strong>Overflow Bugs</strong>: Systems using 32-bit signed integers to store seconds since epoch will interpret January 19, 2038 as December 13, 1901. Database constraints, comparisons, and ordering all break.</p><p><strong>Legacy Data Corruption</strong>: A database migrated from storing dates as strings to timestamps. The migration script assumed all dates were in format <code>YYYY-MM-DD</code>. Historical records with format <code>DD/MM/YYYY</code> were misinterpreted, corrupting decades of data.</p><h3>The Rule</h3><p><strong>Version time formats and future-proof storage.</strong></p><p>Use 64-bit timestamps (good until year 292 billion). Include format version metadata with stored times. Design migration paths between representations. When choosing a format, ask: &#8220;Will this still work in 50 years?&#8221;</p><div><hr></div><h2>Falsehood #8: &#8220;Time bugs are edge cases&#8221;</h2><p><strong>Reality: They&#8217;re systemic, global, and catastrophic.</strong></p><h3>Why Time Bugs Are Different</h3><p><strong>They Hit at Scale</strong>: A race condition that happens 0.01% of the time is ignorable at 100 requests/day. At 10 million requests/day, it happens 1,000 times.</p><p><strong>They Hit Globally</strong>: DST transitions don&#8217;t affect just one user. They affect entire geographic regions simultaneously, creating synchronized load spikes.</p><p><strong>They Hit Silently</strong>: A clock skew of 100ms doesn&#8217;t throw exceptions. It subtly corrupts data over weeks until someone notices that reports don&#8217;t reconcile or audit trails have gaps.</p><h3>Reality Check</h3><p>Time bugs are patient. They wait for the DST transition, the leap second, the clock adjustment, the VM migration. And when they strike, they don&#8217;t fail gracefully&#8212;they cascade.</p><div><hr></div><h2>The Meta-Lesson: Time is a Distributed Systems Problem</h2><p>If you treat time as:</p><ul><li><p><strong>A number</strong>: You&#8217;ll suffer from clock skew, overflow, and precision loss</p></li><li><p><strong>A string</strong>: You&#8217;ll suffer from parsing ambiguity, format incompatibility, and timezone confusion</p></li><li><p><strong>A universal truth</strong>: You&#8217;ll suffer from false assumptions about synchronization and monotonicity</p></li></ul><h3>The Correct Mental Model</h3><p><strong>Time is an unreliable input, not a constant.</strong></p><p>It drifts, jumps, repeats, and skips. It&#8217;s different on every machine. It means different things to different users. It requires careful validation, defensive handling, and explicit versioning&#8212;just like any other untrusted external input.</p><div><hr></div><h2>Engineer&#8217;s Checklist</h2><p>Before shipping code that deals with time, verify:</p><ul><li><p>[ ] <strong>Are we using UTC internally?</strong> Never store or compute with local time</p></li><li><p>[ ] <strong>Are we relying on wall-clock ordering?</strong> Use monotonic clocks or sequence numbers</p></li><li><p>[ ] <strong>Are durations measured with monotonic time?</strong> Never subtract wall-clock timestamps</p></li><li><p>[ ] <strong>Can logs survive DST transitions?</strong> Ensure timestamps are unambiguous</p></li><li><p>[ ] <strong>Do we version our time formats?</strong> Plan for migration and future-proofing</p></li><li><p>[ ] <strong>Can our assumptions survive 20+ years?</strong> Test with dates in 2038, 2100, etc.</p></li><li><p>[ ] <strong>Do we handle clock skew in distributed systems?</strong> Use logical clocks for causality</p></li><li><p>[ ] <strong>Are we treating timestamps as unique identifiers?</strong> Use UUIDs or sequence numbers instead</p></li></ul><div><hr></div><h2>Famous Time Failures: Case Studies</h2><h3>Y2K (1999-2000)</h3><p>The most expensive time bug in history. Billions spent updating systems that stored years as two digits. Critical infrastructure, financial systems, and embedded devices all at risk. The lesson: storage optimizations have a shelf life.</p><h3>Leap Second Outages (2012)</h3><p>Reddit, Gawker, FourSquare, and hundreds of other sites crashed when Linux kernel&#8217;s hrtimer subsystem spun at 100% CPU during a leap second. Cloudflare experienced similar issues in later leap seconds. The lesson: even small time anomalies break systems in unexpected ways.</p><h3>Daylight Saving Time Airline Scheduling (2007)</h3><p>When the US changed DST dates in 2007, airline reservation systems that hardcoded DST rules started showing flights departing before they arrived. The lesson: time rules change, often without much notice.</p><h3>Knight Capital Trading Disaster (2012)</h3><p>A deployment during market hours caused timestamps in old and new code to desynchronize. The trading algorithm processed stale orders as new, losing $440 million in 45 minutes. The lesson: clock skew in distributed systems destroys invariants.</p><div><hr></div><h2>Why This Matters</h2><p>Engineers inherit time-handling patterns from tutorials, Stack Overflow snippets, and legacy codebases. Most of these patterns are wrong. They work 99% of the time, which makes them dangerous&#8212;they fail in production, under load, during DST transitions, in distributed deployments.</p><p>This article isn&#8217;t about edge cases. It&#8217;s about understanding that time in software requires the same rigor as security, data integrity, or distributed consensus. Treat it as an unreliable input. Version your assumptions. Test your edge cases. And when in doubt, use UTC, monotonic clocks, and explicit timezone handling.</p><p>The Y2K crisis taught us that optimistic assumptions about time eventually expire. The question isn&#8217;t whether your time-handling code will break, but whether you&#8217;ll fix it before it breaks in production.</p>]]></content:encoded></item><item><title><![CDATA[CODEBASE DEEP-DIVE CHECKLIST (5% RULE)]]></title><description><![CDATA[Understand any codebase in under 30 minutes]]></description><link>https://shreyaspatro.substack.com/p/codebase-deep-dive-checklist-5-rule</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/codebase-deep-dive-checklist-5-rule</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Fri, 19 Dec 2025 13:09:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://shreyaspatro.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 Shreyas's Substack! 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><div><hr></div><h3><strong>1&#65039;&#8419; Identify the Entry points (The 5% that matters)</strong></h3><ul><li><p>main() or app bootstrap file<br><br></p></li><li><p>API routes / controllers<br><br></p></li><li><p>Cron jobs / background workers<br><br></p></li><li><p>Config &amp; environment loader<br><br></p></li><li><p>Dependency injection setup (if any)<br><br></p></li></ul><p><strong>Goal:<br></strong> Know <em>exactly where the system starts</em>.</p><div><hr></div><h2><strong>2&#65039;&#8419; Map the Data Flow</strong></h2><ul><li><p>What comes IN? (requests, events, inputs)<br><br></p></li><li><p>Where does it go? (services, modules)<br><br></p></li><li><p>What transforms it? (business logic)<br><br></p></li><li><p>What comes OUT? (responses, side effects)<br><br></p></li></ul><p><strong>Tool:</strong> Draw a 30-second flow diagram.</p><p><strong>Goal:<br></strong> Understand <em>how the system moves information</em>.</p><div><hr></div><h2><strong>3&#65039;&#8419; Track All Side Effects (The real bug magnets)</strong></h2><ul><li><p>Database reads/writes<br><br></p></li><li><p>Network calls<br><br></p></li><li><p>Third-party API usage<br><br></p></li><li><p>File system I/O<br><br></p></li><li><p>Message queues / pub-sub events<br><br></p></li><li><p>Caching layers<br><br></p></li></ul><p><strong>Goal:<br></strong> Find the <strong>risky</strong> parts of the system &#8212; where things break.</p><div><hr></div><h2><strong>4&#65039;&#8419; Identify the Core Abstractions</strong></h2><ul><li><p>Models / entities<br><br></p></li><li><p>Repositories<br><br></p></li><li><p>Services<br><br></p></li><li><p>Utilities / helpers<br><br></p></li><li><p>Middlewares<br><br></p></li></ul><p><strong>Goal:<br></strong> Know the vocabulary of the system.</p><div><hr></div><h2><strong>5&#65039;&#8419; Ignore 95% of the Noise</strong></h2><ul><li><p>UI components<br><br></p></li><li><p>Styling<br><br></p></li><li><p>Repetitive helper code<br><br></p></li><li><p>Auto-generated files<br><br></p></li><li><p>Framework boilerplate<br><br></p></li></ul><p><strong>Goal:<br></strong> Don&#8217;t drown in irrelevant code.</p><div><hr></div><h2><strong>6&#65039;&#8419; Build a Quick Mental Model</strong></h2><p>By now you should know:</p><ul><li><p>How the app <em>starts<br><br></em></p></li><li><p>How data <em>moves<br><br></em></p></li><li><p>Where side effects <em>occur<br><br></em></p></li><li><p>What the core <em>building blocks</em> are<br><br></p></li><li><p>What you can safely <em>ignore<br><br></em></p></li></ul><p><strong>Time to understand a large codebase:<br></strong> &#10145;&#65039; <strong>15&#8211;30 minutes instead of weeks</strong></p><div><hr></div><h2><strong>7&#65039;&#8419; Bonus: Questions Seniors Always Ask</strong></h2><ul><li><p>&#8220;Where does the first write to the database happen?&#8221;<br><br></p></li><li><p>&#8220;What is the single source of truth for this data?&#8221;<br><br></p></li><li><p>&#8220;Which function has the highest blast radius?&#8221;<br><br></p></li><li><p>&#8220;What&#8217;s the simplest path through the system?&#8221;</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Engineering Decision Framework ]]></title><description><![CDATA[A Senior Engineer's Guide to Making Better Technical Decisions]]></description><link>https://shreyaspatro.substack.com/p/engineering-decision-framework</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/engineering-decision-framework</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Fri, 19 Dec 2025 12:51:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9O8x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>By: Shreyas Patro</strong></p><div><hr></div><p><strong>Part 1: The Decision Triangle</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://shreyaspatro.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 Shreyas's Substack! 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>Every technical decision exists in a three-dimensional space. Understanding where your decision falls helps you calibrate the right level of scrutiny and speed.</p><h3><strong>The Three Axes</strong></h3><p><strong>Impact</strong> &#8212; What&#8217;s the blast radius if this goes wrong?</p><ul><li><p>Low: affects one component, easily contained</p></li><li><p>Medium: crosses team boundaries, requires coordination</p></li><li><p>High: affects architecture, user experience, or business metrics</p></li></ul><p><strong>Risk</strong> &#8212; What&#8217;s the probability of failure and its consequences?</p><ul><li><p>Low: well-understood territory, proven patterns</p></li><li><p>Medium: some unknowns, requires validation</p></li><li><p>High: novel territory, unproven at scale</p></li></ul><p><strong>Reversibility</strong> &#8212; Can you undo this decision later?</p><ul><li><p>High: configuration changes, feature flags, UI tweaks</p></li><li><p>Medium: requires migration but feasible within a quarter</p></li><li><p>Low: baked into contracts, schemas, or public APIs</p></li></ul><h3><strong>Decision Classification Examples</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9O8x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9O8x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png 424w, https://substackcdn.com/image/fetch/$s_!9O8x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png 848w, https://substackcdn.com/image/fetch/$s_!9O8x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png 1272w, https://substackcdn.com/image/fetch/$s_!9O8x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9O8x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png" width="1240" height="601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:1240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86397,&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://shreyaspatro.substack.com/i/182081013?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.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_!9O8x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png 424w, https://substackcdn.com/image/fetch/$s_!9O8x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png 848w, https://substackcdn.com/image/fetch/$s_!9O8x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.png 1272w, https://substackcdn.com/image/fetch/$s_!9O8x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38a65fca-5cea-4376-a434-7ca3a3fd6a8a_1240x601.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><div><hr></div><h2><strong>Part 2: The One-Way vs Two-Way Door Mental Model</strong></h2><p>Jeff Bezos&#8217;s framework for decision velocity. Most decisions are two-way doors (reversible), yet we treat them like one-way doors (permanent).</p><h3><strong>One-Way Doors (Type 1 Decisions)</strong></h3><p><strong>These require careful, deliberate thought</strong></p><ul><li><p><strong>Database schemas</strong> &#8212; Migrations are painful; breaking changes affect all consumers</p></li><li><p><strong>Public APIs</strong> &#8212; External contracts; breaking them destroys trust</p></li><li><p><strong>Infrastructure commitments</strong> &#8212; Multi-year vendor lock-in, migration costs in millions</p></li><li><p><strong>Language/framework for new systems</strong> &#8212; Rewrite costs compound over time</p></li><li><p><strong>Core abstractions</strong> &#8212; Wrong primitives propagate through entire codebase</p></li><li><p><strong>Security/compliance decisions</strong> &#8212; Audit trails, regulatory implications</p></li><li><p><strong>Org structure changes</strong> &#8212; Conway&#8217;s Law applies; system boundaries follow team boundaries</p></li></ul><p><strong>Red flags you&#8217;re at a one-way door:</strong></p><ul><li><p>&#8220;Once we ship this, customers depend on it&#8221;</p></li><li><p>&#8220;Migration would take quarters&#8221;</p></li><li><p>&#8220;We&#8217;d have to rewrite everything&#8221;</p></li><li><p>&#8220;The team would need to learn a new paradigm&#8221;</p></li></ul><h3><strong>Two-Way Doors (Type 2 Decisions)</strong></h3><p><strong>These should be made quickly, with bias toward action</strong></p><ul><li><p><strong>Feature flags</strong> &#8212; Can toggle on/off instantly</p></li><li><p><strong>UI/UX changes</strong> &#8212; Rapid iteration, A/B testing</p></li><li><p><strong>Internal refactors</strong> &#8212; No external contracts broken</p></li><li><p><strong>Logging/monitoring changes</strong> &#8212; Configurable, no downtime</p></li><li><p><strong>Hiring one IC</strong> &#8212; Course-correctable within months</p></li><li><p><strong>Sprint commitments</strong> &#8212; Reprioritize next sprint</p></li><li><p><strong>Code organization</strong> &#8212; Modern IDEs make refactoring cheap</p></li></ul><p><strong>Green lights for fast decisions:</strong></p><ul><li><p>&#8220;We can roll this back in minutes&#8221;</p></li><li><p>&#8220;Only our team sees this&#8221;</p></li><li><p>&#8220;We can A/B test this&#8221;</p></li><li><p>&#8220;The old code path still exists&#8221;</p></li></ul><div><hr></div><h2><strong>Part 3: Senior Judgment Patterns</strong></h2><h3><strong>When to Decide FAST (Minutes to Hours)</strong></h3><p><strong>Conditions:</strong></p><ul><li><p>Impact is low OR fully reversible</p></li><li><p>You have 70%+ confidence</p></li><li><p>Delay cost exceeds decision cost</p></li><li><p>Learning-by-doing is faster than analysis</p></li></ul><p><strong>Examples:</strong></p><ul><li><p>Variable naming in internal code</p></li><li><p>Directory structure for new project</p></li><li><p>Whether to add a log line</p></li><li><p>Choice between two equivalent libraries</p></li><li><p>Ordering of bullet points in a doc</p></li></ul><p><strong>Tactics:</strong></p><ul><li><p>Set a 30-minute decision deadline</p></li><li><p>Flip a coin if truly 50/50</p></li><li><p>Ask &#8220;Will this matter in 6 months?&#8221; If no, decide now</p></li><li><p>Use &#8220;disagree and commit&#8221; to unblock</p></li></ul><p><strong>Anti-pattern:</strong> Bikeshedding &#8212; spending 3 hours debating tab width when you could&#8217;ve shipped a feature.</p><div><hr></div><h3><strong> When to Slow Down (Days to Weeks)</strong></h3><p><strong>Conditions:</strong></p><ul><li><p>High risk AND low reversibility</p></li><li><p>Decision sets precedent for team/org</p></li><li><p>Multiple stakeholders need alignment</p></li><li><p>Clear tradeoffs require written reasoning</p></li></ul><p><strong>Examples:</strong></p><ul><li><p>Adopting a new database technology</p></li><li><p>Changing authentication architecture</p></li><li><p>Setting team coding standards</p></li><li><p>Choosing a new cloud service</p></li><li><p>Deprecating a major feature</p></li></ul><p><strong>Tactics:</strong></p><ul><li><p>Write a 1-2 page RFC (Request for Comments)</p></li><li><p>Seek review from 2-3 experienced engineers</p></li><li><p>Build a prototype to validate assumptions</p></li><li><p>Run a spike to measure performance</p></li><li><p>Schedule a decision meeting with clear rubric</p></li></ul><p><strong>Required artifacts:</strong></p><ul><li><p>Problem statement</p></li><li><p>Proposed solution with alternatives</p></li><li><p>Tradeoff analysis (pros/cons table)</p></li><li><p>Migration plan if relevant</p></li><li><p>Success metrics</p></li></ul><p><strong>Anti-pattern:</strong> Analysis paralysis &#8212; running benchmarks for 3 weeks when a 2-day prototype would answer your question.</p><div><hr></div><h3><strong> When to DELAY (Weeks to Months)</strong></h3><p><strong>Conditions:</strong></p><ul><li><p>Missing critical information that will arrive soon</p></li><li><p>Constraints are still being defined</p></li><li><p>Technology landscape is rapidly evolving</p></li><li><p>Current solution is &#8220;good enough&#8221;</p></li></ul><p><strong>Examples:</strong></p><ul><li><p>Migrating to a framework when v2.0 ships in 2 months</p></li><li><p>Choosing AI model before evaluation dataset is ready</p></li><li><p>Rewriting service before understanding usage patterns</p></li><li><p>Optimizing code before profiling</p></li><li><p>Building abstraction before 3rd use case emerges</p></li></ul><p><strong>Tactics:</strong></p><ul><li><p>Set a decision deadline (&#8221;We decide by Q2 regardless&#8221;)</p></li><li><p>Identify the specific info you&#8217;re waiting for</p></li><li><p>Build minimum viable documentation to preserve context</p></li><li><p>Schedule a revisit meeting</p></li><li><p>Make the smallest commitment that unblocks you</p></li></ul><p><strong>Rules of thumb:</strong></p><ul><li><p>Delay if you&#8217;re &lt;40% confident and new data is coming</p></li><li><p>Don&#8217;t delay if you&#8217;re waiting for perfect information (it never comes)</p></li><li><p>Don&#8217;t delay to avoid responsibility</p></li></ul><p><strong>Anti-pattern:</strong> Perpetual &#8220;not yet&#8221; &#8212; using uncertainty as excuse to avoid hard choices.</p><div><hr></div><h2><strong>Part 4: Common Junior Engineer Mistakes</strong></h2><h3><strong>&#10060; Overthinking Reversible Decisions</strong></h3><p><strong>Symptoms:</strong></p><ul><li><p>Spending hours researching which linter to use</p></li><li><p>Writing 5-page docs for internal tooling choices</p></li><li><p>Seeking consensus on formatting preferences</p></li><li><p>Running benchmarks on choices that don&#8217;t affect users</p></li></ul><p><strong>Why it happens:</strong> Junior engineers often lack the experience to distinguish high-stakes from low-stakes decisions. Everything feels important.</p><p><strong>The fix:</strong></p><ul><li><p>Ask: &#8220;What&#8217;s the cost of being wrong?&#8221;</p></li><li><p>If answer is &lt;2 hours of work, decide in &lt;15 minutes</p></li><li><p>Remember: making a reversible decision badly is better than making no decision</p></li></ul><div><hr></div><h3><strong>&#10060; Rushing Irreversible Decisions</strong></h3><p><strong>Symptoms:</strong></p><ul><li><p>Choosing database based on Hacker News hype</p></li><li><p>Committing to vendor without evaluating alternatives</p></li><li><p>Designing API without considering future extensibility</p></li><li><p>Making architectural choices in Slack threads</p></li></ul><p><strong>Why it happens:</strong> Pressure to move fast, overconfidence in initial research, underestimating migration costs.</p><p><strong>The fix:</strong></p><ul><li><p>Use the &#8220;regret minimization&#8221; framework</p></li><li><p>Ask: &#8220;Will I regret this in 2 years?&#8221;</p></li><li><p>Demand written justification for one-way doors</p></li><li><p>Get buy-in from someone who&#8217;ll maintain it long-term</p></li></ul><div><hr></div><h3><strong>&#10060; Confusing Speed with Competence</strong></h3><p><strong>Symptoms:</strong></p><ul><li><p>Picking first solution without exploring alternatives</p></li><li><p>Implementing before understanding the problem</p></li><li><p>Skipping design phase to &#8220;just start coding&#8221;</p></li><li><p>Measuring productivity by lines of code</p></li></ul><p><strong>Why it happens:</strong> Startup culture glorifies speed; juniors interpret this as &#8220;think less, ship more.&#8221;</p><p><strong>The fix:</strong></p><ul><li><p>Speed matters for two-way doors, not one-way doors</p></li><li><p>Velocity = speed &#215; direction; wrong direction = negative velocity</p></li><li><p>Senior engineers are fast because they&#8217;ve seen the failure modes</p></li><li><p>Slow down to speed up: 1 hour of design saves 10 hours of refactoring</p></li></ul><div><hr></div><h3><strong>&#10060; Ignoring the &#8220;Rule of Three&#8221;</strong></h3><p><strong>Symptoms:</strong></p><ul><li><p>Building abstraction after first use case</p></li><li><p>Creating framework for single feature</p></li><li><p>Generalizing before understanding patterns</p></li></ul><p><strong>Why it happens:</strong> Engineers love elegant solutions; premature abstraction feels smart.</p><p><strong>The fix:</strong></p><ul><li><p>Wait for 3 concrete examples before abstracting</p></li><li><p>Copy-paste twice, refactor on the third</p></li><li><p>Wrong abstraction is worse than duplication</p></li><li><p>YAGNI (You Aren&#8217;t Gonna Need It) until you do</p></li></ul><div><hr></div><h2><strong>Practical Checklist: Before Making Any Decision</strong></h2><p><strong>Answer these 5 questions:</strong></p><ol><li><p><strong>What type of door is this?</strong> (One-way or two-way?)</p></li><li><p><strong>What&#8217;s the cost of being wrong?</strong> (Hours? Months? Irrecoverable?)</p></li><li><p><strong>What&#8217;s the cost of deciding later?</strong> (Blocking work? Learning opportunity?)</p></li><li><p><strong>Who needs to be involved?</strong> (Just me? My team? Multiple teams?)</p></li><li><p><strong>What would I need to know to reach 90% confidence?</strong> (Is that achievable?)</p></li></ol><p>If you can&#8217;t answer these clearly, <strong>you don&#8217;t understand the decision well enough yet.</strong></p><div><hr></div><h2><strong>The Meta-Skill: Knowing What You Don&#8217;t Know</strong></h2><p>The most dangerous engineer is one who doesn&#8217;t recognize their knowledge gaps. Senior engineers are constantly asking:</p><ul><li><p>&#8220;What am I not considering?&#8221;</p></li><li><p>&#8220;Who has solved this before?&#8221;</p></li><li><p>&#8220;What&#8217;s the version of this problem I don&#8217;t see yet?&#8221;</p></li></ul><p><strong>Build your calibration:</strong></p><ul><li><p>Track your decisions and outcomes</p></li><li><p>Do post-mortems on both successes and failures</p></li><li><p>Notice when you were overconfident or underconfident</p></li><li><p>Seek feedback: &#8220;What would you have done differently?&#8221;</p></li></ul><div><hr></div><h2><strong>Final Wisdom</strong></h2><p><strong>Good engineering judgment is not about being right every time.</strong></p><p>It&#8217;s about:</p><ul><li><p>Matching decision velocity to decision stakes</p></li><li><p>Knowing when to research vs when to experiment</p></li><li><p>Recognizing patterns from experience</p></li><li><p>Failing fast on reversible decisions</p></li><li><p>Being deliberate on irreversible ones</p></li></ul><p><strong>The goal isn&#8217;t perfect decisions. The goal is high-velocity learning with bounded downside.</strong></p><div><hr></div><p><em><strong>&#8220;In the long run, the speed of your team is determined by the quality of your decisions, not the speed of your decisions.&#8221;</strong></em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://shreyaspatro.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 Shreyas's Substack! 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[Coming soon]]></title><description><![CDATA[This is Shreyas&#39;s Substack.]]></description><link>https://shreyaspatro.substack.com/p/coming-soon</link><guid isPermaLink="false">https://shreyaspatro.substack.com/p/coming-soon</guid><dc:creator><![CDATA[Shreyas Patro]]></dc:creator><pubDate>Fri, 19 Dec 2025 12:45:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Q8s!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66471d2d-0669-458e-8c3d-22a2e2b3c98b_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is Shreyas&#39;s Substack.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://shreyaspatro.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://shreyaspatro.substack.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item></channel></rss>