<?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[Jagadeesh Rampam]]></title><description><![CDATA[Tech, research, field notes, BTS of our products: Parjanya v2.0, WilderhoodTV, Smriti LLM
https://phagyul.ai]]></description><link>https://blog.phagyul.ai</link><image><url>https://blog.phagyul.ai/img/substack.png</url><title>Jagadeesh Rampam</title><link>https://blog.phagyul.ai</link></image><generator>Substack</generator><lastBuildDate>Sat, 19 Sep 2026 18:04:09 GMT</lastBuildDate><atom:link href="https://blog.phagyul.ai/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Jagadeesh Rampam]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[jagadeeshrampam@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[jagadeeshrampam@substack.com]]></itunes:email><itunes:name><![CDATA[Phagyul AI Systems Pvt Ltd]]></itunes:name></itunes:owner><itunes:author><![CDATA[Phagyul AI Systems Pvt Ltd]]></itunes:author><googleplay:owner><![CDATA[jagadeeshrampam@substack.com]]></googleplay:owner><googleplay:email><![CDATA[jagadeeshrampam@substack.com]]></googleplay:email><googleplay:author><![CDATA[Phagyul AI Systems Pvt Ltd]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Parjanya 2.0 is open to everyone ]]></title><description><![CDATA[Release notes from seven weeks of closed beta: 18,884 images, 18+ formats, 20+ photographers, and what they contributed.]]></description><link>https://blog.phagyul.ai/p/parjanya-20-is-open-to-everyone</link><guid isPermaLink="false">https://blog.phagyul.ai/p/parjanya-20-is-open-to-everyone</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Mon, 14 Sep 2026 05:28:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Bsi_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>On 27 July we quietly opened Parjanya 2.0 to a small group of photographers and asked them to do one thing: upload real shoots, not portfolios, and tell us and looked for their feedback and how they would wanted the application to be. Twenty-plus people took us up on it: wildlife, nature, landscape and architecture photographers, from working professionals to few who bought their first camera this year and mobile photographer. They brought 1,400-frame safari mornings, bracketed dawns, archival film scans and RAW from bodies our decoder had never met. By this weekend the pipeline had enriched <strong>18,884 images across more than 18 file formats</strong> for that group.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Bsi_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Bsi_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!Bsi_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!Bsi_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!Bsi_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Bsi_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:99914,&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://blog.phagyul.ai/i/215603782?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.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_!Bsi_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!Bsi_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!Bsi_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!Bsi_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8b579a5-b61b-416f-b0c1-c33966c57834_1456x816.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Today it is open to everyone. This post is the release notes: what Parjanya does, who tested it and what they found, everything that changed between the July baseline and now, and what is coming next. The engineering detail is here too, because this blog has always been the place for it.</p><h2><strong>What Parjanya does, in two passes</strong></h2><p>You drop a folder or files from your card or hard drive straight into the browser, and the files go from the browser directly into private storage over signed, resumable transfers. The moment the upload says complete you can close your browser or session: the analysis picks the work up on its own, and every upload and every verdict is recorded as a replayable intent, so nothing is lost to a dropped connection or a busy GPU. (The upload path and the reconciliation model behind it, TBIE, in-house research paper successfully verified for our usecase and evolved and tested for 18+ usecases.) Parjanya makes fast previews from every file (majority is RAW files across DSLR, mirrorless, mobile phones and Analog converted to Digital) and then checks each frame twice, in a fixed order.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xnYa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xnYa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif 424w, https://substackcdn.com/image/fetch/$s_!xnYa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif 848w, https://substackcdn.com/image/fetch/$s_!xnYa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif 1272w, https://substackcdn.com/image/fetch/$s_!xnYa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xnYa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif" width="960" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39869bda-325b-4585-964b-06d6f29c0549_960x540.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:960,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:988167,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/215603782?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xnYa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif 424w, https://substackcdn.com/image/fetch/$s_!xnYa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif 848w, https://substackcdn.com/image/fetch/$s_!xnYa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif 1272w, https://substackcdn.com/image/fetch/$s_!xnYa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39869bda-325b-4585-964b-06d6f29c0549_960x540.gif 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p><strong>Pass one is a technical gate.</strong> Cheap, strict, and deliberately narrow: unreadable or damaged files, images whose pixel size disagrees with what the file claims, blank frames, near-solid exposures (a frame is set aside only when almost every pixel is pure white or pure black, so brackets and silhouettes pass), duplicates by perceptual fingerprint (frames within ten seconds on the same body are a burst, never duplicates), and screenshots or exports in formats no camera writes will be filtered out. Anything set aside lands in Skip with the reason attached. Nothing is deleted.</p></li><li><p><strong>Pass two is VLM enrichment.</strong> A vision-language model running on our own GPUs reads the frame and writes what you see on the detail page: what the photo is doing, how it is composed, what is holding it back and how strongly, plus the tags search runs on. A deterministic rule engine turns those findings into <strong>Keeper, Review or Skip</strong> with the reason attached. There is no score out of ten, on purpose: the same findings give the same verdict every time. (our v2.0 major change proved score engine doesn&#8217;t hold true and a deterministic rule engine does the best for our usecase)</p></li></ul><p>You curate in a three-tab gallery where any verdict can be overruled, search the shoot in your own words (&#8221;leopard in dappled light&#8221;, &#8220;long exposure, silky water&#8221;, &#8220;symmetry, blue hour&#8221;), and after 500 uploads you get <strong>Parjanya Vision</strong>: a report card written like a coach rather than a mark sheet.</p><h2><strong>The people who tested it</strong></h2><p>The pilot group was small enough that every one of them changed something. A wildlife shooter pressed Stop on a 479-image batch expecting a pause; that single click is why Pause and Resume exist. A documentary photographer was first to point out that a Review/Skip line drawn only on technique penalises intentional motion and grain, which is now an open design question on the tracker (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/58">#58</a>). Someone on their first camera uploaded iPhone photos that were accepted and never analysed. An archivist uploaded 16-bit grayscale scans that came back as blank white frames(<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/87">#87</a>). A landscape photographer with a body released this year sent RAW files our decoder had never seen, and they came back in false colour until it learned to fall back to the camera&#8217;s own embedded preview. And a mix of legacy camera bodies, manual lens and more.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SrDU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SrDU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!SrDU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!SrDU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!SrDU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SrDU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f849f63-c83a-43fd-8149-6da956264913_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:141680,&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://blog.phagyul.ai/i/215603782?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.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_!SrDU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!SrDU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!SrDU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!SrDU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f849f63-c83a-43fd-8149-6da956264913_1456x816.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Several of the pilot group are credited on the public tracker against the issues they raised; where someone preferred to stay unnamed, the issue says &#8220;pilot feedback&#8221; and nothing more. The onboarding guide itself, the ten-minute walkthrough new users get today, was recommended by one of the pilot experts.</p><p>Thank you, all of you. The list of fixes below is mostly your list. </p><p><a href="https://github.com/JagadeeshRampam/parjanya-issues/issues">https://github.com/JagadeeshRampam/parjanya-issues/issues</a></p><h2><strong>What changed since the July baseline</strong></h2><p>The v2.0.0 baseline was cut on 11 July after a 12,000-image validation run. Between then and today, 34 items on the public tracker were closed. Grouped by what you will notice:</p><h3><strong>Uploads and formats</strong></h3><ul><li><p><strong>iPhone photos process now.</strong> HEIC and HEIF were on the supported list and were accepted at upload, then stranded silently with no preview and no analysis. The decoder library was installed the whole time; the one line that registers it with the imaging library had been lost in a refactor. Fixed and verified on real iPhone uploads (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/40">#40</a>).</p></li><li><p><strong>16-bit grayscale scans no longer come back white.</strong> Single-channel 16-bit TIFFs were clipped to solid white during preview generation and then, correctly, set aside as blank. The fix rescales by bit depth and validates every preview it writes. All 28 affected images were reprocessed (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/87">#87</a>).</p></li><li><p><strong>Canon CR3 previews lost their magenta cast and dark border</strong> (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/16">#16</a>).</p></li><li><p><strong>Filenames with spaces render previews again</strong> (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/69">#69</a>), and camera and lens names no longer carry trailing padding from fixed-width metadata fields, which had been splitting one lens into two entries in filters (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/48">#48</a>).</p></li><li><p><strong>Upload progress no longer flashes &#8220;Uploading: 0&#8221;</strong> mid-transfer (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/3">#3</a>), and switching accounts in the same tab no longer shows the previous account&#8217;s upload bar (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/33">#33</a>).</p></li><li><p><strong>When an upload is blocked</strong>, by a trial cap or an account hold, the app now says why and what to do, instead of a generic error (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/24">#24</a>).</p></li></ul><h3><strong>Processing you can control</strong></h3><ul><li><p><strong>Pause and Resume.</strong> Stop was permanent, and a photographer found that out on a 479-image batch. Pause parks queued work and Resume picks it up exactly where it left off; a frame already being analysed when you pause finishes and keeps its result (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/36">#36</a>). Stop still exists and now sticks end to end, including for work already in flight (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/32">#32</a>).</p></li><li><p><strong>&#8220;Warming up the AI analysis.&#8221;</strong> The GPU fleet starts on demand. When it is starting, the gallery now says so, so a cold start reads as a cold start and not as a broken product (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/62">#62</a>).</p></li><li><p><strong>Screenshots are turned away before they reach the GPU.</strong> Nine screenshots uploaded in August all passed the technical checks and three were accepted as good photographs. A metadata gate now rejects non-photographic content first (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/64">#64</a>).</p></li></ul><h3><strong>Reading the analysis</strong></h3><ul><li><p><strong>Critique and improvements are two cards now.</strong> The critique is served exactly as written. The one or two actions worth taking were previously the last sentence of an italic paragraph most readers had stopped reading; they are now their own card, and they never repeat what the critique already said (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/93">#93</a>).</p></li><li><p><strong>Burst groups show a per-frame breakdown</strong> when the frames in a burst got different verdicts (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/1">#1</a>).</p></li><li><p><strong>The gallery badge showed &#8220;Pending&#8221; for every auto-curated image</strong> because two parts of the system spelled the verdict differently. Fixed (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/90">#90</a>).</p></li></ul><h3><strong>Gallery and search</strong></h3><ul><li><p><strong>Newest first.</strong> The gallery was not listing your newest uploads first, which meant your own upload could be invisible to you. It reads from a recency index now (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/66">#66</a>), and the three tabs agree on what &#8220;newest&#8221; means (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/68">#68</a>).</p></li><li><p><strong>Semantic re-ranking</strong> using SigLIP 2 image embeddings is integrated behind a flag, and search now says visibly when it has fallen back to keyword ranking (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/28">#28</a>, <a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/30">#30</a>). Content filters for scene, lighting and mood are still hidden until every image carries those tags (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/72">#72</a>, <a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/25">#25</a>).</p></li></ul><h3><strong>Parjanya Vision</strong></h3><ul><li><p><strong>The report card shipped on 9 September.</strong> It started life as a per-shoot summary idea (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/85">#85</a>) and became a tenant-wide card: what you shoot, which camera bodies and formats, how far you zoom, where your Review pile clusters, how you curate (rescued versus demoted), and what to try. Every rate travels with its count. Copy is coach voice by rule; there is a test that fails the build if words like <em>mistake</em> or <em>grade</em> appear (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/98">#98</a>).</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!prCr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!prCr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!prCr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!prCr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!prCr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!prCr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3819019d-0e62-469c-a181-0da48271d4d3_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:132258,&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://blog.phagyul.ai/i/215603782?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.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_!prCr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!prCr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!prCr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!prCr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3819019d-0e62-469c-a181-0da48271d4d3_1456x816.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Two same-day fixes after the first photographers opened it: bars that overflowed their card, and a horizontal fill bar that read like a progress meter for what is really two counts being compared. It is a vertical bar chart now (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/99">#99</a>).</p></li></ul><h3><strong>Account, trial and email</strong></h3><ul><li><p><strong>Sign-up provisions correctly</strong> (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/22">#22</a>) and confirmation codes deliver (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/23">#23</a>), which sounds like table stakes and was the last launch dependency to close.</p></li><li><p><strong>Every account email exists now</strong>: three days before a trial ends, the day it ends, a follow-up a week later, when you are at 90% of a cap, when a cap is reached, and one for every action we take on an account, including a past-tense notice after a deletion completes (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/88">#88</a>, <a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/89">#89</a>, <a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/104">#104</a>).</p></li></ul><h2><strong>Where your photos live</strong></h2><p>Confidently, because it was audited before launch: your originals go from your browser straight into private, encrypted storage in Mumbai, in a space that belongs only to your account, with public access blocked at the bucket level and every connection over HTTPS. Every request is checked against your signed-in identity before it touches a record; there is no path from one photographer&#8217;s library to another&#8217;s. Every access to stored photos is written to an audit trail with alarms on any human or unexpected access. The vision model runs on GPUs we operate, so your photos are never sent to a third-party AI service and are never used to train models. And nothing is deleted by us: when a trial ends, uploads pause and everything already there stays readable and downloadable.</p><h2><strong>Search, in your own words</strong></h2><p>Search reads the critique, the composition notes and the closed-vocabulary tags the model writes for every frame (subject, scene, lighting, mood, dominant colours), so queries like <em>elephant herd at a waterhole, backlit</em>, <em>dew on a spider web</em>, <em>ridgeline at dawn, layered haze</em> or <em>stairwell, geometric shadows</em> work today. Two more pieces are built and switching on as the whole catalogue gets its tags and embeddings: filter chips for scene, lighting and mood, and a look-alike mode that ranks by visual similarity using SigLIP 2 image embeddings (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/11">#11</a>, <a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/25">#25</a>, <a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/72">#72</a>).</p><h2><strong>Three things the pilot taught us</strong></h2><p><strong>1. Stop is not Pause, and a UI should know the difference.</strong> The 479-image incident was not a bug; Stop did what it said. The bug was offering only an irreversible action for a reversible intent. Resume had one subtle requirement worth writing down: flip the records back to pending <em>before</em> re-queueing them. Queue first and a worker can pick the message up, still read &#8220;paused&#8221;, and drop the job on the floor.</p><p><strong>2. Small uploads should not summon the whole fleet.</strong> GPU scaling used to step up on a timer whenever the queue was non-empty. A 13-image batch could scale to the maximum fleet, most of which arrived after the work was done, and the fleet then took 69 minutes to scale back down. Scaling now targets an exact capacity from visible-plus-in-flight queue depth; the same drain takes about four minutes. The accepted side effect is that scale-in occasionally interrupts a job mid-inference, which the queue&#8217;s visibility timeout retries (about 1% of images, zero lost) (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/41">#41</a>).</p><p><strong>3. &#8220;Supported&#8221; is a promise about acceptance, not decoding.</strong> The HEIC and 16-bit TIFF cases were the same class of problem: a format we would accept at upload and then fail on quietly. The legacy and edge-case list from the pilot is now long and mostly handled: RAW from bodies newer than the decoder&#8217;s database (falls back to the camera&#8217;s embedded preview instead of false colour), 16-bit and grayscale scans (rescaled by bit depth), iPhone HEIC, 25 RAW formats including Canon CRW, Sony SRF/SR2, Hasselblad 3FR/FFF, Phase One IIQ and Sigma X3F, filenames with spaces, manufacturer-padded camera names, bracketed exposures (pass the gate), bursts (stack, best frame ranked). Still open: older bodies and phone JPEGs that record no capture time can have burst frames flagged as duplicates (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/70">#70</a>). Of the 34 formats, 18 are proven end to end in production; the next one we want a real file for is Fujifilm RAF (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/42">#42</a>, <a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/47">#47</a>). If you shoot Fuji, your first upload is a favour to us.</p><h2><strong>Numbers from the closed beta</strong></h2><ul><li><p>20+ photographer accounts, from first-camera to full-time professional</p></li><li><p>18,884 images enriched, across 18+ file formats</p></li><li><p>104 issues filed on the public tracker since July; 34 closed, every one with what actually shipped</p></li><li><p>Launch-day verification: 100 human-checked images, 51 Keeper / 47 Skip / 2 Review, zero stranded</p></li><li><p>GPU drain after a small upload: 69 minutes &#8594; about 4 minutes</p></li><li><p>Cold start after an idle period: 5 min 32 s today; 90 s is the target</p></li><li><p>28 archival scans and 261 verdict records repaired in place, nothing deleted</p></li></ul><h2><strong>The trial</strong></h2><p>30 days, 1,500 photos, 30 GB of storage including previews. Whichever runs out first ends the trial. Uploads pause at that point and nothing is removed; your gallery, critiques and downloads keep working. Ask and we can raise a cap on your existing account. No card is needed to start.</p><h2><strong>What is next</strong></h2><p>In roughly the order we expect to ship:</p><ul><li><p><strong>A &#8220;your shoot is ready&#8221; notification</strong>, email and in-app, so you can close the laptop after the upload completes and be told when the analysis is done. Today the first verdicts after an idle period wait about five and a half minutes for the AI to warm up; the target is 90 seconds (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/105">#105</a>). Broader in-app notifications follow (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/8">#8</a>).</p></li><li><p><strong>Near-duplicate detection</strong>, burst-aware, on top of the exact-duplicate check that is live (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/4">#4</a>)</p></li><li><p><strong>Curation that learns from you.</strong> Every Keeper and Skip on a Review frame is already recorded; the model of your taste that reads them is next (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/5">#5</a>)</p></li><li><p><strong>Content filters in search</strong> once every image carries scene, lighting and mood tags (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/72">#72</a>), and a relevance floor so weak semantic matches stop looking strong (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/74">#74</a>)</p></li><li><p><strong>Parjanya Vision phase 4</strong>: gear-specific advice that unlocks only when your own photos provide the evidence (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/100">#100</a>), and phase 5, genre for your older photos from stored embeddings without reprocessing (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/101">#101</a>)</p></li><li><p><strong>Self-serve payment</strong> (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/9">#9</a>), and <strong>burst covers</strong> that show the best frame rather than the middle one (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/92">#92</a>)</p></li><li><p><strong>The onboarding guide in more formats</strong>: a video walkthrough with voice-over is next (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/53">#53</a>)</p></li></ul><p>Everything, including the items we have not fixed yet, is public at <a href="https://github.com/JagadeeshRampam/parjanya-issues/issues">github.com/JagadeeshRampam/parjanya-issues</a>. Open and closed alike. The people who tested this deserved to see the list, and so do you.</p><h2><strong>Start</strong></h2><p>Onboarding guide, ten minutes start to finish: <a href="https://parjanya.phagyul.ai/guide.html?utm_source=blog&amp;utm_medium=referral&amp;utm_campaign=v2_public_launch_2026_09&amp;utm_content=release_notes">parjanya.phagyul.ai/guide.html</a></p><p>Create your account: <a href="https://parjanya.phagyul.ai/signup?utm_source=blog&amp;utm_medium=referral&amp;utm_campaign=v2_public_launch_2026_09&amp;utm_content=release_notes">parjanya.phagyul.ai/signup</a></p><p>For the pilot group of Experts across the world and my buddies: thank you again! &#128591;</p><p><em>Jagadeesh</em></p><div><hr></div><h2><strong>Engineering appendix (for readers who came for the systems)</strong></h2><p>Short entries; each has a longer post either published or drafted.</p><ul><li><p><strong>Why there is no score.</strong> The rule engine reads distortion <em>type and severity</em> (motion blur: heavy) rather than a numeric quality score. Scores compressed incompatible defects onto one axis and gave photographers nothing to act on. The model still emits one; the gate ignores it.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;06cc812c-04cf-4241-b164-69bf1db11431&quot;,&quot;caption&quot;:&quot;I did not set out to replace a scoring engine with a rule engine. I set out to make the system cheaper, easier to explain, and less fragile as I was not keen on moving to g5.xlarge or g6.xlarge due to prompt sizes increased and would be lot of churn in terms of architectural and infra changes, comes with re testing every functionality and the increase i&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;From Score Engine to Rule Engine: Why I Rebuilt the Decision Layer&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-14T11:27:06.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!UKjF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/from-score-engine-to-rule-engine&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:197643272,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></li><li><p><strong>Caching that never existed.</strong> The dashboards were designed against a response cache that was never provisioned in production, so every dashboard call recomputed. They now serve from a snapshot store warmed by an in-process loop; the admin pane, which took up to 29 seconds per range, answers in under a second (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/34">#34</a>).</p></li><li><p><strong>The month that weighed nothing.</strong> A field rename mid-July left usage attribution reading the old name <em>and</em> projecting only the old name from the database, so every image uploaded for a month contributed zero bytes to per-tenant attribution. The headline figure stayed right because it preferred a storage-measured value, which is exactly why nobody noticed. Lesson written down: a rename has to land in the projection too, and a test fixture that only builds one spelling cannot catch a rename (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/81">#81</a>).</p></li><li><p><strong>Idempotent email.</strong> Trial emails failed silently for three weeks after the flag went live because the execution role never received send permission, and a failed send was marked as delivered before it was attempted, so it could never retry. The rewrite is claim &#8594; send &#8594; confirm, with release on failure, and it is the helper every new notification now uses (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/88">#88</a>, <a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/89">#89</a>, <a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/104">#104</a>).</p></li><li><p><strong>Dedup that could eat a whole cluster.</strong> Symmetric concurrent rejection let every member of a duplicate cluster defer to another member that was also being discarded. Twelve images got no analysis. Survivors are now chosen by a total order, earliest wins (<a href="https://github.com/JagadeeshRampam/parjanya-issues/issues/97">#97</a>).</p></li><li><p><strong>TBIE.</strong> The reconciliation model behind all of this, Truth, Belief, Intent, Execution, has its own post: <em>From Pipeline to Platform</em>. The white paper is in draft.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;e7c4c65d-910e-43a0-9a0f-c6a6eebd4d1a&quot;,&quot;caption&quot;:&quot;Abstract&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;TBIE in Practice: Designing Resilient AI Pipelines That Recover, Reconcile, and Re-run&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-25T05:36:28.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!ok-g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/tbie-in-practice-designing-resilient&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:199145206,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></li><li><p><strong>From localhost friction to production-shaped architecture </strong></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;671aaaff-5c09-431f-b5a6-ed053cb614ee&quot;,&quot;caption&quot;:&quot;Lessons from Parjanya v2.0 and the v5.4 architecture revision&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;From localhost friction to production-shaped architecture&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-03T13:20:51.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!cfp7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11907347-42b7-499a-b390-f5d655628b58_1536x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/from-localhost-friction-to-production&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:196307889,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="2015" height="261" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:261,&quot;width&quot;:2015,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:704966,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/215603782?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ffabd3-6e9b-49ba-9891-fa9838947d9e_2103x748.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_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><p></p>]]></content:encoded></item><item><title><![CDATA[Price Is Only Half the Compute Problem]]></title><description><![CDATA[Why the right infrastructure decision is not &#8220;cheapest instance,&#8221; but the right capacity at the right price and the right time.]]></description><link>https://blog.phagyul.ai/p/price-is-only-half-the-compute-problem</link><guid isPermaLink="false">https://blog.phagyul.ai/p/price-is-only-half-the-compute-problem</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Mon, 24 Aug 2026 07:12:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Jqmt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jqmt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jqmt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Jqmt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Jqmt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Jqmt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jqmt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1436924,&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://blog.phagyul.ai/i/212492595?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.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_!Jqmt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Jqmt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Jqmt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Jqmt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eafb652-37e0-484e-9e16-1d6dc3e2219b_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>1. The morning I looked at the bill</h2><p>On May 3rd, I ran a cost audit on Parjanya&#8217;s AWS account because the number I&#8217;d been carrying in my head &#8212; <strong>&#8220;it&#8217;s cheap, it&#8217;s a GPU worker and some Lambdas&#8221;</strong> &#8212; didn&#8217;t match what Billing was showing me.</p><blockquote><p><strong>It wasn&#8217;t cheap.</strong></p></blockquote><p>The account was running at roughly <strong>$100/day</strong>, and GPU EC2 accounted for most of that at the time: <strong>57&#8211;65% of the bill</strong>. Two <code>g4dn.2xlarge</code> instances were running 24/7 on 100% on-demand capacity for our Qwen3-VL-8B image-quality worker.</p><p>Then I checked the launch template.</p><pre><code><code>"OnDemandPercentageAboveBaseCapacity": 100</code></code></pre><p>A hundred percent.</p><p>The Terraform module already supported Spot allocation. The <code>mixed_instances_policy</code> had been there since March. I simply hadn&#8217;t enabled it.</p><p>That is where a typical cloud-cost story might end: find the waste, flip the switch, move on.</p><p>But that only answered one question:</p><p><strong>Which pool should an instance come from?</strong></p><p>It took me much longer to ask the second:</p><p><strong>How many instances do I actually need?</strong></p><p>That second question turned out to matter even more.</p><h2>2. What I believed about Spot capacity &#8212; and what the data showed</h2><p>I had an assumption I&#8217;d never re-tested: GPU Spot capacity in Mumbai wasn&#8217;t reliable enough to build around.</p><p>That assumption was the reason the ASG had remained on-demand-only since March. It wasn&#8217;t really an oversight. It was an old decision that I hadn&#8217;t revisited.</p><p>So before changing anything, I pulled seven days of Spot price history across the GPU instance types we could realistically use:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O-F9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O-F9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!O-F9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!O-F9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!O-F9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O-F9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1303473,&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://blog.phagyul.ai/i/212492595?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.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_!O-F9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!O-F9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!O-F9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!O-F9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71cee81-1a21-4ba3-94c1-1c61c8a9b4c1_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The assumption hadn&#8217;t been unreasonable when I made it. It was simply stale.</p><p>By May, <code>g4dn.xlarge</code> Spot capacity was looking healthy across all three availability zones. <code>g5.xlarge</code> was a different story: better GPU capacity, but available in only two AZs.</p><p>Rather than rely entirely on historical pricing, I ran a live canary.</p><p>I switched the ASG to Spot, terminated two on-demand instances, and sent the same workload through both configurations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3tTz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3tTz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!3tTz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!3tTz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!3tTz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3tTz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1202403,&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://blog.phagyul.ai/i/212492595?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.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_!3tTz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!3tTz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!3tTz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!3tTz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d500ffc-cd2c-4d8a-8dda-148709511f63_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>The measured result was a 61% reduction in cost per unit of work.</strong></p><p>The important lesson wasn&#8217;t just about Spot.</p><p>The thing standing between me and that saving wasn&#8217;t a technical limitation. It was an assumption I had stopped questioning.</p><h2>3. Why I didn&#8217;t go 100% Spot</h2><p>Spot capacity can disappear with little warning.</p><p>Our worker also has a significant warm-up cost: pulling the container image and loading a roughly 17GB model. If an instance is reclaimed during warm-up, it produces no useful work.</p><p>So I didn&#8217;t want the entire fleet to depend on Spot availability.</p><p>The configuration became a combination of on-demand and Spot:</p><pre><code><code>gpu_instance_types       = ["g5.xlarge", "g4dn.xlarge"]
on_demand_base_capacity  = 4
on_demand_percentage     = 0
spot_allocation_strategy = "price-capacity-optimized"</code></code></pre><p>The idea is simple:</p><ul><li><p>Keep a small on-demand base as insurance.</p></li><li><p>Use Spot for everything above that base.</p></li><li><p>Let the fleet scale with demand without paying the full on-demand price for every instance.</p></li></ul><p>The on-demand base provides a floor that doesn&#8217;t depend on Spot availability. The Spot fleet provides most of the cost efficiency.</p><p>That combination turned out to be much more useful than thinking of Spot as an all-or-nothing decision.</p><h2>4. Widening the pool &#8212; then narrowing it again</h2><p>The next experiment was about the instance pool itself.</p><p>On July 9th, I saw several <code>g4dn.xlarge</code> Spot instances get reclaimed during warm-up. A pool containing only <code>g5.xlarge</code> and <code>g4dn.xlarge</code> was too narrow to absorb that pressure.</p><p>So I temporarily added:</p><ul><li><p><code>g4dn.2xlarge</code></p></li><li><p><code>g5.2xlarge</code></p></li></ul><p>These instances had the same GPUs as their xlarge counterparts but more CPU and RAM than the workload really needed.</p><p>I wasn&#8217;t buying additional GPU throughput.</p><p>I was buying <strong>capacity insurance</strong>.</p><p>The idea was that <code>price-capacity-optimized</code> could use the larger instances only when the cheaper pools were under pressure. In that situation, paying a little more for an instance that actually becomes available can be better than waiting for a cheaper instance that doesn&#8217;t exist.</p><p>I calculated the worst-case premium before enabling it. Across a 12,000-image batch, the additional cost would have been roughly <strong>$3</strong>.</p><p>That was an acceptable temporary trade-off.</p><p>On July 28th, I removed the 2xlarge types again.</p><p>The reason was straightforward: as a permanent configuration, paying for extra CPU and RAM that the GPU workload didn&#8217;t use wasn&#8217;t attractive.</p><p>The temporary insurance had done its job. Once the capacity pressure eased, the simpler pool made more sense.</p><p>This also exposed an important operational principle:</p><p><strong>A good configuration isn&#8217;t necessarily a permanent configuration.</strong></p><p>Sometimes the right response to a capacity problem is to widen your options temporarily, then narrow them again when the underlying conditions change.</p><h2>5. Two Spot capacity droughts</h2><p>The experiments also exposed the limits of Spot.</p><h3>July 9th</h3><p>Mumbai&#8217;s <code>g4dn</code> Spot capacity went dry across the region.</p><p>The fleet dropped from five instances to one during a 450-image batch.</p><p>No allocation strategy could solve that. There simply wasn&#8217;t enough Spot capacity available.</p><p>The on-demand base was what kept the workload alive, so I increased the base from one to three instances that afternoon.</p><h3>August 5th&#8211;7th</h3><p>This time the problem was <code>g5.xlarge</code>.</p><p>There was no Spot support in one of its two available AZs, while the other experienced an on-demand capacity gap.</p><p>There were three launch failures over three days.</p><p><code>price-capacity-optimized</code> was able to route around the problem by falling back to <code>g4dn.xlarge</code>, although the fallback introduced additional latency.</p><p>These two incidents changed how I think about Spot availability.</p><p>The answer isn&#8217;t simply that availability is &#8220;better&#8221; or &#8220;worse.&#8221;</p><p>It is better on average for some pools, but individual instance families can still experience significant capacity constraints.</p><p><strong>Spot is a probability and capacity-management problem, not just a pricing problem.</strong></p><h2>6. What changed when I moved to price-capacity-optimized</h2><p>There are two strategies that are easy to confuse:</p><p><code>capacity-optimized</code> chooses the Spot pool with the deepest available capacity. Price isn&#8217;t part of the primary decision.</p><p><code>price-capacity-optimized</code> considers both capacity availability and price, choosing among pools that have a reasonable likelihood of remaining available.</p><p>The distinction matters.</p><p>The May canary that produced the 61% cost reduction used <code>capacity-optimized</code>. I later moved to <code>price-capacity-optimized</code> on July 9th.</p><p>I don&#8217;t have a controlled, back-to-back experiment proving the exact dollar improvement from PCO. So I don&#8217;t want to manufacture one.</p><p>The decision was based on the allocation model and the observed capacity conditions rather than a clean A/B test.</p><p>That distinction matters when discussing infrastructure results:</p><p><strong>Measured results and engineering judgments are not the same thing.</strong></p><p>There was another useful discovery in the same change.</p><p>The Terraform module had an override issue that was silently alphabetizing the instance-type list rather than preserving the intended priority order.</p><p>So the configuration had effectively been saying one thing while the infrastructure was doing another.</p><p>It was a good reminder that infrastructure configuration needs the same level of testing and observability as application code.</p><h2>7. The bigger question: how many instances?</h2><p>This is where the more interesting problem appeared.</p><p>Until July 27th, both scale-up and scale-down used <code>SimpleScaling</code>.</p><p>The logic was effectively:</p><blockquote><p>Is the queue empty?</p></blockquote><p>If yes, scale down.</p><p>If no, scale up.</p><p>The problem is that this treats a queue containing 13 messages exactly like a queue containing 1,300 messages.</p><p>The system knew whether work existed.</p><p>It didn&#8217;t know <strong>how much work existed</strong>.</p><p>On July 27th, a small 13-image upload caused the fleet to scale to its maximum. Three of six instances processed nothing, and the timer-based scale-down took <strong>69 minutes</strong>.</p><p>The post-incident calculation showed approximately <strong>4.6 instance-hours</strong> spent for around 20 minutes of actual work.</p><p>The fix was to make scaling <strong>backlog-aware</strong>.</p><p>Instead of looking only at whether the queue was non-empty, the scaling logic now considers the combined backlog &#8212; visible and in-flight messages &#8212; and maps it to an explicit target fleet size:</p><pre><code><code>backlog     target

1&#8211;25        &#8594; 1 instance
25&#8211;100      &#8594; 2
100&#8211;500     &#8594; 4
500+        &#8594; maximum</code></code></pre><p>The policy also changed from incremental scaling to <strong>ExactCapacity</strong>.</p><p>Instead of saying:</p><blockquote><p>Add one instance.</p></blockquote><p>it says:</p><blockquote><p>The fleet should contain four instances.</p></blockquote><p>That difference is important.</p><p>Each scaling decision can converge directly on the desired fleet size rather than repeatedly increasing or decreasing the fleet one instance at a time.</p><p>In a later measured run, the same class of drain dropped from <strong>69 minutes to 4 minutes</strong>.</p><p>But I made another mistake.</p><p>On August 8th, I reduced every scaling band by half.</p><p>That worked for small batches. It also meant that a 108-image production run on August 11th stayed on one instance for roughly 50 minutes when a second instance could have provided useful parallelism after its warm-up period.</p><p>Three days later, I adjusted the bands again rather than reverting the entire change.</p><p>The lesson was bigger than the individual thresholds:</p><p><strong>Scaling needs to understand both price and workload depth.</strong></p><p>Choosing the right Spot pool answers:</p><blockquote><p>Which instance should I buy?</p></blockquote><p>Autoscaling answers:</p><blockquote><p>How many instances should I buy?</p></blockquote><p>Those are different optimization problems.</p><p>And I had spent months tuning the first one before realizing the second one was costing me more.</p><h2>8. Why this isn&#8217;t just a startup problem</h2><p>It&#8217;s easy to think of backlog-blind scaling as an early-stage infrastructure problem.</p><p>I don&#8217;t think it is.</p><p>Any system where demand arrives in bursts can have the same problem.</p><p>Consider:</p><ul><li><p>Batch customer onboarding</p></li><li><p>Large data imports</p></li><li><p>End-of-month reporting</p></li><li><p>Media processing</p></li><li><p>Scheduled analytics workloads</p></li><li><p>Seasonal traffic spikes</p></li><li><p>Any SaaS workload with uneven usage</p></li></ul><p>A presence-based alarm can tell you:</p><blockquote><p>There is work waiting.</p></blockquote><p>It cannot tell you:</p><blockquote><p>There are 20 messages versus 20,000 messages.</p></blockquote><p>Those situations require completely different capacity decisions.</p><p>The mechanism is general:</p><p><strong>Scaling decisions should consider the amount of work waiting, not just the existence of work.</strong></p><p>The exact thresholds will vary by system, but the principle applies broadly.</p><h2>9. What actually changed</h2><p>Here are the results I can measure and reproduce:</p><ul><li><p><strong>61% lower cost per unit of work</strong> in the Spot vs. on-demand canary.</p></li><li><p><strong>69 minutes &#8594; 4 minutes</strong> for a comparable production drain after moving to depth-aware ExactCapacity scaling.</p></li><li><p><strong>~4.6 instance-hours</strong> consumed by an inefficient scaling response to a small workload.</p></li><li><p><strong>~$3 maximum premium</strong> calculated for temporarily widening the Spot pool for a 12,000-image batch.</p></li><li><p><strong>3 launch failures over 3 days</strong> during the August <code>g5.xlarge</code> capacity issue.</p></li></ul><p>The longer-term Cost Explorer data tells a similar story.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1c9Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1c9Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!1c9Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!1c9Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!1c9Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1c9Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1147549,&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://blog.phagyul.ai/i/212492595?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.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_!1c9Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!1c9Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!1c9Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!1c9Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cbfb317-0862-4195-9d0d-c1e7d8448ed5_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Across the GPU hours recorded this year, on-demand averaged roughly <strong>$0.64/hour</strong>, while Spot averaged roughly <strong>$0.30/hour</strong> &#8212; about a <strong>53% discount</strong>.</p><p>For the 785 Spot hours recorded year-to-date, paying the blended on-demand rate would have cost approximately $505. Actual Spot spend was about $235.</p><p>That&#8217;s roughly <strong>$270 in measured savings from those Spot hours alone</strong>.</p><p>GPU EC2 has cost <strong>$967.85</strong> year-to-date against <strong>$6,637.43</strong> in total account spend through August 22 &#8212; roughly 15% of total spend.</p><p>The important point isn&#8217;t the exact percentage.</p><p>It is that the optimization moved from a simple:</p><blockquote><p>&#8220;Can I get cheaper GPU instances?&#8221;</p></blockquote><p>to a much broader question:</p><blockquote><p>&#8220;Am I buying the right capacity, from the right pool, for the amount of work actually waiting?&#8221;</p></blockquote><p>That is a much more useful infrastructure question.</p><h2>10. The bigger takeaway: price and capacity must be optimized together</h2><p>The biggest lesson from this exercise isn&#8217;t simply that Spot is cheaper than on-demand.</p><p>It is that <strong>price and capacity need to be considered together</strong>.</p><p><code>price-capacity-optimized</code> matters because the cheapest Spot instance isn&#8217;t necessarily the cheapest option if that capacity isn&#8217;t available &#8212; or is likely to be reclaimed. A slightly more expensive pool with better capacity can be the better economic choice when the alternative is waiting for capacity that may never arrive.</p><p>That is the real value of price-capacity optimization:</p><blockquote><p><strong>Don&#8217;t optimize for the lowest price. Optimize for the lowest viable cost of reliable capacity.</strong></p></blockquote><p>The distinction became particularly clear during the capacity droughts I encountered. No allocation strategy can create capacity that doesn&#8217;t exist, which is why the on-demand base remained important. But when multiple Spot pools were available, price-capacity-optimized gave the fleet a better way to balance <strong>availability and cost</strong> instead of treating either one in isolation.</p><p>There is, however, a second layer that is just as important.</p><p><code>price-capacity-optimized</code> answers:</p><blockquote><p><strong>Which capacity should I use?</strong></p></blockquote><p>Autoscaling answers:</p><blockquote><p><strong>How much capacity do I need?</strong></p></blockquote><p>Those are separate problems.</p><p>The configuration that ultimately worked for me brought both together:</p><ol><li><p><strong>Keep an on-demand base</strong> as protection against a complete Spot capacity shortage.</p></li><li><p><strong>Use price-capacity-optimized Spot allocation</strong> to balance price and capacity across viable pools.</p></li><li><p><strong>Keep multiple instance options available when capacity is constrained</strong>, but avoid permanently paying for resources the workload doesn&#8217;t actually use.</p></li><li><p><strong>Scale based on backlog depth</strong>, rather than simply checking whether work exists.</p></li><li><p><strong>Use ExactCapacity targets</strong> so the fleet converges directly on the capacity the workload needs.</p></li></ol><p>This changed how I think about compute optimization.</p><p>The goal isn&#8217;t to find the cheapest instance.</p><p>It isn&#8217;t even to find the cheapest Spot pool.</p><p>The goal is to find the <strong>right amount of reliable capacity at the lowest practical cost</strong>.</p><p>That is what <code>price-capacity-optimized</code> ultimately taught me: <strong>price optimization without capacity awareness is incomplete, and capacity optimization without workload awareness can still waste money.</strong></p><p>The real optimization happens when all three line up:</p><div class="pullquote"><p><strong>the right pool &#8594; the right price &#8594; the right amount of capacity.</strong></p></div><h2>11. The connection to context engineering</h2><p>This is where this experiment connects with the earlier post on <a href="https://blog.phagyul.ai/p/context-engineering-and-context-debt">Context Engineering and Context Debt</a>.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;05e4d326-96cf-4690-8668-43d553ed1e78&quot;,&quot;caption&quot;:&quot;TL;DR: I noticed Haiku 4.5 being spawned as a subagent during an Opus 4.7 session. That observation opened a data investigation that revealed ~77% of my token spend was context accumulation waste, not productive reasoning. This is the framework I built to fix it &#8212; and the problem has a name:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Context Engineering and Context Debt&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-20T06:06:57.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!dA7S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/context-engineering-and-context-debt&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:198514119,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>The two problems look different, but the underlying optimization pattern is surprisingly similar.</p><p>In context management, you have to decide:</p><p><strong>Which information belongs in the context?</strong></p><p>Then separately:</p><p><strong>How much context should the model actually carry?</strong></p><p>The GPU fleet has the same two layers.</p><p><strong>Price-capacity-optimized</strong> answers:</p><blockquote><p>Which pool should the instance come from?</p></blockquote><p><strong>Depth-aware scaling</strong> answers:</p><blockquote><p>How many instances does the workload justify?</p></blockquote><p>Getting the first decision right doesn&#8217;t automatically make the second one right.</p><p>That was the mistake I made.</p><p>I optimized the price and availability of each unit without first asking whether I needed that many units.</p><p>The same pattern appears in context management: a good retrieval strategy can still become expensive if the context budget itself isn&#8217;t being managed.</p><p>The broader lesson for me is simple:</p><p><strong>Optimization is rarely one decision. It is usually a stack of decisions.</strong></p><p>You can optimize the individual resource and still waste money because you&#8217;re using too much of it.</p><p>You can optimize the model and still waste tokens because you&#8217;re sending too much context.</p><p>You can optimize the database query and still waste resources because you&#8217;re running it too many times.</p><p>The useful question is therefore not just:</p><blockquote><p>&#8220;What&#8217;s the cheapest way to do this?&#8221;</p></blockquote><p>It is:</p><blockquote><p><strong>&#8220;What is the minimum amount of the right resource needed to do this reliably?&#8221;</strong></p></blockquote><p>That is the question I should have asked much earlier.</p><div><hr></div><p><em>Configuration referenced in this post reflects the production setup as of August 12, 2026. Cost figures are based on a Cost Explorer pull covering January 1 through August 22, 2026.</em></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup?utm_source=substack.com" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jtmq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b58187f-f338-4a63-800a-88ecfa455087_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!jtmq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b58187f-f338-4a63-800a-88ecfa455087_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!jtmq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b58187f-f338-4a63-800a-88ecfa455087_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!jtmq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b58187f-f338-4a63-800a-88ecfa455087_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jtmq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b58187f-f338-4a63-800a-88ecfa455087_2015x261.png" width="2015" height="261" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b58187f-f338-4a63-800a-88ecfa455087_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:261,&quot;width&quot;:2015,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:704966,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup?utm_source=substack.com&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jtmq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b58187f-f338-4a63-800a-88ecfa455087_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!jtmq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b58187f-f338-4a63-800a-88ecfa455087_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!jtmq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b58187f-f338-4a63-800a-88ecfa455087_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!jtmq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b58187f-f338-4a63-800a-88ecfa455087_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><p></p>]]></content:encoded></item><item><title><![CDATA[N+1 Without an ORM: The Hidden Cost of Extra Round Trips]]></title><description><![CDATA[How we found duplicate DynamoDB reads, unbatched CloudWatch calls, and a cache that quietly wasn&#8217;t there]]></description><link>https://blog.phagyul.ai/p/n1-without-an-orm-the-hidden-cost</link><guid isPermaLink="false">https://blog.phagyul.ai/p/n1-without-an-orm-the-hidden-cost</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Tue, 18 Aug 2026 05:50:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JHtk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Problem, in One Sentence</h2><p>The N+1 query problem is what happens when fetching N items costs you N+1 round trips to a data store instead of one &#8212; and it is, without much competition, one of the most common performance bugs I see in software that talks to a database.</p><p>I want to write about it here not because we hit the textbook version. We didn&#8217;t. What we ran into while building a new feature for <a href="https://parjanya.phagyul.ai">Parjanya</a> were two close cousins of N+1, caught at different points in the same week.</p><p>What made the experience worth writing about was the pattern-matching involved. Once I started asking <em><strong>&#8220;how many times does this data actually need to leave the system?&#8221;</strong></em> rather than just <em><strong>&#8220;does this code work?&#8221;</strong></em>, both problems became much easier to see.</p><p>I think that is a useful engineering habit for anyone building on top of an ORM, a NoSQL table, or a cloud API with a batch endpoint nobody on the team has used yet.</p><h2>Why N+1 Gets Its Own Name</h2><p>Picture the canonical example, the one I have either written or fixed more times than I&#8217;d like to admit: I load a list of blog posts, then loop over them to print each author&#8217;s name.</p><pre><code><code>posts = Post.objects.all()          # 1 query
for post in posts:
    print(post.author.name)         # N queries &#8212; one per post</code></code></pre><p>One query becomes N+1 queries.</p><p>With 10 posts, that&#8217;s mildly wasteful. With 10,000 posts loaded on an admin page, it can be the difference between a 200ms response and a request that never comes back.</p><p>Once I started looking for the shape rather than the syntax, I found it everywhere: a GraphQL resolver fetching a <code>Book</code> per <code>Author</code> node instead of batching with a <code>DataLoader</code>; a Rails view calling <code>.comments.count</code> inside an <code>each</code> block; a microservice calling <code>GET /users/:id</code> once per row instead of <code>POST /users/batch</code>.</p><p>Different stacks, same root cause &#8212; a per-item operation standing in for a single query or batch operation the data layer was perfectly capable of running.</p><p>What makes N+1 worth having a name of its own, rather than simply calling it &#8220;a slow endpoint,&#8221; is <em>how</em> it hides.</p><p>The loop looks correct in code review. It <em>is</em> correct &#8212; just expensive.</p><p>Unit tests don&#8217;t necessarily expose it either. A fixture with three rows produces three extra queries, but nobody notices when the entire test takes 40ms.</p><p>It usually becomes visible only with real data volume: a production dashboard gets slower, a support ticket says a page &#8220;used to be fast,&#8221; and by then the same pattern has often been copied into two other endpoints.</p><p>That&#8217;s why I care about catching this class of problem early. The fix can be a five-line change when I catch it during design or review. Once the data has grown into the architecture, the same fix can become a multi-file refactor with a production incident attached.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JHtk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JHtk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JHtk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JHtk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JHtk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JHtk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1803223,&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://blog.phagyul.ai/i/211664136?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.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_!JHtk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JHtk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JHtk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JHtk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe80b2372-63ef-40bf-9f08-e375bb2b8a01_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Our Version Wasn&#8217;t the Textbook Case &#8212; Which Is Exactly the Point</h2><p>At <a href="https://parjanya.phagyul.ai">Parjanya</a>, we don&#8217;t run a traditional ORM &#8212; no ActiveRecord, no Django QuerySets, no lazy-loaded relationships waiting to surprise us.</p><p>Our data layer is DynamoDB, queried directly, with explicit <code>asyncio.gather</code> calls instead of implicit lazy loading.</p><p>At first glance, that seems like it should rule out N+1 entirely. Nothing is silently issuing a query behind a property access.</p><p>It doesn&#8217;t.</p><p>It just changes the shape of the problem.</p><p>We found two variants in the same week while building the same feature, and neither looked anything like the classic blog-posts-and-authors example.</p><h3>Cousin #1: The Same Partition, Fetched Twice by Two Honest Code Paths</h3><p>In mid-July, we built <code>GET /api/v1/admin/dashboard</code> &#8212; a cross-tenant operations view for Parjanya: pipeline health, queue depth, GPU fleet state, reconciler activity, and a per-tenant usage/cost table, all on one screen for whoever&#8217;s on call.</p><p>Two of those blocks needed the same underlying data.</p><p>The pipeline-health block needed every tenant&#8217;s image records to compute stale-pending buckets.</p><p>The per-tenant table needed the <em>same</em> tenant&#8217;s image records to compute that tenant&#8217;s usage numbers &#8212; through <code>UsageMetricsService.build_dashboard</code>, a method that already existed and already queried DynamoDB for exactly this.</p><p>The straightforward implementation would have called <code>build_dashboard</code> once per tenant, which queries that tenant&#8217;s image partition, and then separately queried the same partition again to build the pipeline block.</p><p>For T tenants, that meant 2T DynamoDB queries against partitions we only needed to read once each.</p><p>There was no obvious <code>for tenant_id in tenant_ids: await fetch(tenant_id)</code> loop. Nothing screamed &#8220;N+1.&#8221;</p><p>Instead, I had two well-intentioned pieces of code, written for two different sections of the same page, each doing the right thing in isolation and the wrong thing together.</p><p>We caught it before it merged by asking the same question the textbook N+1 case teaches us to ask:</p><p><em>How many times does this data actually need to leave DynamoDB?</em></p><p>The answer was once.</p><p>So we fetched it once:</p><pre><code><code># One image-field fetch per tenant, shared by the pipeline block AND
# the per-tenant usage dashboards (build_dashboard accepts prefetched
# images) &#8212; avoids double-charging the DDB partitions.
images_by_tenant = await self._fetch_images(tenant_ids, attention)

results = await asyncio.gather(
    self._pipeline_block(images_by_tenant, days, now),
    ...
    self._tenants_block(tenant_configs, images_by_tenant, days, now, email_by_tenant),
    return_exceptions=True,
)</code></code></pre><p>Then I changed <code>build_dashboard</code> so it could accept data the caller had already fetched instead of insisting on fetching it again:</p><pre><code><code>async def build_dashboard(
    self,
    tenant_id: str,
    days: int,
    images: list[dict[str, Any]] | None = None,
) -&gt; UsageDashboardResponse:
    """Build the dashboard; ``images`` lets callers that already fetched
    the tenant's image fields (admin dashboard) avoid a second query."""
    if images is None:
        images = await self.db.query_image_usage_fields(tenant_id)</code></code></pre><p>One parameter. One shared dictionary threaded through two call sites.</p><p>2T queries became T.</p><p>There is an important detail here that I think is easy to miss.</p><p>We didn&#8217;t make the T queries sequential. They still run concurrently through <code>asyncio.gather</code>, one per tenant.</p><p>That distinction matters because concurrency can fool me into thinking I&#8217;ve fixed the problem.</p><p>Concurrency hides N+1&#8217;s <strong>latency</strong> cost.</p><p>T parallel queries can sometimes return in roughly the time of one query.</p><p>But concurrency does nothing to reduce the <strong>volume</strong> cost.</p><p>I&#8217;m still paying for T reads against T partitions. I&#8217;m still consuming T times the read capacity. And I&#8217;m still one slow or misbehaving tenant away from holding up the batch.</p><p>A parallel N+1 is faster to run and just as expensive to pay for.</p><p>The fix that matters is cutting the fetch count, not merely parallelizing it.</p><h3>Cousin #2: An API With a Batch Endpoint You Forgot Existed</h3><p>The same dashboard also needed CloudWatch metrics &#8212; reconciler activity across five pipeline stages times four counters each, giving us 20 data series, SQS queue ages for up to three queues, and GPU fleet throughput.</p><p>The naive implementation would have made a <code>get_metric_data</code> call per series.</p><p>That&#8217;s 20 calls for the reconciler block alone, plus one per queue, plus one for fleet throughput.</p><p>Every one of those is a network round trip. Every one is a CloudWatch API call subject to its own rate limits. Every one has its own chance to fail independently in the middle of the request.</p><p>This is probably the most common shape of N+1&#8217;s cousin that I now look for: not a data-modeling problem, but a case where I forgot that the SDK already has a native batch primitive for exactly what I&#8217;m trying to do.</p><p><code>boto3</code>&#8216;s CloudWatch client accepts a list of <code>MetricDataQueries</code> in a single <code>get_metric_data</code> call &#8212; up to 500 of them &#8212; and returns the results together.</p><p>So I built one small helper around that and used it everywhere we needed metrics:</p><pre><code><code>async def _get_metric_data(
    self, queries: list[dict[str, Any]], start: datetime, end: datetime
) -&gt; dict[str, float]:
    """One batched GetMetricData; returns {query_id: latest/sum value}."""
    resp = self.cloudwatch.get_metric_data(
        MetricDataQueries=queries, StartTime=start, EndTime=end,
        ScanBy="TimestampDescending",
    )
    ...</code></code></pre><p>The reconciler block builds all 20 queries &#8212; 5 stages &#215; 4 metrics &#8212; as one list and makes one call.</p><p>The queue-age lookup builds one query per queue and makes one call.</p><p>Fleet throughput reuses the same helper.</p><p>Twenty-some potential round trips collapsed into three calls for the whole dashboard build: one per logical block, not one per metric.</p><p>And I didn&#8217;t want the batching optimization to compromise resilience.</p><p>We kept the per-tenant and per-block exception isolation through <code>asyncio.gather(..., return_exceptions=True)</code>.</p><p>That means one broken AWS permission or one tenant&#8217;s bad data can still degrade that panel to a <code>signal_unavailable</code> note instead of taking down the entire request.</p><p>For me, that&#8217;s an important architectural point: batching and graceful degradation aren&#8217;t in tension. I just have to design for both instead of treating &#8220;make it one call&#8221; as permission to let one failure take down everything.</p><p>Both of these changes shipped in the same commit, <code>feat(admin): per-environment admin dashboard API</code>, alongside 11 new tests.</p><p>Neither would have shown up on a code-review checklist that only asked, <em>&#8220;Is there a loop calling the database?&#8221;</em></p><p>The first problem was two separate, individually-correct code paths.</p><p>The second was a missed SDK capability.</p><p>The habit that catches both is the same habit that catches classic N+1:</p><p><strong>Before I merge anything that talks to a data store or external API more than once, I want to know exactly how many round trips it costs and whether that number scales with something that&#8217;s about to grow.</strong></p><h2>The Sequel: Batched Isn&#8217;t the Same as Cached</h2><p>This is actually the part of the story I find most useful, because from the outside it looked like we&#8217;d already solved the problem.</p><p>Four days after that commit, I was checking why admin dashboard loads still felt sluggish when we found this:</p><blockquote><p><em>Verified live: no ElastiCache exists in any deployed environment (zero clusters, no VALKEY_* env vars), so ValkeyCache silently no-ops and every dashboard load was a full rebuild (~29s admin builds, a Cost Explorer call per view).</em></p></blockquote><p>We had designed the endpoint to be cached.</p><p>There was a <code>ValkeyCache</code> layer wired in from the start, a 3-minute TTL, and the whole shape of what looked like a normal caching story.</p><p>What we hadn&#8217;t verified was the one thing that mattered:</p><p><strong>Did the cache actually exist in any running environment?</strong></p><p>It didn&#8217;t.</p><p>ElastiCache had never been provisioned.</p><p>Every cache read quietly missed, every single time.</p><p>That meant every dashboard view was re-running the entire fan-out we&#8217;d just finished optimizing: T parallel DynamoDB queries, three batched-but-not-free CloudWatch calls, and a Cost Explorer call none of us wanted running on every page load.</p><p>We had reduced the number of round trips per build from something like 2T+20 down to T+3.</p><p>And then we paid that reduced-but-still-real cost on every request because nothing was actually skipping the build.</p><p>That was the moment the distinction became very clear to me:</p><p><strong>Fixing N+1-shaped fan-out is necessary, but it isn&#8217;t sufficient if the whole expensive operation still runs on every request.</strong></p><p>A cache I haven&#8217;t verified in a running environment is, for all practical purposes, no cache.</p><p>And an unverified cache in front of a well-batched N+1 fix just means I&#8217;m repeatedly paying a smaller bill instead of a larger one.</p><p>The real fix didn&#8217;t require adding another managed service.</p><p>Instead, we used what we already had &#8212; the images table and the long-running ECS task &#8212; rather than depending on infrastructure that had quietly never existed:</p><ul><li><p>A <code>SnapshotStore</code> writes gzip&#8217;d JSON dashboard snapshots into DynamoDB itself, with a read-time <code>expires_at</code> and a fail-open contract. Any DynamoDB hiccup degrades to a cache miss, which is just today&#8217;s behavior, never worse.</p></li><li><p>A background warmer, running in the API process&#8217;s own lifespan, rebuilds the admin snapshot on a roughly 4-minute cadence and each tenant&#8217;s usage snapshot every 8 hours. We chose those cadences based on how often the underlying signals actually change, rather than picking arbitrary TTLs.</p></li><li><p>The Cost Explorer block gets its own 8-hour snapshot inside the costs block, since Cost Explorer data itself only refreshes a few times a day. That takes it from roughly one call per view to roughly three calls a day.</p></li><li><p>Both <code>/usage/dashboard</code> and <code>/admin/dashboard</code> now serve snapshots by default, with an explicit <code>refresh=true</code> escape hatch for anyone who genuinely needs the live number.</p></li></ul><p>Nobody waits on a cold build anymore.</p><p>And, just as importantly, nobody is silently re-running a 29-second, multi-block AWS fan-out every time someone opens a browser tab.</p><h2>Why Catching This Early Mattered More Than Usual, Here</h2><p><a href="https://parjanya.phagyul.ai">Parjanya</a> launched to its first self-serve trial cohort on 1st August.</p><p>Both fixes &#8212; the shared-fetch deduplication and batched metrics, followed by the snapshot cache that replaced a cache that never actually existed &#8212; landed before that date, while tenant counts were still near zero and nobody outside the team was looking at the admin dashboard.</p><p>That timing is the whole argument for dealing with N+1-shaped problems early.</p><p>At near-zero scale, 2T queries and T queries cost about the same amount of nothing.</p><p>A 29-second rebuild on every page view is merely annoying when I&#8217;m the only engineer clicking refresh.</p><p>None of this was a production incident.</p><p>But I could see exactly how it would become one.</p><p>As tenant count and dashboard traffic grew, the fan-out cost would scale linearly with exactly the number a growing SaaS product is supposed to grow.</p><p>The phantom-cache cost would scale linearly with exactly the traffic a real launch is supposed to bring.</p><p>We found both by asking a very simple question while the answer was still cheap to change:</p><p><strong>How many round trips does this cost, and does that number grow with our own success?</strong></p><p>I&#8217;d much rather answer that question before customers force me to.</p><h2>What I&#8217;d Tell a Team Building This Kind of Thing</h2><p><strong>Ask the round-trip question before merge, not after a slow-page complaint.</strong></p><p>For any code that touches a database or an external API more than once per request, I ask explicitly: how many round trips does this cost today, and what does that number scale with?</p><p>If the answer is &#8220;the number of tenants&#8221; or &#8220;the number of rows on this page,&#8221; that&#8217;s the moment to fix it &#8212; not a note for later.</p><p><strong>A loop isn&#8217;t required for N+1&#8217;s cousins to exist.</strong></p><p>Our duplicate-fetch case had no <code>for tenant_id in tenant_ids: await fetch(tenant_id)</code> shape at all.</p><p>It was two separately-written, individually-reasonable code paths that happened to want the same data.</p><p>I now watch for that pattern specifically: two features, built at different times, that each independently fetch &#8220;this tenant&#8217;s records&#8221; without either one knowing the other exists.</p><p><strong>Check whether your SDK already has a batch verb before writing the loop.</strong></p><p>CloudWatch&#8217;s <code>GetMetricData</code> takes a list.</p><p>So does DynamoDB&#8217;s <code>BatchGetItem</code>.</p><p>So do many well-designed cloud APIs from the last decade.</p><p>The fix for &#8220;N calls instead of one&#8221; is very often not custom code.</p><p>It is reading one more section of the SDK documentation.</p><p><strong>Concurrency is not the same fix as batching.</strong></p><p><code>asyncio.gather</code> over N calls is faster than N sequential calls, and it is <em>still</em> N calls.</p><p>It hides the latency symptom without touching the cost or capacity symptom.</p><p>I don&#8217;t want a parallel version of the bug to pass code review as if it were the batched version.</p><p><strong>A cache is a claim, not a fact, until I&#8217;ve verified it in every running environment.</strong></p><p>The most expensive line in this whole story wasn&#8217;t a query.</p><p>It was an unprovisioned ElastiCache cluster that let a caching layer silently no-op for days while looking, in every log line and every code review, exactly like it was working.</p><p>If I can&#8217;t point to the cache-hit rate on a dashboard, I don&#8217;t want to assume the cache is working.</p><p>I want to verify it.</p><p><strong>Small scale is when this is cheap to fix, not evidence that it doesn&#8217;t need fixing.</strong></p><p>The version of this bug that costs nothing to run also costs almost nothing to fix.</p><p>The version that ships to production and grows with user count is the same bug, several engineer-days more expensive, with a support ticket attached.</p><div><hr></div><p><em><a href="https://parjanya.phagyul.ai">Parjanya</a> is the multi-tenant image QA platform we&#8217;re building at <a href="https://phagyul.ai/">Phagyul</a> for professional photographers. If your team has its own N+1 cousins &#8212; duplicate fetches across features that don&#8217;t know about each other, unbatched calls to an API that quietly supports batching, caches that looked wired but weren&#8217;t &#8212; I&#8217;d love to compare notes.</em></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup?utm_source=substack.com" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup?utm_source=substack.com&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><p></p>]]></content:encoded></item><item><title><![CDATA[From Managed Services to Primitives (DX vs DIY)]]></title><description><![CDATA[What Building Parjanya v2.0 Taught Me About Managed Platforms, Self-Hosted AI, and Owning the Right Abstractions]]></description><link>https://blog.phagyul.ai/p/from-managed-services-to-primitives</link><guid isPermaLink="false">https://blog.phagyul.ai/p/from-managed-services-to-primitives</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Mon, 17 Aug 2026 04:37:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JqNv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JqNv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JqNv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JqNv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JqNv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JqNv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JqNv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d239184d-a5bd-445c-915e-68382df98afb_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1913288,&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://blog.phagyul.ai/i/211508956?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.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_!JqNv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JqNv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JqNv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JqNv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239184d-a5bd-445c-915e-68382df98afb_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A few months ago, I wrote a short note arguing that developer-experience platforms are excellent at velocity, but that AI systems demand a different kind of architectural thinking.</p><div class="comment" data-attrs="{&quot;url&quot;:&quot;https://open.substack.com/&quot;,&quot;commentId&quot;:223754757,&quot;comment&quot;:{&quot;id&quot;:223754757,&quot;date&quot;:&quot;2026-03-06T04:28:57.360Z&quot;,&quot;edited_at&quot;:null,&quot;body&quot;:&quot;DX vs DIY in the AI Era\n\nManaged developer experience platforms are great for velocity.\n\n\n\n\n\nPreview environments\n\n\n\nZero-config deployments\n\n\n\nEdge functions.\n\nBut in AI systems, the trade-offs change.\n\nA simple architectural shortcut can silently turn into AI debt:\n\n\n\n\n\nrunaway inference cost\n\n\n\nreproducibility gaps\n\n\n\ngovernance risk\n\n\n\ndebugging complexity across distributed edge nodes\n\nOne pattern that works well is what I call an AI-safe hybrid architecture:\n\nUse the edge as a traffic director, not a compute executor.\n\nStatic assets and lightweight routing can live at the edge.\n\nBut keep these centralized:\n\n\n\n\n\nauthentication model resolution\n\n\n\ninference execution\n\n\n\ntelemetry and logging\n\nThis keeps cost, lineage, and governance under control.\n\nThe real enabler behind this is unified engineering.\n\nSmall cross-functional teams that understand frontend, backend, and infrastructure can reason about the full system &#8212; and prevent architectural drift.\n\nDX where it helps. Control where it matters.\n\nThe organizational pattern is unified engineering: small platform teams own CI &#8594; CDN &#8594; inference and rotate engineers across layers so decisions are informed end-to-end.\n\nfrom personal experience as L6 Engineering Lead at Amazon and from the tech blogs of Netflix, and Google what I have learned, as well an interesting contrasting case study at Cloudflare used Edge \n\n\n\n\n\nNetflix &#8212; edge for delivery, region for logic\n\nNetflix designs its content delivery and playback stack to reduce origin load (CDN caches, client-side playback intelligence). They keep complex, stateful logic and billing/governance centralized (accounting, personalization models, recommendation scoring pipelines are resolved and served from control planes rather than being executed indiscriminately at edge nodes). The goal: global responsiveness with centralized control of heavy compute and data lineage.\n\nPattern to note: aggressive caching + client intelligence, regional/trusted control plane for personalization/inference.\n\n\n\n\n\nGoogle &amp; Amazon Web Services &#8212; unified platform culture\n\nAt the largest scale, Google and AWS set examples of platform thinking: SRE/platform teams codify deployment patterns, guardrails, and observability. Teams owning product features lean on platform primitives (IAM, KMS, managed registries) rather than inventing bespoke workflows. For ML, both invest heavily in model governance tooling (registries, metadata, reproducible pipelines) and encourage centralization of expensive compute.\n\nPattern to note: platform teams + standardized primitives reduce drift and enable fast, safe scaling.\n\nAlso, a contrasting case study and intentional by Cloudflare\n\n\n\n\n\nCloudflare &#8212; edge-native capabilities\n\nCloudflare&#8217;s stack is deliberately edge-native: Workers, KV, and global routing enable running meaningful compute at POPs. That capability is powerful for low-latency personalization and caching, but it also requires disciplined use when you&#8217;re serving ML-backed features &#8212; otherwise you risk global fan-out of expensive inference.\n\nPattern to note: edge compute is powerful; use it for safe, stateless ops or extremely lightweight personalization &#8212; not for heavy inference unless you have strong disciple in terms of setting limits &amp; cost controls.\n\nTo summarise,\n\nLarge, well-engineered platforms (think Netflix and Uber) treat the edge as a traffic director, not a compute engine: aggressive caching and lightweight client/edge logic for responsiveness, with heavy stateful work &#8212; auth, model resolution, inference, and telemetry &#8212; resolved in a centralized control plane. That pattern preserves developer velocity where it matters while keeping inference cost, reproducibility, and governance tightly controlled. The organizational enabler is unified engineering: small platform teams that own CI &#8594; CDN &#8594; inference and rotate engineers across layers so the system evolves with discipline rather than accreting accidental AI debt.&quot;,&quot;body_json&quot;:{&quot;type&quot;:&quot;doc&quot;,&quot;attrs&quot;:{&quot;schemaVersion&quot;:&quot;v1&quot;},&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;DX vs DIY in the AI Era&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Managed developer experience platforms are great for velocity.&quot;}]},{&quot;type&quot;:&quot;bulletList&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Preview environments&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Zero-config deployments&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Edge functions.&quot;}]}]}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;But in AI systems, the trade-offs change.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;A simple architectural shortcut can silently turn into &quot;},{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;AI debt&quot;},{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;:&quot;}]},{&quot;type&quot;:&quot;bulletList&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;runaway inference cost&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;reproducibility gaps&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;governance risk&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;debugging complexity across distributed edge nodes&quot;}]}]}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;One pattern that works well is what I call an &quot;},{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;AI-safe hybrid architecture&quot;},{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;:&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Use the edge as a &quot;},{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;traffic director&quot;},{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;, not a compute executor.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Static assets and lightweight routing can live at the edge.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;But keep these centralized:&quot;}]},{&quot;type&quot;:&quot;bulletList&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;authentication model resolution&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;inference execution&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;telemetry and logging&quot;}]}]}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;This keeps cost, lineage, and governance under control.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;The real enabler behind this is &quot;},{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;unified engineering&quot;},{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Small cross-functional teams that understand frontend, backend, and infrastructure can reason about the full system &#8212; and prevent architectural drift.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;DX where it helps. Control where it matters.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;The organizational pattern is &quot;},{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;unified engineering&quot;},{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;: small platform teams own CI &#8594; CDN &#8594; inference and rotate engineers across layers so decisions are informed end-to-end.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;from personal experience as L6 Engineering Lead at Amazon and from the tech blogs of Netflix, and Google what I have learned, as well an interesting contrasting case study at Cloudflare used Edge &quot;}]},{&quot;type&quot;:&quot;orderedList&quot;,&quot;attrs&quot;:{&quot;start&quot;:1,&quot;type&quot;:null},&quot;content&quot;:[{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;Netflix &#8212; edge for delivery, region for logic&quot;}]}]}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Netflix designs its content delivery and playback stack to reduce origin load (CDN caches, client-side playback intelligence). They keep complex, stateful logic and billing/governance centralized (accounting, personalization models, recommendation scoring pipelines are resolved and served from control planes rather than being executed indiscriminately at edge nodes). The goal: global responsiveness with centralized control of heavy compute and data lineage.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;Pattern to note:&quot;},{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot; aggressive caching + client intelligence, regional/trusted control plane for personalization/inference.&quot;}]},{&quot;type&quot;:&quot;orderedList&quot;,&quot;attrs&quot;:{&quot;start&quot;:2,&quot;type&quot;:null},&quot;content&quot;:[{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;Google &amp; Amazon Web Services &#8212; unified platform culture&quot;}]}]}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;At the largest scale, Google and AWS set examples of platform thinking: SRE/platform teams codify deployment patterns, guardrails, and observability. Teams owning product features lean on platform primitives (IAM, KMS, managed registries) rather than inventing bespoke workflows. For ML, both invest heavily in model governance tooling (registries, metadata, reproducible pipelines) and encourage centralization of expensive compute.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;Pattern to note:&quot;},{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot; platform teams + standardized primitives reduce drift and enable fast, safe scaling.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;italic&quot;}],&quot;text&quot;:&quot;Also, a contrasting case study and intentional by Cloudflare&quot;}]},{&quot;type&quot;:&quot;orderedList&quot;,&quot;attrs&quot;:{&quot;start&quot;:3,&quot;type&quot;:null},&quot;content&quot;:[{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;Cloudflare &#8212; edge-native capabilities&quot;}]}]}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Cloudflare&#8217;s stack is deliberately edge-native: Workers, KV, and global routing enable running meaningful compute at POPs. That capability is powerful for low-latency personalization and caching, but it also requires disciplined use when you&#8217;re serving ML-backed features &#8212; otherwise you risk global fan-out of expensive inference.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;Pattern to note:&quot;},{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot; edge compute is powerful; use it for safe, stateless ops or extremely lightweight personalization &#8212; not for heavy inference unless you have strong disciple in terms of setting limits &amp; cost controls.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;To summarise,&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Large, well-engineered platforms (think Netflix and Uber) treat the edge as a &quot;},{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;italic&quot;}],&quot;text&quot;:&quot;traffic director&quot;},{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;, not a compute engine: aggressive caching and lightweight client/edge logic for responsiveness, with heavy stateful work &#8212; auth, model resolution, inference, and telemetry &#8212; resolved in a centralized control plane. That pattern preserves developer velocity where it matters while keeping inference cost, reproducibility, and governance tightly controlled. The organizational enabler is unified engineering: small platform teams that own CI &#8594; CDN &#8594; inference and rotate engineers across layers so the system evolves with discipline rather than accreting accidental AI debt.&quot;}]}]},&quot;restacks&quot;:0,&quot;reaction_count&quot;:0,&quot;children_count&quot;:0,&quot;attachments&quot;:[{&quot;id&quot;:&quot;c1a8951d-2079-499f-a5b5-af42dac3dd31&quot;,&quot;type&quot;:&quot;image&quot;,&quot;imageUrl&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8339661b-c38e-4720-8c44-d62e24d426fb_1024x1536.png&quot;,&quot;imageWidth&quot;:1024,&quot;imageHeight&quot;:1536,&quot;explicit&quot;:false}],&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;user_id&quot;:12091074,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;user_bestseller_tier&quot;:null,&quot;userStatus&quot;:{&quot;bestsellerTier&quot;:null,&quot;subscriberTier&quot;:1,&quot;leaderboard&quot;:null,&quot;vip&quot;:false,&quot;badge&quot;:{&quot;type&quot;:&quot;subscriber&quot;,&quot;tier&quot;:1,&quot;accent_colors&quot;:null},&quot;subscriber&quot;:null}},&quot;source&quot;:null,&quot;forumChannel&quot;:null}" data-component-name="CommentPlaceholder"></div><p>My argument was that convenient shortcuts can eventually accumulate into what I called <strong>AI debt</strong>: runaway costs, reproducibility gaps, and debugging opacity.</p><p>That argument was written from conviction.</p><p>This one is written from production.</p><p>I launched <strong><a href="https://parjanya.phagyul.ai">Parjanya v2.0</a></strong>, our multi-tenant SaaS platform for professional photographers, as a self-serve trial on 1st August 2026. </p><div class="pullquote"><p>Under the hood, it runs a self-hosted 8B-parameter vision-language model, Qwen3-VL-8B in 4-bit quantization, alongside Google&#8217;s SigLIP 2 for semantic-search embeddings.</p></div><p>The system has processed individual photography sessions containing 12,000 images and roughly 450 GB in a single pass, and today serves tens of thousands of requests a week.</p><p>Between the first sprint in March and the July launch, I went through four complete architecture generations.</p><p>Almost every generation boundary came down to the same question:</p><h3><strong>Do I buy the platform, or do I own the primitive?</strong></h3><p>Sometimes I adopted the managed service. Sometimes I replaced it. And sometimes I came very close to replacing a primitive with a managed service, only to run the numbers and walk away.</p><p>The four headline decisions were:</p><ol><li><p><strong>SageMaker vs. Bedrock vs. raw AWS primitives for VLM and SigLIP 2 inference</strong></p></li><li><p><strong>Vercel vs. S3 + CloudFront for the React + TypeScript frontend</strong></p></li><li><p><strong>OpenRouter vs. a self-hosted model gateway</strong></p></li><li><p><strong>Clerk vs. Cognito + SES for authentication and transactional email</strong></p></li></ol><p>There were also three less glamorous decisions that ended up moving the bill more than some of the headline ones:</p><ul><li><p><strong>Spot and Graviton</strong></p></li><li><p><strong>OpenSearch and Step Functions</strong></p></li><li><p><strong>CloudWatch, networking and storage classes</strong></p></li></ul><p>For each decision, I wanted to understand not only what the comparison tables said, but what actually happened after the architecture met production.</p><p>That distinction turned out to matter enormously.</p><p>My operating rule today is simple:</p><blockquote><p><strong>Buy managed services for their operations, not their defaults &#8212; and leave them when their cost floor or cold start starts fighting your workload.</strong></p></blockquote><div><hr></div><h1>1. SageMaker vs. Bedrock vs. AWS Primitives</h1><h2>The decision at the center of Parjanya</h2><p>The heart of Parjanya is batch visual inference.</p><p>A photographer uploads a session &#8212; routinely 4,000 or more images, and sometimes 12,000. Every image that passes a cheap deterministic technical-quality gate is scored by the VLM and embedded using SigLIP 2.</p><p>The workload characteristics are important because they tell me almost immediately where the different approaches will fit.</p><p>The workload is <strong>bursty</strong>, not steady.</p><p>A queue can go from zero to thousands of images and then return to zero. There can be days when almost nothing arrives.</p><p>It is also <strong>batch tolerant</strong>.</p><p>Nobody needs a score in 200 milliseconds. What matters is that 4,000 images are processed by morning.</p><p>It is <strong>privacy sensitive</strong>.</p><p>These are often unreleased professional photographs belonging to clients. Keeping image bytes inside our VPC is not merely an architectural preference; it is something I can actually explain to a customer.</p><p>And finally, the economics are dominated by <strong>GPU time</strong>.</p><p>Before optimization, GPU compute represented well over half of the entire bill.</p><p>That combination &#8212; bursty, batch-oriented, private and GPU-heavy &#8212; became the single biggest predictor of which architecture made sense.</p><h2>I started with SageMaker</h2><p>The obvious managed options were Bedrock and SageMaker.</p><p>Bedrock represented the pure developer-experience end of the spectrum: API calls, no infrastructure, no cold-start management and managed models.</p><p>SageMaker sat somewhere in the middle: managed infrastructure around our own container and model.</p><p>Raw AWS primitives were the opposite end: EC2 GPU instances, Auto Scaling, SQS, SNS, CloudWatch and an AMI with the model baked in.</p><p>I used all three lenses, and two of them in anger.</p><p>Generation 2 ran on SageMaker.</p><p>I started with a BYOC real-time endpoint and then moved to Batch Transform.</p><p>SageMaker did exactly what I expected it to do: it got me to a working GPU pipeline quickly.</p><p>That is the promise of DX, and in this case, it delivered.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;e2b6428c-4861-4a3b-aa19-352f2c62e1ed&quot;,&quot;caption&quot;:&quot;As a follow-up to the original engineering note on Parjanya v2.0, this deep dive explores the architectural decisions, operational lessons, and production incidents that shaped the migration away from Amazon SageMaker toward a purpose-built AWS-native inference orchestration platform.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;When SageMaker Wasn't the Problem&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-06-24T05:23:41.049Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!QzHI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/when-sagemaker-wasnt-the-problem&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:203346926,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Then two things happened.</p><h3>Quantization changed the economics more than the platform did</h3><p>Qwen3-VL-8B in BF16 wants roughly 16 GB of VRAM.</p><p>A T4 has exactly 16 GB &#8212; and does not support BF16.</p><p>Moving to NF4 4-bit quantization using bitsandbytes brought VRAM usage down to roughly 5 GB, which made an 8B model practical on a T4.</p><p>More importantly, it produced a roughly <strong>13&#215; per-image speedup</strong>.</p><p>Our batch cost collapsed from approximately <strong>$500 to $40&#8211;50</strong>.</p><p>That was my first major lesson from self-hosting:</p><blockquote><p><strong>The model configuration can be a much bigger cost lever than the hosting substrate.</strong></p></blockquote><p>A managed platform doesn&#8217;t automatically pull that lever for you.</p><h3>Then SageMaker&#8217;s operational shape started fighting the workload</h3><p>The first problem was cold starts.</p><p>The managed endpoint took on the order of ten minutes to become useful, largely because of model-weight loading.</p><p>Our replacement &#8212; an AMI/NVMe-staged model running on a raw EC2 GPU worker &#8212; loads roughly 17 GB of weights in under two minutes.</p><p>For a workload that scales from zero, warmup <em>is</em> latency.</p><p>The second problem was the cost floor.</p><p>A real-time endpoint costs money every hour it exists, whether a single image arrives or not.</p><p>One GPU endpoint represented a standing tax of roughly $500+ per month.</p><p>At one point, I discovered a forgotten endpoint costing almost <strong>$870/month</strong>.</p><p>Our worst single day was roughly <strong>$1,000</strong>, around three to four times our typical monthly development spend at the time. The root cause was endpoint provisioning and extended runs.</p><p>The most important early optimization was almost embarrassingly simple: a scheduled shutdown Lambda.</p><p>We kept the endpoint warm only during a seven-hour nightly window, which reduced its cost by roughly 70%, from about <strong>$540 to $160 per month</strong>.</p><p>That taught me something I now use as a general diagnostic:</p><blockquote><p><strong>When your best optimization for a managed platform is a cron job that turns the platform off, your workload and the platform&#8217;s default posture probably disagree.</strong></p></blockquote><p>The third problem was debuggability.</p><p>When something went wrong on primitives, I could inspect a queue, an alarm, an Auto Scaling event and a container log.</p><p>Everything was directly readable.</p><p>On the managed platform, the same investigation often disappeared behind an abstraction that I could not see through as clearly.</p><p>That was ultimately what made the decision for me.</p><h2>I moved to EC2 Spot</h2><p>In April, Generation 3 deprecated SageMaker entirely.</p><p>I moved to EC2 Spot GPU workers &#8212; primarily the g4dn family with NVIDIA T4s &#8212; inside an Auto Scaling group driven by SQS queue depth.</p><p>The fleet genuinely scales to zero.</p><p>The minimum size is zero.</p><p>A scheduler Lambda watches the queue every two minutes, and the scale-in rule only fires after both visible and in-flight messages have been zero for five consecutive minutes.</p><p>For Spot interruptions, I added a five-second metadata poll.</p><p>The worker finishes the current image, checkpoints the state to DynamoDB and exits cleanly.</p><p>After months in production, we have lost <strong>zero images to Spot interruption</strong>.</p><p>The result was substantially better than our early expectations.</p><p>Our largest autonomous run drained roughly <strong>2,400 images in under eight hours on four Spot GPUs</strong>, scaled itself back to zero three minutes after the queue emptied, and required no operator intervention.</p><p>The total bill was approximately <strong>$20</strong>.</p><p>Pure GPU inference now costs roughly <strong>$0.002&#8211;0.005 per image</strong>, or around <strong>$0.005&#8211;0.008 all-in</strong>.</p><p>Compared with the SageMaker era, that is an order-of-magnitude difference.</p><p>Overall platform cost fell by roughly <strong>65&#8211;75%</strong> from its pre-optimization peak.</p><p>At our worst, we were spending around $80&#8211;90/day.</p><p>Under load today, it is closer to $20&#8211;30/day, with an idle floor around $5/day.</p><p>Spot itself delivered a measured <strong>56&#8211;61% saving</strong> against on-demand, roughly $0.26&#8211;0.29/hour versus about $0.55/hour for a T4 in Mumbai.</p><p>I also ran an A/B test of going 100% Spot.</p><p>It beat its own forecast.</p><p>Drain time roughly halved, cost per message fell by around 60%, and we experienced zero interruptions.</p><p>The written verdict was simply:</p><p><strong>Stay 100% Spot.</strong></p><p>There was another Spot lesson that was less obvious.</p><p>I now treat quota increases as <strong>spend risk</strong>, not simply performance capacity.</p><p>The cost is in instance-hours, not instance count. Increasing a GPU quota to &#8220;improve throughput&#8221; also increases the maximum possible blast radius on the bill.</p><p>I manage the on-demand/Spot quota ratio as deliberately as I manage the fleet itself.</p><h2>What about Bedrock?</h2><p>I did not dismiss Bedrock.</p><p>I benchmarked it.</p><p>A managed vision API came in at roughly <strong>$0.01/image</strong>.</p><p>Our Spot fleet sits around <strong>$0.002&#8211;0.005/image</strong>.</p><p>That is a 2&#8211;5&#215; gap, but it exists because I am doing three things simultaneously:</p><ul><li><p>scaling to zero</p></li><li><p>running a quantized model</p></li><li><p>using Spot capacity</p></li></ul><p>If I ran the same fleet on-demand and kept it always on (warm), Bedrock would win.</p><p>I keep that Bedrock number as a standing benchmark.</p><p>The day the fleet stops being well run, I want the spreadsheet to tell me so.</p><p>There are also two reasons I would keep self-hosting even if the economics reached parity:</p><ol><li><p>Image bytes never leave our VPC.</p></li><li><p>I control model version pinning completely.</p></li></ol><p>Those are not spreadsheet variables.</p><h2>What the industry says</h2><p>The broader industry experience broadly supports this progression.</p><p>Discord describes a deliberate strategy of prototyping against managed frontier APIs to validate whether current-generation models can solve the product problem, then moving to self-hosted open models once scale justifies the operational burden. <a href="https://discord.com/blog/developing-rapidly-with-generative-ai">https://discord.com/blog/developing-rapidly-with-generative-ai</a></p><p>Shopify built its Merlin ML platform on open-source primitives rather than committing to a managed ML platform, largely because its teams had conflicting requirements and needed a frictionless prototype-to-production path.</p><p><a href="https://shopify.engineering/merlin-shopify-machine-learning-platform">https://shopify.engineering/merlin-shopify-machine-learning-platform</a></p><p>Independent comparisons generally place the self-hosting break-even around 10&#8211;20k requests/day, with much larger savings at higher volumes.</p><p>And AWS itself frames Bedrock versus SageMaker as a genuine trade-off between serverless convenience and control.</p><p>My experience added a third fork:</p><p><strong>sometimes the right answer is neither.</strong></p><p>Sometimes the right answer is EC2, SQS and an AMI.</p><h2>What production taught me that comparison tables didn&#8217;t</h2><p>The first lesson was that primitives compose &#8212; but not freely.</p><p>Our warm-pool design passed architecture review and failed during </p><p><code>terraform apply</code>.</p><p>AWS does not allow a warm pool on an Auto Scaling group with a mixed-instances policy.</p><p>The DIY tax isn&#8217;t necessarily writing more Terraform.</p><p>It is discovering the composition rules the hard way.</p><p>The second lesson was that design numbers are not production numbers.</p><p>Our AMI-bake design promised roughly 90-second model loads.</p><p>Fresh instances actually took <strong>30&#8211;40 minutes</strong>.</p><p>Lazy EBS restore meant a new instance reading 17 GB of untouched blocks crawled at single-digit MB/s.</p><p>The solution was NVMe staging.</p><p>It brought the 17 GB load down to under two minutes &#8212; measured in production.</p><p>I now put a date and configuration hash next to every performance number in our documentation.</p><p>Benchmark rot is a debt class.</p><p>The third lesson was about deterministic gates.</p><p>Before anything reaches a GPU, a sub-cent Lambda gate rejects technically unusable files.</p><p>That rewrite replaced an earlier ML-based scorer, reducing that stage&#8217;s cost by roughly <strong>90%</strong>, from around $13 to less than $1/month, while also reducing its cold start from about 15 seconds to roughly two seconds.</p><p>More importantly, the deterministic rule engine owns the accept/reject decision.</p><p>If I change the curation policy, I can replay stored model outputs through the new rules in under a minute for pennies.</p><p>I do not need to run the GPU again.</p><blockquote><p><strong>The cheapest inference is the inference I skip. The second cheapest is the inference I never have to redo.</strong></p></blockquote><p>And then there was the prompt.</p><p>The prompt is infrastructure.</p><p>Our worst GPU incident was a CUDA out-of-memory crash caused not by the model or the fleet, but by prompt creep.</p><p>The scoring prompt had quietly grown beyond 4,000 tokens.</p><p>Instead of buying a larger GPU at twice the price, I audited the prompt and cut it by roughly 60%.</p><p>A lot of the removed instruction was teaching the model to produce outputs that the deterministic rule engine downstream deliberately ignored.</p><p>I was literally paying VRAM to generate information the system threw away.</p><p>On a 16 GB card, token budgets are a debt ceiling.</p><div><hr></div><h1>2. Vercel vs. S3 + CloudFront</h1><p>The frontend is a React 19 + TypeScript + Vite SPA.</p><p>It contains the gallery, curation workflow, uploads and administration interface, and serves photographers globally while the FastAPI backend runs in Mumbai.</p><p>During launch, I needed fast global static delivery, many deployments a day, instant rollback and strict security headers.</p><p>The default answer in 2026 is Vercel.</p><p>And I understand why.</p><p>Git-push deployments, preview environments, an edge network and almost no infrastructure knowledge required.</p><p>But I chose <strong>S3 + CloudFront</strong>.</p><p>The deployment pipeline is intentionally boring:</p><p><strong>Vite build &#8594; S3 sync &#8594; CloudFront invalidation</strong></p><p>GitHub Actions handles it through OIDC.</p><p>Merging to <code>main</code> deploys development.</p><p>Production remains a manual, human-triggered workflow.</p><p>The cache design does most of the work.</p><p>Hashed assets under <code>/assets/*</code> are immutable and carry a one-year TTL.</p><p><code>index.html</code> gets a 60-second TTL.</p><p>That makes the cache policy itself the deployment lever.</p><p>A release becomes globally visible within about a minute, and rollback is simply redeploying the previous build.</p><p>Security headers &#8212; HSTS with preload, frame-deny and nosniff &#8212; are handled by a CloudFront response-headers policy.</p><p>The cost is generally in the single-digit dollars per month and, most months, sits inside the free tier.</p><p>The reason I chose it was not that Vercel is bad.</p><p>It was that <strong>the frontend was not where I needed Vercel&#8217;s strengths</strong>.</p><p>Cached SPA loads from London, New York and Sydney are already measured in tens of milliseconds.</p><p>What users actually feel is the dynamic API round trip to Mumbai.</p><p>A page making three to five sequential API calls can add more than a second from North America or Europe.</p><p>No edge frontend platform can fix that.</p><p>The answer is API design: batching, caching and eventually regional read replicas.</p><p>That reinforced the thesis I started with:</p><blockquote><p><strong>The edge is a traffic director, not a compute executor.</strong></p></blockquote><p>Static assets and routing belong at the edge.</p><p>Authentication, model resolution, inference and telemetry remain centralized.</p><p>For a Vite SPA, the DX delta was also surprisingly small.</p><p>Vercel&#8217;s real advantage appears in SSR, ISR, preview deployments and framework-integrated serverless functions.</p><p>I wasn&#8217;t using most of those features.</p><p>For me, the DX advantage amounted largely to one GitHub Action.</p><p>The third consideration was cost topology.</p><p>S3 + CloudFront scales predictably with traffic.</p><p>Platform function pricing scales with invocations &#8212; precisely the axis I hope will explode as Parjanya grows.</p><p>I didn&#8217;t reject Vercel.</p><p>I simply didn&#8217;t want to pay a platform premium for capabilities my architecture wasn&#8217;t using.</p><div><hr></div><h1>3. OpenRouter vs. a Self-Hosted Gateway</h1><p>Every AI product eventually has to answer four questions:</p><ul><li><p>Which model serves this request?</p></li><li><p>What happens when it becomes unavailable?</p></li><li><p>Who tracks the spend?</p></li><li><p>Whose infrastructure sees the payload?</p></li></ul><p>Managed gateways such as OpenRouter answer these questions across hundreds of hosted models.</p><p>One API key.</p><p>Automatic fallback.</p><p>Unified billing.</p><p>For Parjanya, however, there was a twist.</p><p>Our production models are self-hosted open weights:</p><ul><li><p>Qwen3-VL-8B</p></li><li><p>SigLIP 2</p></li></ul><p>They run on our own GPUs.</p><p>There is no third-party inference endpoint sitting in the hot path.</p><p>So I asked a slightly different question:</p><p><strong>What plays the role of the gateway when the models are mine?</strong></p><p>I ended up decomposing the gateway into primitives.</p><p>Model resolution is a three-tier loading ladder on the GPU worker.</p><p><strong>Tier 1:</strong> weights staged on local NVMe from the AMI bake.</p><p><strong>Tier 2:</strong> S3 synchronization fallback.</p><p><strong>Tier 3:</strong> Hugging Face download.</p><p>Every load records the tier.</p><p>In healthy production, I should only ever see Tier 1.</p><p>A Tier 2 or Tier 3 log line is therefore an alert.</p><p>I also made the upstream dependency deliberately boring.</p><p>Hugging Face is contacted exactly once per model version, during AMI baking in CI.</p><p>Production instances never download models from it.</p><p>A scheduled job compares the upstream model commit hash with our baked AMI tags and tells a human when a rebake is worth considering.</p><p>That gives me something I care about enormously in an inference system:</p><p><strong>model versions are pinned by construction.</strong></p><p>Fallback is handled by the mixed-instances policy across GPU families and the loading ladder.</p><p>Spend accounting comes from CloudWatch and tagged infrastructure.</p><p>Every inference dollar can be attributed to an EC2 line item.</p><p>For our particular architecture, a managed gateway would introduce three structural costs:</p><ol><li><p>A per-request economic layer.</p></li><li><p>A data-path layer where client payloads transit someone else&#8217;s infrastructure.</p></li><li><p>A rate-limit layer where our ceiling becomes somebody else&#8217;s policy.</p></li></ol><p>OpenRouter&#8217;s published model, for example, includes roughly a 5% platform fee on provider pass-through pricing.</p><p>For a self-hosted, single-model, VPC-contained workload, I don&#8217;t get enough routing benefit to justify those layers.</p><p>But there is an important concession here.</p><p>If I were calling frontier hosted models, I would absolutely use a gateway.</p><p>And I would probably use a managed one first.</p><p>Standing up LiteLLM with a database, cache and pager before I have meaningful multi-provider traffic is premature infrastructure.</p><p>The gateway decision comes <strong>after</strong> the hosting decision.</p><p>It is not independent of it.</p><h2>The lesson from our fallback</h2><p>A fallback I have never exercised is not a fallback.</p><p>For a while, our Tier 2 S3 fallback was configuration theater.</p><p>The environment variables existed in the design.</p><p>They were never actually injected into the container.</p><p>The fallback existed on paper and nowhere else.</p><p>I fixed it by deliberately breaking Tier 1 and watching what happened.</p><p>That is one of the biggest operational differences between managed and primitive systems:</p><p><strong>if I decompose a managed capability, I inherit the obligation to rehearse every part of it.</strong></p><div><hr></div><h1>4. Clerk vs. Cognito + SES</h1><p>Authentication was the closest call.</p><p>Parjanya needs multi-tenant signup, email/password authentication, JWTs carrying an immutable tenant identifier, trial limits and transactional email for verification and password resets.</p><p>Clerk is extremely attractive here.</p><p>Polished UI.</p><p>Session management.</p><p>A much nicer developer experience.</p><p>And, critically, email that simply works.</p><p>The alternative was Cognito + SES.</p><p>I chose Cognito + SES.</p><h2>Why</h2><p>First, economics.</p><p>At our current scale, Cognito costs us essentially nothing under its applicable MAU threshold and remains materially cheaper through the growth range we are targeting.</p><p>For a product whose unit economics depend on very high gross margins on per-image pricing, a permanent per-MAU platform fee is a margin haircut on every future user.</p><p>Second, and more importantly:</p><p><strong>the token is the tenancy model.</strong></p><p>Our JWTs carry an immutable <code>tenant_id</code> claim.</p><p>The backend verifies it using RS256 against Cognito&#8217;s JWKS, deliberately avoiding a signing secret in the backend.</p><p>Every S3 bucket policy and DynamoDB access pattern keys off that claim.</p><p>The backend issues short-lived, tag-scoped STS credentials per tenant.</p><p>Buckets are per-tenant.</p><p>KMS keys are per-tenant.</p><p>Cross-tenant access is explicitly denied at the policy layer.</p><p>Auth is therefore not just a login box.</p><p>It is the root of the isolation tree.</p><p>I wanted that root inside the same Terraform, account boundary and audit trail as everything it protects.</p><p>A hosted authentication provider can issue my token.</p><p>But it cannot itself be the IAM principal that my storage policies deny against.</p><p>Third, there is the privacy argument.</p><p>One bill.</p><p>One IAM boundary.</p><p>No additional identity-data processor.</p><p>For a privacy-positioned product, that is a sales answer as much as it is an architecture answer.</p><h2>And then DIY sent me the bill</h2><p>This is where I think infrastructure writing is often too polite.</p><p>The DIY option has a cost.</p><p>I want to list mine.</p><p>Cognito immutable attributes really are immutable.</p><p>I verified that in production.</p><p>Get your custom claims right the first time.</p><p>Schema changes can also be pool-destroying.</p><p>Adding a new schema attribute through Terraform can force user-pool replacement and therefore destroy every user account.</p><p>I added a role claim through the CLI instead, knowingly accepting permanent drift for that resource.</p><p>Cognito also does not support cross-account user-pool migration.</p><p>When we reorganized into a multi-account AWS organization, the pool&#8217;s location became a one-way door.</p><p>Either users would re-register or we would face a mass password reset.</p><p>Then there were session bugs.</p><p>Our frontend token cache survived logout.</p><p>User two could briefly see user one&#8217;s data until I added an explicit cache clear at every login boundary.</p><p>Presigned upload URLs had another subtle problem.</p><p>They inherit the STS credential&#8217;s expiry rather than the nominal URL lifetime.</p><p>An upload presigned at minute zero failed at minute 61 with a signature that looked valid.</p><p>These are precisely the integration bugs that a mature hosted authentication SDK has probably already encountered.</p><p>And then there was email.</p><p>Cognito&#8217;s default email channel has a 50-email/day per-pool cap and is best effort.</p><p>During launch, password-reset emails were silently dropped.</p><p>The API returned success.</p><p>CloudTrail recorded the event.</p><p>No email arrived.</p><p>That is one of the worst failure modes in distributed systems:</p><blockquote><p><strong>The lying green checkmark.</strong></p></blockquote><p>The fix was SES with a verified domain, DKIM and developer sending enabled through Cognito.</p><p>That led into SES production-access review.</p><p>Our first request was denied, almost certainly because our submission said too little about bounce handling.</p><p>SES sandbox status became the sole external blocker on our release lock.</p><p>We eventually documented the ordering constraint in red:</p><p><strong>auto-confirm cannot be switched off while SES is sandboxed, or every signup breaks.</strong></p><p>This is exactly where Clerk&#8217;s pitch becomes compelling.</p><p>You don&#8217;t have to think about any of this.</p><p>And during launch week, that matters.</p><p>DIY auth is paid for in calendar time and attention.</p><p>Those were the two currencies I had the least of during launch.</p><h2>My verdict</h2><p>Cognito + SES was right for Parjanya.</p><p>But it was the closest decision of the four.</p><p>The SES saga is actually the strongest argument for DX in this entire post.</p><p>A managed platform&#8217;s ability to make an entire class of launch-week failures impossible has real value.</p><p>If authentication were not the root of our isolation model, I would have been much more comfortable paying a per-MAU platform fee at seed scale.</p><div><hr></div><h1>5. The Decisions That Don&#8217;t Make Blog Titles</h1><p>Some of the decisions that affected the bill the most had nothing to do with DX platforms.</p><h2>Spot &#8212; and learning when a lever isn&#8217;t a lever</h2><p>The Spot decision gets most of the attention because the savings are obvious.</p><p>We measured roughly 56&#8211;61% savings versus on-demand.</p><p>Our A/B test of 100% Spot beat its forecast. There are additional optimisations like cost-performance optimisation by AWS, which I will detail in upcoming posts.</p><p>Interruption handling has lost zero images.</p><p>We even measured Spot pricing within the region and found that availability-zone prices for the same instance type could differ by more than 50%.</p><p>So the fleet biases toward the cheaper zone.</p><p>But some fashionable optimizations simply failed the arithmetic.</p><p>Multi-region Spot arbitrage died because inter-region data transfer consumed most of the projected savings.</p><p>A neighboring region also turned out not to have GPU capacity to arbitrage in the first place.</p><p>The more interesting story was Graviton.</p><p>Our first Graviton audit found that only one of four Lambda functions could even run on ARM64.</p><p>Native dependency wheels, CUDA and unbenchmarked inference libraries blocked the rest.</p><p>The projected saving was approximately <strong>0.4% of the total bill</strong> &#8212; about a quarter of a dollar per month.</p><p>Meanwhile, quantization, Spot and scheduling were saving 40&#8211;60%.</p><p>So I wrote down the conclusion and walked away:</p><blockquote><p><strong>Sometimes the best architecture decision is knowing where not to spend your engineering time.</strong></p></blockquote><p>Months later, a dependency shipped ARM64 wheels.</p><p>The blocker disappeared.</p><p>We revisited the decision and migrated.</p><p>The measured Lambda saving was approximately <strong>20%</strong>, almost exactly what we had projected.</p><p>Both halves of the story matter.</p><p>I needed the discipline to defer a fashionable optimization.</p><p>But I also needed the paper trail that allowed me to revisit it later without starting the research from scratch.</p><p>My rule now is simple:</p><blockquote><p><strong>A two-hour ARM benchmark costs pennies and beats two weeks of debugging a premature migration.</strong></p></blockquote><p>And I never flip Terraform to ARM64 before the image has actually run there.</p><div><hr></div><h1>6. OpenSearch and Step Functions</h1><p>Two other managed services lost to arithmetic.</p><h3>Search</h3><p>I kept search in-process.</p><p>No OpenSearch.</p><p>No external vector database.</p><p>At our scale, the smallest useful OpenSearch domain costs more per month than our entire reconciliation control plane costs per year.</p><p>Rather than guessing, I measured the ceiling.</p><p>Today, search latency is around two seconds at a few thousand rows and degrades toward the load balancer timeout somewhere beyond 100k rows.</p><p>So I wrote down the trigger:</p><p><strong>roughly 30 tenants.</strong></p><p>That is when OpenSearch becomes a yes.</p><p>SigLIP 2 vectors are already ready for a proper vector store when that trigger fires.</p><h3>Orchestration</h3><p>I also rejected Step Functions and workflow engines.</p><p>Our orchestration is a roughly 200-line reconciler.</p><p>DynamoDB Streams provide the fast path.</p><p>An hourly sweep provides the backstop.</p><p>The entire control plane costs a few cents a month.</p><p>I made the same arithmetic-driven decision around AWS Config and commercial compliance tooling.</p><p>A weekly EventBridge + Lambda audit covers the rules we actually need at effectively zero cost.</p><p>There is a famous industry parallel here: Amazon&#8217;s Prime Video team moved a monitoring service away from Step Functions and Lambda to a plain ECS monolith and reported roughly 90% lower infrastructure cost.</p><p>But DIY orchestration has its own failure modes.</p><p>Our replay Lambda once lost a single IAM permission and logged <code>AccessDenied</code> on every invocation for half a day.</p><p>The dashboards stayed green.</p><p>Hundreds of images stalled.</p><p>Nothing drained.</p><p>Then, on our launch-baseline day, the reconciler itself became the incident.</p><p>A read-amplification bug caused it to consume tens of millions of DynamoDB read units in 24 hours.</p><p>The bill was roughly $15/day.</p><p>The pipeline itself was almost entirely healthy.</p><p>The repair mechanism had become the damage.</p><p>I added targeted query guards and reduced that spend by roughly 85&#8211;90%.</p><p>Both incidents ended as code.</p><p>An alarm on silence.</p><p>A conditional-write guard.</p><p>A query guard.</p><p>That is an important property of primitives:</p><blockquote><p><strong>Institutional memory can become code.</strong></p></blockquote><div><hr></div><h1>7. Where the Bill Actually Hides</h1><p>Three numbers changed how I think about infrastructure.</p><p>The first was CloudWatch.</p><p>Ungoverned CloudWatch can quietly consume 20&#8211;40% of a small platform&#8217;s operating cost.</p><p>A single chatty DEBUG-level Lambda can generate roughly $20+/month in log ingestion &#8212; more than our entire early operating budget for that stage.</p><p>Embedded Metric Format instead of per-call metric APIs saved around $15/month by itself.</p><p>Composite alarms reduced alarm costs by roughly 70%.</p><p>I also stopped creating per-tenant dashboards.</p><p>At $3/dashboard/month, that becomes a fixed cost that scales in exactly the wrong direction.</p><p>With those changes, observability fell back to a few dollars per month.</p><p>The second number was networking.</p><p>While investigating that roughly $20 autonomous GPU drain run, I discovered that almost half the bill wasn&#8217;t GPU time.</p><p>It was NAT gateway egress from around 180 GB of S3 reads.</p><p>The GPU wasn&#8217;t the expensive part.</p><p>The data path was.</p><p>VPC gateway endpoints for S3 and DynamoDB eliminated most of that cost and had already saved roughly $30&#8211;45/month of standing NAT expense.</p><p>A handful of interface endpoints cut the remaining NAT data by another ~80%.</p><p>That was another reminder that no SageMaker-vs-EC2 comparison table is going to tell you that your data path may cost more than your compute.</p><p>The third number was storage.</p><p>At photography scale, storage-class economics matter.</p><p>I rejected S3 Intelligent-Tiering for previews because its per-1,000-object monitoring fee becomes meaningful when you have millions of tiny files.</p><p>Instead, previews go directly into Infrequent Access, around 46% cheaper than Standard in our region.</p><p>Originals step down to Glacier Instant Retrieval, around 83% cheaper.</p><p>Rejected images move to Deep Archive after a grace period.</p><p>At 10 TB of rejected images, that&#8217;s roughly $10/month.</p><p>The result is about <strong>3.7&#215; cheaper</strong> than na&#239;vely keeping everything in Standard.</p><p>The broader industry has demonstrated this at enormous scale.</p><p>Canva, for example, moved tens of billions of objects to Glacier Instant Retrieval after measuring that access collapses after the first couple of weeks, saving millions annually.</p><p>The meta-lesson for me was even simpler.</p><p>Our weekly audit Lambda costs effectively nothing.</p><p>It caught roughly <strong>7,500 objects sitting in the wrong storage class for months</strong>.</p><p>It also found an S3 versioning configuration where the console suggested around 2,000 objects while the bucket actually contained more than 100,000 hidden version objects.</p><p>Left unchecked, that could have grown into millions of noncurrent versions, terabytes of invisible storage and a 5&#8211;10&#215; inflated storage bill.</p><p>On primitives, <strong>audit is the platform</strong>.</p><div><hr></div><h1>8. The Incident Ledger</h1><p>A fair DIY-versus-DX discussion has to include the incident ledger.</p><p>The operational burden that managed platforms sell against is real.</p><p>Between the first sprint and the post-launch study window, I logged <strong>17 incidents across 12 classes</strong>.</p><p>Here are a few.</p><p>Terraform drift nearly became a self-inflicted outage.</p><p>After weeks of console-side firefighting, a routine Terraform plan came back with:</p><p><strong>173 to add.<br>127 to destroy.</strong></p><p>A blind apply would have deleted the NAT gateway, the DynamoDB table containing every VLM verdict and the Cognito user pool containing every login.</p><p>Getting back to a clean 0/0/0 state took roughly four focused hours spread across four days.</p><p>A managed DX platform wouldn&#8217;t have given me that state file.</p><p>But it also wouldn&#8217;t have given me a state file proving exactly what production was.</p><p>There was a six-hour preview outage caused by deleting the wrong &#8220;stale&#8221; grant.</p><p>What looked like a leftover origin-access policy was actually the live one.</p><p>Every preview returned 403 until I restored it.</p><p>There was a burst-photography incident caused by a silently failing install.</p><p>A shell <code>|| echo</code> swallowed both a 404 and a missing archive.</p><p>We shipped a worker image without its EXIF tool.</p><p>Near-identical burst frames then started being falsely rejected as duplicates.</p><p>Launch went out with exact-match-only deduplication as the safe setting.</p><p>There was a wrong-bucket incident where hundreds of images hung on repeated download errors because queue payloads contained a valid key pointing to the wrong bucket.</p><p>And there was a weekend bulk import where messages silently expired from SQS because queue retention was shorter than the weekend.</p><p>Retention is now an invariant with a name.</p><p>Not a default.</p><p>These incidents sound like arguments against primitives.</p><p>I actually think they demonstrate the opposite.</p><p>Every incident ended as code:</p><ul><li><p>a Terraform validation block</p></li><li><p>a conditional write</p></li><li><p>a CI grep</p></li><li><p>a CloudWatch alarm</p></li><li><p>a queue invariant</p></li></ul><p>Institutional memory became executable.</p><p>And across all 17 incidents, recurrence after adding the guardrails is currently <strong>zero</strong>.</p><p>That is the bargain I am making with primitives.</p><p>I accept the initial operational burden in exchange for owning the system completely enough to turn every lesson into a permanent constraint.</p><p>The multi-account reorganization was another example.</p><p>It was triggered partly by a deployment script accidentally pushing to production from the wrong local context.</p><p>The reorganization added roughly $10/month in duplicated audit tooling and moved around 135 GB of data for pennies.</p><p>In return, it dramatically reduced blast radius.</p><p>That kind of control is difficult to purchase from a single-tenant DX platform&#8217;s pricing page.</p><h2>One uncomfortable AI footnote</h2><p>Parjanya was substantially AI-assisted in its construction.</p><p>Two of the nastiest silent failures in the incident ledger &#8212; the swallowed <code>exiftool</code> installation and a bare-except registry writer &#8212; were both machine-written and machine-reviewed code.</p><p>Their common property was silence.</p><p>The answer wasn&#8217;t to use less automation.</p><p>It was to write better contracts:</p><ul><li><p>CI greps for exception-swallowing patterns</p></li><li><p>log-line contracts for every pipeline tier</p></li><li><p>alarms on absence</p></li><li><p>explicit invariants</p></li></ul><p>The same discipline that makes primitives operable also makes AI-written code operable.</p><div><hr></div><h1>9. The Repatriation Debate, From the Cheap Seats</h1><p>All of this sits inside the much larger cloud-versus-hardware debate.</p><p>37signals has made the case for leaving the cloud, with a reported reduction from roughly $3.2M to $1.3M annually and projected savings of more than $10M over five years.</p><p>Ahrefs has argued that owned hardware saved them hundreds of millions compared with AWS list pricing.</p><p>Canva has taken almost the opposite position: stay in the cloud, but become extremely good at engineering the bill.</p><p>At Parjanya&#8217;s scale, I&#8217;m much closer to Canva&#8217;s school.</p><p>But I think there is an important distinction.</p><p>I haven&#8217;t left the cloud.</p><p>I also haven&#8217;t left managed services.</p><p>DynamoDB, SQS, Lambda, CloudFront and Cognito are still managed services in our architecture.</p><p>I keep them because I want their operations.</p><p>What I left were the managed services whose <strong>cost floors and cold starts fought the workload</strong>.</p><p>A real-time inference endpoint billing through the night for a queue that is empty by midnight isn&#8217;t an operations benefit.</p><p>It is a subscription to someone else&#8217;s default posture.</p><p>That is the distinction I think the broader repatriation debate sometimes misses.</p><p>It isn&#8217;t really:</p><p><strong>cloud vs. metal</strong></p><p>or:</p><p><strong>platform vs. primitives</strong></p><p>It is:</p><blockquote><p><strong>What is the right economic and operational shape for each individual workload?</strong></p></blockquote><p>And that answer should be re-run when the workload changes.</p><div><hr></div><h1>10. The Decision Framework I Use Now</h1><p>After five months and four architecture generations, I have reduced the decision process to four questions.</p><h2>1. Is the expensive part of the hot path bursty?</h2><p>If yes, the platform&#8217;s cost floor may be your enemy.</p><p>Scale-to-zero primitives are probably worth the setup cost.</p><p>If the load is steady, the cost floor becomes less relevant and the managed platform&#8217;s operational value may be worth buying.</p><p>That one question explains why I left SageMaker, benchmarked and declined Bedrock, declined Vercel and kept DynamoDB on-demand.</p><h2>2. When it breaks at 2 a.m., can I read the failure surface?</h2><p>This ultimately mattered more to me than cost.</p><p>A queue.</p><p>An alarm.</p><p>An Auto Scaling event.</p><p>A container log.</p><p>These are things I can read.</p><p>If my team cannot or does not want to own that failure surface, the managed abstraction is doing real work for us.</p><p>I should pay for it.</p><h2>3. What currency does the DIY option cost &#8212; and do I have that currency right now?</h2><p>Cognito + SES cost me launch-week calendar time.</p><p>That was the scarcest resource I had.</p><p>The exact same decision at another point in the company&#8217;s life would have cost almost nothing.</p><p>So I no longer think only in dollars.</p><p>I ask:</p><p><strong>What resource am I actually short of?</strong></p><p>Money?</p><p>Engineering hours?</p><p>Attention?</p><p>Launch-week calendar time?</p><p>Operational confidence?</p><p>The right architecture can change depending on the answer.</p><h2>4. Have I written down the condition that would reverse my decision?</h2><p>This is probably the most useful practice I have adopted.</p><p>A &#8220;no&#8221; is not a permanent architectural belief.</p><p>It is a decision with a trigger.</p><p>For example:</p><ul><li><p>vLLM becomes a yes around 500 active users or sustained 100+ images/minute.</p></li><li><p>OpenSearch becomes a yes around 30 tenants.</p></li><li><p>The monorepo decision changes with team growth.</p></li></ul><p>Every rejected option gets an <strong>un-rejection trigger</strong>.</p><p>That turns architecture from ideology into a portfolio that I can rebalance.</p><div><hr></div><h1>The Operating Sentence</h1><p>The note that started this journey argued that high-performing platforms should choose <strong>DX where it helps, and control where it matters</strong>.</p><p>After a launch, four architecture generations, seventeen logged incidents and a roughly two-thirds reduction in our platform bill, I would sharpen that sentence.</p><p>This is the rule I now keep at the top of our architecture decision register:</p><blockquote><p><strong>Buy managed services for their operations, not their defaults. Leave them when their cost floor or cold start fights your workload. And put deterministic gates around expensive models &#8212; the cheapest inference is the inference you skip.</strong></p></blockquote><p>Parjanya v2.0 is now live as a self-serve trial.</p><p>The production system runs Qwen3-VL-8B in NF4 and SigLIP 2 So400M on scale-to-zero Spot GPU workers in <code>ap-south-1</code>.</p><p>Everything sits behind a deterministic rule engine that owns every accept/reject decision.</p><p>The model observes.</p><p><strong>The system decides.</strong></p><p>And, perhaps more importantly, I now have a much clearer idea of when I want a platform to make the hard parts disappear &#8212; and when I would rather own the hard parts myself.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[When SageMaker Wasn't the Problem]]></title><description><![CDATA[The Parjanya v2.0 case study: how AWS primitives replaced a managed ML platform through reconciliation, replay, and event-driven orchestration]]></description><link>https://blog.phagyul.ai/p/when-sagemaker-wasnt-the-problem</link><guid isPermaLink="false">https://blog.phagyul.ai/p/when-sagemaker-wasnt-the-problem</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Wed, 24 Jun 2026 05:23:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QzHI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a follow-up to the original engineering note on Parjanya v2.0, this deep dive explores the architectural decisions, operational lessons, and production incidents that shaped the migration away from Amazon SageMaker toward a purpose-built AWS-native inference orchestration platform.</p><p>The original note documented how a <em><strong>combination of EC2 GPU warm pools, Auto Scaling Groups, SQS, EventBridge, DynamoDB Streams, and pre-baked GPU AMIs enabled Parjanya to eliminate SageMaker cold-start penalties, achieve scale-to-zero economics, and build a replay-native control plane capable of self-repair and reconciliation</strong></em>. Rather than treating GPU inference as a model-serving problem, the architecture reframed it as an orchestration and reconciliation problem, resulting in dramatically lower startup latency, parallel execution, improved replay safety, and reduced operational cost.</p><p>This article expands on that foundation by examining the complete system architecture, the TBIE (Truth, Belief, Intent, Execution) operating model, the move from polling to event-driven reconciliation, and the real production incidents that ultimately shaped the platform&#8217;s reliability model.</p><h3>EXECUTIVE SUMMARY</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QzHI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QzHI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!QzHI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!QzHI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!QzHI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QzHI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1537810,&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://blog.phagyul.ai/i/203346926?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.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_!QzHI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!QzHI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!QzHI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!QzHI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4da6209a-e84d-4b8d-b391-3ad31aaa2e69_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Parjanya v2.0 is Phagyul AI&#8217;s image ingestion and GPU-based visual scoring, later evolved as curation platform by replacing score engine to rule engine. </p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;dc8842b8-bd28-4ff0-a8f2-d08d86644c7c&quot;,&quot;caption&quot;:&quot;I did not set out to replace a scoring engine with a rule engine. I set out to make the system cheaper, easier to explain, and less fragile as I was not keen on moving to g5.xlarge or g6.xlarge due to prompt sizes increased and would be lot of churn in terms of architectural and infra changes, comes with re testing every functionality and the increase i&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;From Score Engine to Rule Engine: Why I Rebuilt the Decision Layer&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-14T11:27:06.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!UKjF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/from-score-engine-to-rule-engine&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:197643272,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Its nightly VLM inference pipeline was originally built on Amazon SageMaker. The pipeline processed photographer uploads using Qwen3-8B-VLM and worked &#8212; but it revealed a fundamental architectural mismatch over time. Wall-clock time regularly stretched to ~11 hours. Cold starts ate into every nightly window. Replay handling for failed enrichments grew fragile. Sequential execution prevented scale-out. And persistent managed-platform overhead stopped making financial sense for burst-only workloads.<br>The core insight that drove the migration was a reframing of the problem. The question was no longer </p><blockquote><p><strong>&#8216;how do we run a model?&#8217;</strong> </p></blockquote><p>It became: </p><blockquote><p><strong>&#8216;how do we orchestrate burst-scale inference reliably, replay safely, and cost-efficiently?&#8217;</strong> </p></blockquote><p>That reframing led to retiring SageMaker and rebuilding the pipeline entirely from native AWS primitives &#8212; EC2 GPU warm pools, Auto Scaling Groups, SQS-driven orchestration, EventBridge-triggered scale-out, and pre-baked GPU AMIs with Qwen3-8B-VLM weights embedded.</p><div class="comment" data-attrs="{&quot;url&quot;:&quot;https://open.substack.com/&quot;,&quot;commentId&quot;:263136758,&quot;comment&quot;:{&quot;id&quot;:263136758,&quot;date&quot;:&quot;2026-05-22T03:22:43.452Z&quot;,&quot;edited_at&quot;:null,&quot;body&quot;:&quot;Over the past few weeks, I&#8217;ve been working on a deep dive around one of the most interesting production transitions we made in Parjanya v2.0 under the TBIE case study series.\n\nI have retired a SageMaker-based VLM inference pipeline that processed uploaded photographer images nightly using Qwen3-8BVLM.\n\nThe original system worked.\n\nBut operationally, it exposed a deeper architectural mismatch.\n\nEvery nightly batch incurred GPU cold starts before the first image could even be processed. Replay handling for failed enrichments became increasingly fragile. Sequential execution slowed the overall pipeline. And for a workload that only needed burst GPU inference during specific windows, the managed overhead simply stopped making sense.\n\nThe pipeline regularly stretched close to ~11 hours wall-clock.\n\nWhat became obvious after observing the system in production was this:\n\nThe problem was no longer &#8220;how do we run a model?&#8221;\n\nThe real problem was: &#8220;How do we orchestrate burst-scale inference reliably, replay safely, and cost efficiently?&#8221;\n\nThat led to rebuilding the pipeline using native AWS primitives:\n\n\n\n\n\nEC2 GPU warm pools\n\n\n\nAuto Scaling Groups\n\n\n\nSQS-driven orchestration\n\n\n\nEventBridge-triggered scale-out\n\n\n\nPre-baked GPU AMIs with Qwen3-8B-VLM weights\n\n\n\nTBIE reconciliation for replay verification and automated recovery\n\nThe outcome was more than cost optimization.\n\nIt fundamentally changed how the system behaved operationally:\n\n\n\n\n\nnear-zero or sub-minute startup latency\n\n\n\nparallel GPU workers replacing sequential processing\n\n\n\nevent-driven replay handling\n\n\n\nscale-to-demand orchestration\n\n\n\ndrastically reduced idle GPU waste\n\nThe upcoming write-up is not just about infrastructure changes.\n\nIt is a deep dive into how TBIE reconciliation patterns were applied in Parjanya v2.0 to build replay-safe, scalable GPU inference orchestration in production.\n\nOn Monday, I&#8217;ll be sharing the full TBIE case study deep dive covering:\n\n\n\n\n\nwhy the original architecture struggled\n\n\n\nthe reasoning behind the migration\n\n\n\nreconciliation-driven orchestration\n\n\n\nreplay-safe enrichment pipelines\n\n\n\nburst-scale GPU worker design\n\n\n\nlessons learned from operating the system in production\n\nOne of the biggest lessons from this transition:\n\nNot every AI workload needs a managed ML platform.\n\nSometimes the real engineering challenge sits in orchestration, reconciliation, and operational resilience.&quot;,&quot;body_json&quot;:{&quot;type&quot;:&quot;doc&quot;,&quot;attrs&quot;:{&quot;schemaVersion&quot;:&quot;v1&quot;,&quot;title&quot;:null},&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Over the past few weeks, I&#8217;ve been working on a deep dive around one of the most interesting production transitions we made in Parjanya v2.0 under the TBIE case study series.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;I have retired a SageMaker-based VLM inference pipeline that processed uploaded photographer images nightly using Qwen3-8BVLM.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;bold&quot;}],&quot;text&quot;:&quot;The original system worked.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;But operationally, it exposed a deeper architectural mismatch.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Every nightly batch incurred GPU cold starts before the first image could even be processed. Replay handling for failed enrichments became increasingly fragile. Sequential execution slowed the overall pipeline. And for a workload that only needed burst GPU inference during specific windows, the managed overhead simply stopped making sense.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;The pipeline regularly stretched close to ~11 hours wall-clock.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;What became obvious after observing the system in production was this:&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;The problem was no longer &#8220;how do we run a model?&#8221;&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;marks&quot;:[{&quot;type&quot;:&quot;code&quot;}],&quot;text&quot;:&quot;The real problem was: &#8220;How do we orchestrate burst-scale inference reliably, replay safely, and cost efficiently?&#8221;&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;That led to rebuilding the pipeline using native AWS primitives:&quot;}]},{&quot;type&quot;:&quot;bulletList&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;EC2 GPU warm pools&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Auto Scaling Groups&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;SQS-driven orchestration&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;EventBridge-triggered scale-out&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Pre-baked GPU AMIs with Qwen3-8B-VLM weights&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;TBIE reconciliation for replay verification and automated recovery&quot;}]}]}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;The outcome was more than cost optimization.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;It fundamentally changed how the system behaved operationally:&quot;}]},{&quot;type&quot;:&quot;bulletList&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;near-zero or sub-minute startup latency&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;parallel GPU workers replacing sequential processing&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;event-driven replay handling&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;scale-to-demand orchestration&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;drastically reduced idle GPU waste&quot;}]}]}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;The upcoming write-up is not just about infrastructure changes.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;It is a deep dive into how TBIE reconciliation patterns were applied in Parjanya v2.0 to build replay-safe, scalable GPU inference orchestration in production.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;On Monday, I&#8217;ll be sharing the full TBIE case study deep dive covering:&quot;}]},{&quot;type&quot;:&quot;bulletList&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;why the original architecture struggled&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;the reasoning behind the migration&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;reconciliation-driven orchestration&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;replay-safe enrichment pipelines&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;burst-scale GPU worker design&quot;}]}]},{&quot;type&quot;:&quot;listItem&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;lessons learned from operating the system in production&quot;}]}]}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;One of the biggest lessons from this transition:&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Not every AI workload needs a managed ML platform.&quot;}]},{&quot;type&quot;:&quot;paragraph&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;Sometimes the real engineering challenge sits in orchestration, reconciliation, and operational resilience.&quot;}]}]},&quot;restacks&quot;:0,&quot;reaction_count&quot;:0,&quot;children_count&quot;:0,&quot;attachments&quot;:[{&quot;id&quot;:&quot;86f8c144-cee6-4a2d-9c22-124f46099fc5&quot;,&quot;type&quot;:&quot;image&quot;,&quot;imageUrl&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa14b656-f349-498c-8608-dd4e34858433_1672x941.png&quot;,&quot;imageWidth&quot;:1672,&quot;imageHeight&quot;:941,&quot;explicit&quot;:false}],&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;user_id&quot;:12091074,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;user_bestseller_tier&quot;:null,&quot;userStatus&quot;:{&quot;bestsellerTier&quot;:null,&quot;subscriberTier&quot;:1,&quot;leaderboard&quot;:null,&quot;vip&quot;:false,&quot;badge&quot;:{&quot;type&quot;:&quot;subscriber&quot;,&quot;tier&quot;:1,&quot;accent_colors&quot;:null},&quot;subscriber&quot;:null}},&quot;source&quot;:null,&quot;forumChannel&quot;:null}" data-component-name="CommentPlaceholder"></div><p><br>This is a detailed internal engineering deep dive into that migration. It covers the original architecture and its failure modes, the design decisions behind each new component, how TBIE (Truth, Belief, Intent, Execution) reconciliation patterns were applied to make the system replay-safe and operationally resilient, the specific production incidents encountered and how each shaped the architecture, and the guardrails now embedded to prevent regression.<br>Key outcome: the rebuilt system achieved near-zero or sub-minute startup latency, parallel GPU workers replacing sequential processing, event-driven replay handling, scale-to-demand orchestration, and drastically reduced idle GPU waste. More importantly, it became a system that could reason about and repair its own state &#8212; a reconciliation system, not just a pipeline.</p><h2>BACKGROUND: WHAT IS PARJANYA V2.0?</h2><p>Parjanya v2.0 is the image ingestion and GPU-powered visual scoring platform at Phagyul AI Systems. Photographers upload raw images; the platform extracts technical metadata (EXIF, resolution, format), performs visual-language model inference to produce content quality scores, enforces content policy, and writes enriched metadata back to the workflow database.</p><p><strong>The data flow is:</strong></p><ul><li><p>Photographers upload images to per-tenant S3 buckets via browser-based presigned URLs &#8594; An S3 event triggers a Graviton Lambda for EXIF extraction and technical validation.</p></li><li><p>On successful validation, a DynamoDB workflow row is written with status <code>pending_vlm_enrichment</code>.</p></li><li><p>A GPU worker consumes this work, runs <strong>Qwen3-8B-VLM inference</strong>, and writes scored metadata back(later recuration) to DynamoDB.</p></li><li><p>A control plane (replay Lambda, reconciliation loop) monitors for stalled or missing work and re-orchestrates as needed.</p></li><li><p>The platform spans immutable uploads (S3), workflow state (DynamoDB), intent queues (SQS), Lambda orchestration, GPU autoscaling (ASG + EC2), browser-side uploads with CORS policies, content policy enforcement, and tenant isolation.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xv1J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xv1J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Xv1J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Xv1J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Xv1J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xv1J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1482571,&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://blog.phagyul.ai/i/203346926?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.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_!Xv1J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Xv1J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Xv1J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Xv1J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b8942d-8039-4017-8555-afd877e2f0d7_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>THE ORIGINAL SAGEMAKER PIPELINE</h3><p>Parjanya&#8217;s first VLM inference implementation used Amazon SageMaker as the compute platform. A nightly batch job was triggered on a schedule. SageMaker endpoints were provisioned, images were submitted for inference in sequence, results were collected, and endpoints were torn down.</p><p>The original system worked. It produced correct results. But it had structural problems that compounded as the platform grew:</p><ul><li><p><strong>Cold-start tax:</strong> Every nightly run incurred GPU cold starts before the first image could be processed.</p></li><li><p><strong>Sequential execution:</strong> Image inference ran sequentially across the batch; there was no parallelism at the worker level.</p></li><li><p><strong>Fragile replay</strong>: Failed enrichments required increasingly fragile custom replay logic layered on top of SageMaker&#8217;s job model.</p></li><li><p><strong>Idle cost</strong>: The platform was billed for managed infrastructure overhead even during windows with no work to do.</p></li><li><p><strong>Throughput ceiling</strong>: Wall-clock time regularly stretched to approximately 11 hours per nightly run.</p></li></ul><h2>THE ARCHITECTURAL REFRAMING</h2><p>The decision to migrate was not triggered by a single catastrophic failure. It was triggered by a change in how the problem was understood.</p><div class="pullquote"><p><strong>&#8220;The problem was no longer &#8216;how do we run a model?&#8217;</strong><br>The real problem was: <strong>&#8216;how do we orchestrate burst-scale inference reliably, replay safely, and cost efficiently?&#8217;&#8221;</strong></p></div><p>Once the problem was stated that way, SageMaker was the wrong tool. SageMaker is an excellent managed platform for running models. It is not designed to be a burst-scale GPU orchestration layer with event-driven replay. Those properties had to be bolted on from outside, which is why the replay logic was fragile and why cold start latency was unavoidable.<br>Native AWS primitives offered a better fit for the actual problem: EC2 GPU instances could be pre-baked with model weights, Auto Scaling Groups could scale to demand rather than a fixed schedule, SQS provided durable, replayable intent, and EventBridge could trigger orchestration the moment new work appeared. The result is not a simpler system &#8212; it is a more intentional one.</p><h2>THE NEW ARCHITECTURE: NATIVE AWS- PRIMITIVES</h2><h3>EC2 GPU WARM POOLS</h3><p>Rather than provisioning GPU instances from scratch each time a job runs, Parjanya v2.0 uses EC2 warm pools attached to the Auto Scaling Group. Instances are pre-initialised and held in a stopped or standby state. When the ASG scales out, warm pool instances start in seconds rather than minutes, eliminating the cold start latency that dominated the original SageMaker pipeline.</p><blockquote><p><strong>Warm pool design note:</strong> instances in the warm pool must be pre-baked with model weights already on disk. Do not rely on model download during instance boot &#8212; download failures become silent launch failures. The AMI is the contract between infrastructure and runtime.</p></blockquote><h3>PRE-BAKED GPU AMIs WITH QWEN3-8B-VLM WEIGHTS</h3><p>Each GPU AMI is built with the <strong>Qwen3-8B-VLM</strong> model weights, runtime dependencies, and worker application code baked in. The AMI is immutable. When a new model version or dependency is needed, a new AMI is built and the launch template is updated. This makes the execution environment reproducible and testable before deployment.</p><h4>Key constraints on AMI design:</h4><p>All model weights must be present at AMI build time &#8212; no remote download at boot.<br>Python environment, CUDA libraries, and worker scripts must be included in the AMI.</p><p>The launch template image tag and the AMI must be kept in sync; stale launch templates are a production risk (see Incident 6).</p><p>Container and model artifact versions are a compatibility pair &#8212; they must be validated together.</p><h3>AUTO SCALING GROUPS (ASG)</h3><p>An Auto Scaling Group manages the GPU worker fleet. The ASG is configured with a minimum of 0 instances (scale-to-zero for cost efficiency) and a maximum that reflects the burst capacity needed during active processing windows. Desired capacity is driven by queue depth rather than a schedule.</p><h4>ASG configuration decisions:</h4><ol><li><p>Scale-out is triggered by the replay Lambda when SQS queue depth exceeds threshold.</p></li><li><p>Scale-in is time-based to prevent premature termination of in-flight workers.</p></li><li><p>Instance type selection balances GPU memory requirements (Qwen3-8B-VLM needs sufficient VRAM) against cost per inference.</p></li><li><p>Warm pool instances buffer the latency between a scale-out trigger and first inference.</p></li></ol><h3>SQS-DRIVEN ORCHESTRATION</h3><p>SQS is the durable intent layer. Each message represents a single VLM inference job for one image. Messages are not ephemeral transport &#8212; they are the replayable journal of work that must happen. This is a TBIE design principle: intent must survive transient failure.</p><h4>SQS configuration decisions:</h4><ul><li><p>Visibility timeout is set to exceed the maximum realistic inference time to prevent duplicate processing.</p></li><li><p>Queue retention is set to exceed the maximum expected outage window (e.g., weekend + holiday gap) so intent survives scale-to-zero periods.</p></li><li><p>A dead-letter queue captures messages that exceed the maximum receive count, enabling manual triage of terminal failures.</p></li><li><p>Message attributes carry routing metadata: tenant ID, image key, source bucket, expected output location.</p></li><li><p>Queue retention is not a generic operational setting. It is a resilience parameter. If the GPU fleet is at zero for 3 days, messages must still be present when the fleet wakes up. Set retention to match your worst-case outage window, not a default.</p></li></ul><h3>EVENTBRIDGE-TRIGGERED SCALE-OUT</h3><p>Scale-out is event-driven via EventBridge and DynamoDB Streams. When a DynamoDB row reaches <code>pending_vlm_enrichment</code>, the stream emits an event. A stream processor filters and batches records, then invokes the replay Lambda. The replay Lambda evaluates queue state (Belief) against database state (Truth), emits SQS messages (Intent), and increases ASG desired capacity (Execution trigger).<br>This replaces a polling model where a scheduled timer would periodically scan for work. The event-driven approach gives lower latency, eliminates wasted invocations during quiet periods, and makes the system&#8217;s reaction to new work causally clear:</p><blockquote><p><strong>Truth changes &#8594; control plane notices &#8594; Intent is created &#8594; Execution follows.</strong></p></blockquote><h3>REPLAY LAMBDA (CONTROL PLANE)</h3><p>The replay Lambda is the reconciliation control plane. It is invoked by DynamoDB Streams and by periodic safety-net schedules. Its job is to compare Truth (DynamoDB workflow state) against Intent (SQS queue depth) and repair any divergence: emitting missing messages, resetting stale state, and triggering ASG scale-out when work is present.<br>The replay Lambda is a first-class reliability surface, not a background helper. If it fails silently, every other safety net becomes weaker. Its observability must be stronger than ordinary worker observability.<br>Monitor its error rate, execution duration, and whether it successfully reads queue attributes. A lambda that runs but cannot see queue state is functionally blind.</p><h2>TBIE: TRUTH, BELIEF, INTENT, EXECUTION</h2><p>TBIE is the operating model used to design, debug, and evolve Parjanya v2.0. It decomposes a distributed system into four conceptually distinct layers. The model is most valuable as a diagnostic tool: when the system behaves unexpectedly, TBIE provides a structured vocabulary for identifying which layer has diverged.</p><h3>TRUTH</h3><p>Truth is the durable, authoritative record of what is actually true. It must survive worker restarts, deploys, transient outages, and infrastructure drift.<br>In Parjanya v2.0, Truth lives in:</p><p>S3 &#8212; immutable image uploads and preview artifacts. If an object is in S3, it exists.</p><p>DynamoDB &#8212; workflow rows recording status, EXIF metadata, VLM scores, curation state, and hashes.</p><p>Derived committed state &#8212; VLM output written durably after successful inference.</p><p><strong>Truth answers questions like: </strong></p><ul><li><p>What objects exist? </p></li><li><p>What stage is this image in? </p></li><li><p>What has been computed? </p></li><li><p>What is the authoritative record for this batch?</p></li></ul><h3>BELIEF</h3><p>Belief is the operational view of reality. It is derived from Truth and current signals, but it may lag, be partial, or be noisy. Belief is what operators see first &#8212; but it must never be confused with source-of-record Truth.</p><p>In Parjanya, Belief includes:</p><ol><li><p>SQS queue depth and in-flight message counts.</p></li><li><p>ASG desired capacity, running instance count, and warm pool state.</p></li><li><p>Worker health signals and CloudWatch alarms.</p></li><li><p>GPU availability and instance lifecycle state.</p></li></ol><p>A healthy Belief is not the same as a healthy system. The queue can appear empty while Truth still holds a large pending backlog. That gap is a reconciliation failure, not an idle system.</p><h3>INTENT</h3><p>Intent is the durable record of work that has been requested. It is the replayable journal of &#8216;<em>please do this work</em>.&#8217; </p><p>The critical property of Intent is replayability: if Intent can be lost too early, transient failures become permanent failures requiring manual rescue.</p><p>In Parjanya, Intent is:</p><ul><li><p>SQS messages &#8212; each representing a single VLM inference job.</p></li><li><p>Replay jobs &#8212; reconstructed Intent emitted for rows that had pending Truth without corresponding queue messages.</p></li><li><p>Regrade jobs &#8212; Intent emitted for historical reprocessing after policy changes.</p></li></ul><h3>EXECUTION</h3><p>Execution is the stateless work that turns Intent into side effects and updated Truth. Execution is where work happens, but in a resilient system it must never be allowed to erase the record of what was supposed to happen.</p><p>In Parjanya, Execution includes:</p><ul><li><p>Graviton Lambdas for EXIF extraction and technical validation.</p></li><li><p>GPU workers running Qwen3-8B-VLM inference and writing scored results to DynamoDB.</p></li><li><p>Replay Lambda emitting Intent and triggering ASG scale-out.</p></li><li><p>ASG and EC2 actions that instantiate the worker fleet.</p></li></ul><h3>TBIE AS A DIAGNOSTIC MODEL</h3><p>The power of TBIE is operational. Once internalised, it changes the first question asked during any incident. The question is no longer &#8216;<em>is the queue healthy?</em>&#8217; or &#8216;<em>are the GPU workers running?</em>&#8217; Those are Belief signals. The real question is:</p><blockquote><p><strong>Is the system waiting because Intent is missing &#8212; or because Intent is present but Execution cannot realise it?</strong></p></blockquote><p>That single question narrows the search space dramatically and prevents wasted time on the wrong layer.</p><h2>EVENT-DRIVEN RECONCILIATION</h2><p>Parjanya initially used a scheduled polling model. A timer would wake the replay Lambda periodically. The Lambda would scan for pending work and, if appropriate, emit SQS messages and trigger GPU autoscaling. This worked but introduced avoidable latency, wasted invocations, and operational ambiguity.<br>The move to DynamoDB Streams changed the architecture fundamentally. Now, when a workflow row reaches pending_vlm_enrichment, the stream emits an event immediately. An event source mapping filters for relevant writes, batches records briefly, and invokes the replay Lambda. The Lambda discovers missing or retriable work, emits Intent into SQS, and kicks the GPU ASG when necessary.</p><h4><strong>The net effect:</strong></h4><p>Reconciliation latency dropped from <code>O(poll_interval) to O(stream_propagation)</code> &#8212; typically seconds.</p><ul><li><p>Wasted Lambda invocations during idle periods eliminated.</p></li><li><p>Causal chain made explicit: Truth changes &#8594; stream emits &#8594; Lambda reacts &#8594; Intent created &#8594; Execution follows.</p></li><li><p>Operators can reason about system state without wondering &#8216;has the next poll happened yet?&#8217;</p></li><li><p>A reconciliation system does not rely on humans noticing a stalled queue and manually fixing it. </p></li></ul><p>It detects, explains, and repairs the divergence between Truth and Intent on its own. Event-driven streaming is what makes that self-repair fast enough to be useful in production.</p><h2>PRODUCTION FAILURE MODES &amp; LESSONS</h2><p>The following incidents occurred during the development and operation of Parjanya v2.0. Each is documented here not as a post-mortem but as a design lesson &#8212; how the failure shaped the architecture, and what guardrail was added as a result. TBIE is used throughout as the diagnostic lens.</p><h3>Incident 1: Transient GPU Failure Destroying Intent</h3><p>GPU workers were deleting SQS messages before the retry window had been exhausted. A worker could encounter a temporary S3 download failure or an OOM condition, write a failure status to DynamoDB, and still delete the queue message. At that point, Truth said the work had failed, but Intent no longer existed &#8212; the system had no automatic path to retry.</p><h4>TBIE diagnosis: Execution destroyed Intent prematurely.</h4><h4><strong>Resolution</strong>: </h4><p>Workers now return explicit outcome signals: retry, terminal_failure, or completed.</p><p><strong>retry</strong>: preserve the message. Visibility timeout and receive count govern re-attempts.</p><p><strong>terminal_failure</strong>: write durable failed Truth, then delete the message.</p><p><strong>completed</strong>: write final Truth, then delete the message.</p><p>That separation preserves replayability while still allowing durable failure when necessary. The message deletion decision became a function of execution outcome, not a side effect of worker exit.</p><h1>Worker outcome protocol</h1><p><code>if outcome == &#8216;retry&#8217;:<br># Do NOT delete. Let visibility timeout expire.<br>  return # SQS will re-deliver<br>elif outcome == &#8216;terminal_failure&#8217;:<br>  write_durable_failure(db, image_id)<br>  sqs.delete_message(receipt_handle)<br>elif outcome == &#8216;completed&#8217;:<br>  write_enriched_truth(db, image_id, scores)<br>  sqs.delete_message(receipt_handle)</code></p><h3>Incident 2: Pending Truth Without Intent (Reconciliation Gap)</h3><p>DynamoDB rows remained in <code>pending_vlm_enrichment</code> status, but no corresponding SQS messages existed. Queue depth showed zero. The system appeared idle. The backlog still existed in Truth but was invisible to Execution.</p><h4>TBIE diagnosis: Truth was pending while Intent never existed. Classic reconciliation gap.</h4><h4><strong>Resolution</strong>:</h4><ul><li><p>The replay Lambda now scans for pending rows without corresponding queue messages.</p></li><li><p>For each orphaned pending row, it regenerates a queue message and kicks the GPU ASG.</p></li><li><p>DynamoDB Streams ensure this scan is triggered promptly rather than waiting for a polling cycle.</p></li><li><p>The key insight: this is not a worker bug. Workers cannot fix work that was never queued. The control plane must own the responsibility of keeping Truth and Intent aligned.</p></li></ul><h3>Incident 3: Retry vs. Replay Distinction</h3><p>Some failures &#8212; S3 download errors, temporary GPU OOM &#8212; are retryable once the underlying condition is fixed. But simply re-enqueueing the message is insufficient when the workflow row contains partial or stale derived fields from the failed attempt.</p><h4>TBIE clarification: </h4><h4>a retry is another attempt at the same execution. A replay is a deliberate reset to a pre-execution boundary, removal of stale derived state, and emission of fresh Intent.</h4><h4><strong>Resolution</strong>:</h4><p><strong>Retry</strong>: re-attempt on the existing message, preserving current workflow state.</p><p><strong>Replay</strong>: reset the DynamoDB row to a clean pre-VLM boundary (clear stale score fields, VLM status, partial outputs), then emit a fresh SQS message.</p><p>Replay is a controlled reconstruction, not just another attempt on top of corrupted state. The distinction prevents accumulating corrupted derived fields across multiple failed attempts.</p><h3>Incident 4: Wrong Bucket, Right Key (Deterministic Misrouting)</h3><p>An SQS payload pointed to a valid preview key but in the wrong bucket. The worker repeatedly failed with S3 download errors even though the file existed &#8212; just not at that address. This was deterministic misrouting, not flaky execution.</p><h4>TBIE diagnosis: Intent encoded the wrong target. Not an Execution failure &#8212; an Intent construction failure.</h4><h4><strong>Resolution:</strong></h4><p>Preview keys now canonically use the uploads bucket as the authoritative source.<br>Intent construction validates bucket routing before emitting to SQS.<br>Eligibility checks were tightened: only objects confirmed present in the correct bucket are enqueued.<br>The lesson generalises: Intent must encode the correct target, not just some valid key. A message that is &#8216;almost correct&#8217; will fail deterministically and indefinitely until the Intent itself is repaired.</p><h3>Incident 5: Policy Change Requiring Historical Replay</h3><p>Content policy was updated to more strictly reject non-photographic content: screenshots, banners, infographics, social cards, slides, illustrations, and mockups. Historical images scored under the old policy needed to be re-evaluated.</p><h4>TBIE framing: policy change = controlled replay, not a patching exercise.</h4><h4><strong>Resolution:</strong></h4><p>Affected rows were identified by policy version marker in DynamoDB.<br>Each affected row was reset to a pre-VLM boundary: stale score fields cleared, VLM status reset to pending.<br>Fresh Intent was emitted into SQS so GPU workers re-scored under the new policy.<br>This is one of the most powerful properties of a replay-native system: policy evolution does not require one-off correction scripts. It becomes a controlled reprocessing event with clear before-and-after semantics. The same replay machinery used for failure recovery also handles deliberate re-evaluation.</p><h3>Incident 6: Execution Drift Below the Application Layer</h3><p>Two distinct incidents exposed failures where application code was correct but the execution environment was stale.</p><h4>6a: Stale Launch Template (Image Tag)</h4><p>A launch template continued to reference an old image tag that no longer existed. Cloud-init failed when pulling the nonexistent container image, and the GPU instance came up without ever starting the worker. The worker log group was empty &#8212; the application layer never ran.<br>Complete silence in the GPU log group is a critical signal. It usually means execution failed before the application layer started: image pull failure, IAM denial during bootstrap, or cloud-init crash.</p><h4>6b: Incomplete AMI (Missing Model Artifacts)</h4><p>A separate incident involved an AMI that was missing the Python files required by Qwen3-8B-VLM (a model that relies on remote code). The container started successfully, but the model loader crashed because local artifacts were incomplete.</p><h4><strong>Resolution &#8212; both incidents:</strong></h4><ul><li><p>Launch templates now include version assertions checked at deployment time.<br>AMI build pipelines validate the presence and integrity of all model artifacts before publishing.</p></li><li><p>Container version and model artifact version are treated as a compatibility pair, validated together.</p></li><li><p>Deployment tooling refreshes launch templates automatically when image tags change.</p></li></ul><h3>Incident 7: CORS and Browser Upload Split-State Failure</h3><p>The backend could write a pending upload record and generate a presigned URL, but the browser&#8217;s PUT could fail because of CORS misconfiguration. In that case, Truth at the API layer looked correct while Execution at the browser layer never completed.<br>Investigation revealed multiple independent configuration failures could co-exist: a bucket rejecting wildcard origins under restricted public bucket settings, while the client simultaneously used a global S3 endpoint that returned redirects that browsers would not follow on OPTIONS preflight.</p><h4>TBIE diagnosis: </h4><h4>Intent existed (presigned URL generated, pending row written). Execution was blocked by infrastructure configuration drift. Two independent misconfiguration layers were both wrong simultaneously.</h4><h4><strong>Resolution:</strong></h4><ul><li><p>CORS policies are version-controlled and validated in CI before deployment.</p></li><li><p>Bucket CORS and public access settings are treated as a matched pair, not configured independently.</p></li><li><p>Upload path includes client-side detection of presigned URL PUT failure with structured error reporting.</p></li><li><p>Pending rows created without a completed upload are detected by the replay Lambda and age-gated before re-emission.</p></li></ul><h3>Incident 8: Control Plane Blindness (Replay Lambda IAM Failure)</h3><p>The replay Lambda lacked permission to read SQS queue attributes. The function continued to be scheduled and invoked, but it crashed before it could inspect Belief (queue depth) or emit Intent. From the outside, everything appeared enabled. In reality, the control plane had gone blind.</p><p>This is the most dangerous failure mode in the system. A silently failing control plane means every other safety net weakens simultaneously. Worker failures that should self-repair accumulate without rescue. Operators see green infrastructure dashboards while reconciliation has effectively stopped.</p><h4><strong>Resolution:</strong></h4><ul><li><p>The replay Lambda&#8217;s IAM policy now explicitly grants <code>sqs:GetQueueAttributes</code>, <code>sqs:GetQueueUrl</code>, and <code>sqs:SendMessage</code>.</p></li><li><p>IAM policy drift is checked in deployment assertions &#8212; the Lambda will not deploy if required permissions are absent.</p></li><li><p>The Lambda now emits a structured heartbeat metric on every successful invocation, including after inspecting queue state.</p></li><li><p>Alarm on absence of heartbeat metric: silence means the control plane has likely failed.</p></li></ul><p>The operational philosophy shift from this incident: worker failures are recoverable noise. Control-plane blindness is a systemic risk. Observability on the control plane must be stronger than on individual workers.</p><h3>Incident 9: Dynamic Tenant Discovery and Queue Retention</h3><p>As the platform grew, static tenant lists became a bottleneck. Reconciliation could not depend on manually editing infrastructure configuration every time a new tenant was onboarded. Additionally, when the GPU fleet was scaled to zero for cost savings, queue retention was set too short &#8212; messages expired before the fleet woke up.</p><h4>Resolution:</h4><p>The control plane moved to dynamic tenant discovery from DynamoDB. Tenant registry markers are written by the upload path and discovered by the replay Lambda at runtime.<br>Queue retention policy was extended to match the maximum expected outage window, not an idealised constant.<br>New tenant onboarding now automatically creates the required DynamoDB registry marker without manual infrastructure changes.</p><h2>OPERATIONAL MODEL AND RUNBOOK THINKING</h2><p>By the time Parjanya matured into an event-driven reconciliation system, the debugging approach itself had changed. The starting question is no longer &#8216;<em><strong>is the queue healthy?</strong></em>&#8217; or &#8216;<em><strong>are GPU workers running?</strong></em>&#8217; &#8212; those are <strong>Belief signals</strong>. Every incident investigation now begins with a TBIE classification:</p><h3>THE DIAGNOSTIC SEQUENCE</h3><ul><li><p><strong>Step 1: Check Truth</strong></p></li></ul><p>Is DynamoDB accumulating rows in <code>pending_vlm_enrichment</code>? If so, the platform believes unfinished work exists, regardless of what the queue shows. A growing Truth backlog is the authoritative signal that the system is behind.</p><ul><li><p><strong>Step 2: Check Intent</strong></p></li></ul><p>Does SQS contain replayable work items? High Truth backlog + near-zero queue depth = reconciliation failure, not execution failure. The replay Lambda itself becomes suspect. Either it stopped emitting Intent, or it lost the ability to discover the work.</p><ul><li><p><strong>Step 3: Check Execution</strong></p></li></ul><p>If Intent exists but the backlog still does not move, shift to Execution health. GPU worker logs become critical. Check for:</p><ol><li><p>Deterministic S3 download errors (wrong bucket routing &#8212; see Incident 4).<br>Repeated OOM crashes (model too large for instance type).</p></li><li><p>Complete log group silence (execution failed before the application layer &#8212; check cloud-init).</p></li><li><p>Stale launch template (image tag no longer exists &#8212; check ASG launch configuration).</p></li></ol><ul><li><p><strong>Step 4: Check the Control Plane</strong></p></li></ul><p>If queue visibility is unchanged while pending Truth continues growing, the replay Lambda itself is the focus. Check: Is it being invoked? Is it completing successfully? Can it read <code>sqs:GetQueueAttributes</code>? Is it emitting its heartbeat metric?</p><p><strong>Operational summary of diagnostic signals:</strong></p><ul><li><p>Truth backlog growing &#8594; unfinished work exists</p></li><li><p>Intent near zero despite Truth backlog &#8594; reconciliation failure</p></li><li><p>Intent present but Execution failing &#8594; runtime or routing failure</p></li><li><p>GPU log silence &#8594; bootstrap failure (cloud-init, image pull, IAM at boot)</p></li><li><p>Replay Lambda silence &#8594; control-plane failure (IAM, crash, permission gap)</p></li><li><p>No heartbeat metric &#8594; control plane has gone blind</p></li></ul><h3>INCIDENT RESPONSE DECISION TREE</h3><h4>At 02:00 AM, when the queue looks empty but customers are waiting:</h4><ol><li><p>Check Truth: pull DynamoDB pending count. If non-zero, the system is behind regardless of queue state.</p></li><li><p>Check replay Lambda logs: has it run in the last cycle? Did it complete? Did it emit messages?</p></li><li><p>Check SQS: are messages present? If Truth is high and SQS is low, replay Lambda is suspect.</p></li><li><p>Check ASG desired capacity: did the Lambda set it correctly? Check CloudWatch ASG activity log.</p></li><li><p>Check GPU worker logs: any entries? Silence means boot failure. Errors usually indicate routing or model issues.</p></li><li><p>Check IAM: can the Lambda call sqs:GetQueueAttributes? Can the worker read the correct S3 bucket?</p></li><li><p>Check launch template: does the image tag still exist? Pull the AMI manifest.</p></li><li><p>OUTCOMES<br>The migration from SageMaker to native AWS primitives, combined with TBIE reconciliation, changed both the cost profile and the operational character of the pipeline.</p></li></ol><h3>OPERATIONAL IMPROVEMENTS</h3><ul><li><p>Latency: Startup latency: near-zero or sub-minute (down from 20&#8211;40 minutes cold start on SageMaker).</p></li><li><p>Parallelism: Workers process images in parallel rather than sequentially &#8212; throughput scales with fleet size.</p></li><li><p>Throughput: Wall-clock time reduced dramatically from the ~11 hour nightly baseline.</p></li><li><p>Replay: Event-driven replay handles failures automatically without manual intervention for most failure classes.</p></li><li><p>Cost: Scale-to-zero when no work is present; burst capacity available within seconds via warm pools.</p></li></ul><h3>ARCHITECTURAL IMPROVEMENTS</h3><p>The system can repair its own state: Truth without Intent is detected and corrected by the control plane.<br>Policy changes are handled as replay events &#8212; no custom migration scripts needed.<br>Tenant onboarding is dynamic &#8212; no infrastructure changes required per tenant.<br>Execution environments are immutable and reproducible via pre-baked AMIs.<br>Control plane observability now triggers independent alerting paths from worker failures.</p><h3>THE BROADER LESSON</h3><p>Not every AI workload needs a managed ML platform. Sometimes the real engineering challenge sits in orchestration, reconciliation, and operational resilience &#8212; not in model serving. When the problem is &#8216;how do we run a model?&#8217;, SageMaker is the right answer. When the problem is &#8216;<em><strong>how do we orchestrate burst-scale inference reliably, replay safely, and cost efficiently?</strong></em>&#8217;, native primitives and a clear reconciliation model are the right answer.</p><h2>GUARDRAILS, MAINTENANCE, AND OPERATIONAL CHECKLIST</h2><p>Parjanya&#8217;s reliability is not a property of its initial design. It is the accumulated result of incidents converted into permanent controls. The following checklist encodes what the system has already learned.</p><h3>INTENT PRESERVATION</h3><ul><li><p>Workers never delete SQS messages unless the outcome is terminal_failure or completed.</p></li><li><p>Visibility timeout exceeds maximum realistic inference time.</p></li><li><p>Queue retention exceeds maximum expected outage window.</p></li><li><p>Dead-letter queue is monitored and reviewed regularly.</p></li></ul><h3>EXECUTION ENVIRONMENT INTEGRITY</h3><p>Launch template image tags are validated against existing AMIs at deployment time.</p><p>AMI build pipelines assert presence of all model artifacts before publishing.</p><p>Container version and model artifact version are validated as a compatibility pair.</p><p>Launch templates are refreshed automatically when image tags change.</p><p>Python lockfiles are used to prevent dependency drift inside worker environments.</p><h3>CONTROL PLANE HEALTH</h3><p>Replay Lambda emits a structured heartbeat metric on every successful execution.</p><p>Alarm fires if heartbeat is absent for more than one poll cycle.</p><p>IAM policy grants for the Lambda are validated in deployment assertions.</p><p>Lambda error rate and duration are independently alarmed.</p><p>Control-plane CloudWatch logs are retained and searchable for incident forensics.</p><h3>RECONCILIATION INTEGRITY</h3><p>Truth backlog (pending DynamoDB rows) is monitored as a primary SLI.<br>Intent gap (pending Truth with no corresponding queue message) is checked by the Lambda on each invocation.</p><p>Replay logic resets Truth cleanly to a pre-execution boundary before re-emitting Intent.</p><p>Tenant discovery is dynamic &#8212; no manual configuration changes needed on onboarding.</p><p>Queue retention policy change requires explicit engineering review.</p><h3>INFRASTRUCTURE DRIFT PREVENTION</h3><p>CORS policies are version-controlled and validated in CI.</p><p>Bucket CORS and public access settings are configured as a matched pair.</p><p>API schema and frontend types have drift detection in CI.</p><p>S3 bucket routing is validated at Intent construction time, not only at worker download time.</p><h3>POLICY AND REGRADE</h3><p>Content policy version is stored per image in DynamoDB.</p><p>Policy changes trigger replay jobs for images scored under previous policy versions.</p><p>Regrade jobs use the same replay machinery as failure recovery &#8212; no custom tooling.</p><h2>IMPLICATIONS FOR AI PLATFORM DESIGN</h2><p>TBIE generalises beyond Parjanya. Any AI platform that spans storage, metadata, asynchronous work, GPU execution, and policy evolution benefits from the same model. The key is to stop thinking of the system as a one-way pipeline and treat it as a reconciliation loop that continuously restores alignment between durable truth and intended work.</p><p>That shift changes concrete architecture choices:</p><p>Queues: Queues become journals of intent rather than temporary transport.</p><p>Replay: Replay becomes a first-class product capability, not an ops workaround.</p><p>Autoscaling: Autoscaling becomes a consequence of work existing, not a heuristic guess.</p><p>Model packaging: Model packaging becomes part of execution correctness, not just deployment.</p><p>Browser uploads: Browser upload behaviour becomes part of the end-to-end reliability model.</p><p>Policy change: Policy change becomes a replay event rather than a manual repair task.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;5c4582d3-6e65-4595-bc62-caf291fd4f91&quot;,&quot;caption&quot;:&quot;In my previous post few weeks ago, I introduced TBIE &#8212; Truth, Belief, Intent and Execution &#8212; as a framework for reasoning about resilient distributed systems.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;From Pipeline to Platform &quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-06-22T05:45:48.801Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!AEfT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/from-pipeline-to-platform&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:203038071,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>The right mental model for modern AI infrastructure is not &#8216;build a pipeline.&#8217; It is &#8216;build a system that can continuously reconcile truth and intent until intended work is actually realised.&#8217;</p><h2>APPENDIX A: COMPONENT MAPPING TABLE</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VsTY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VsTY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!VsTY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!VsTY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!VsTY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VsTY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/360055ee-b572-404b-8939-928d326bbddd_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1601859,&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://blog.phagyul.ai/i/203346926?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.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_!VsTY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!VsTY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!VsTY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!VsTY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F360055ee-b572-404b-8939-928d326bbddd_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>APPENDIX B: KEY TERMS</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Eth4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Eth4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Eth4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Eth4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Eth4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Eth4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1470043,&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://blog.phagyul.ai/i/203346926?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.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_!Eth4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Eth4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Eth4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Eth4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87cb7a50-8d9c-452e-9e55-1261931326f1_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[From Pipeline to Platform ]]></title><description><![CDATA[Event-Driven TBIE Architecture, Reconciliation Patterns, and the Lessons from Building Parjanya v2.0]]></description><link>https://blog.phagyul.ai/p/from-pipeline-to-platform</link><guid isPermaLink="false">https://blog.phagyul.ai/p/from-pipeline-to-platform</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Mon, 22 Jun 2026 05:45:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AEfT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In my previous post few weeks ago, I introduced TBIE &#8212; Truth, Belief, Intent and Execution &#8212; as a framework for reasoning about resilient distributed systems.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;869ed1a6-1c56-4907-a5b6-bcd1c8d765ad&quot;,&quot;caption&quot;:&quot;Abstract&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;TBIE in Practice: Designing Resilient AI Pipelines That Recover, Reconcile, and Re-run&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-25T05:36:28.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!ok-g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/tbie-in-practice-designing-resilient&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:199145206,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>The framework emerged from a simple observation:</p><p>Distributed systems rarely fail through catastrophic outages.</p><p>More often, they fail through divergence.</p><p>Truth says one thing.<br>Execution does another.<br>Intent disappears.<br>Belief becomes detached from reality.</p><p>TBIE gave me a vocabulary for understanding those failures.</p><p>What I did not fully appreciate at the time was the architectural consequence of taking TBIE seriously.</p><p>I thought I was building an AI pipeline.</p><p>I ended up building a platform.</p><div class="pullquote"><p>More specifically, I ended up building a reconciliation-driven control plane whose primary responsibility was not inference, enrichment, scoring, or curation.</p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AEfT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AEfT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png 424w, https://substackcdn.com/image/fetch/$s_!AEfT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png 848w, https://substackcdn.com/image/fetch/$s_!AEfT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png 1272w, https://substackcdn.com/image/fetch/$s_!AEfT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AEfT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png" width="1536" height="950" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:950,&quot;width&quot;:1536,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1673176,&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://blog.phagyul.ai/i/203038071?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd724deb0-7e36-4332-9a5a-3b8d4d003179_1536x1024.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_!AEfT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png 424w, https://substackcdn.com/image/fetch/$s_!AEfT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png 848w, https://substackcdn.com/image/fetch/$s_!AEfT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.png 1272w, https://substackcdn.com/image/fetch/$s_!AEfT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3c006b-8d0e-4176-8bfc-72a45027eb6d_1536x950.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Its primary responsibility was preserving correctness.</p><p>That realization fundamentally changed how I thought about reliability.</p><p>The hard problems in Parjanya v2.0 were not model problems.</p><p>They were coordination problems.</p><ul><li><p>Not GPU problems.</p></li><li><p>Not inference problems.</p></li><li><p>Not even scaling problems.</p></li></ul><p>The hardest problems emerged whenever the system lost alignment between:</p><ul><li><p>what was true,</p></li><li><p>what work should exist,</p></li><li><p>what execution was currently happening,</p></li><li><p>and what the system believed was happening.</p></li></ul><p>The original architecture looked deceptively simple.</p><p>Images landed in S3.</p><p>Metadata was written into DynamoDB.</p><p>Validation ran through Lambda functions.</p><p>GPU workers performed VLM enrichment and IQA processing.</p><p>Results were written back into DynamoDB.</p><p>Autoscaling reacted to queue depth.</p><p>At first glance, it looked like a fairly conventional event-driven AI pipeline.</p><p>Production quickly proved otherwise.</p><p>Workers crashed.</p><p>Queues drained without progress.</p><p>Pending images remained pending forever.</p><p>Retries became impossible.</p><p>Infrastructure drifted away from declared state.</p><p>The system could remain technically healthy while doing absolutely nothing useful.</p><p>That was the moment I realised we were solving the wrong problem.</p><p>The challenge was not moving images through a pipeline.</p><p>The challenge was continuously reconciling distributed state.</p><p>Once viewed through that lens, the architecture began evolving in a very different direction.</p><p>The replay engine stopped being a utility.</p><p>It became the control plane.</p><p>Queues stopped being transport mechanisms.</p><p>They became durable Intent.</p><p>Autoscaling stopped being a scaling feature.</p><p>It became a realization layer for Intent.</p><p>And the system itself stopped behaving like a pipeline.</p><p>It started behaving like a platform.</p><p>This article is the story of that evolution.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UWpj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UWpj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!UWpj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!UWpj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!UWpj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UWpj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1545865,&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://blog.phagyul.ai/i/203038071?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.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_!UWpj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!UWpj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!UWpj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!UWpj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a269d84-eb4b-47c5-9cf4-3ba9f3a72c9e_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Preface</h2><p>Distributed systems rarely fail in the way architecture diagrams suggest.</p><p>The boxes stay alive. The queues still exist. The databases continue accepting writes. The autoscaling groups look healthy. The dashboards even remain green.</p><p>And yet the system silently stops doing useful work.</p><p>An image sits in a pending state forever. A queue drains but no GPU ever runs. A worker crashes and deletes the only replayable work item. A presigned upload URL looks valid but browser execution never begins. A GPU instance launches correctly while the actual container inside it continuously crashloops.</p><p>Most production failures are not total outages. They are reconciliation failures.</p><p>Something the system believes should happen never actually happens. Or something already completed continues to look pending. Or a control plane silently loses the ability to coordinate execution.</p><p>Parjanya v2.0 forced us to confront this repeatedly.</p><p>Initially, the architecture looked straightforward:</p><ul><li><p>Images upload into S3</p></li><li><p>Metadata lands in DynamoDB</p></li><li><p>Lambdas perform validation and enrichment</p></li><li><p>GPU workers run VLM and IQA workloads</p></li><li><p>Results are written back into DynamoDB</p></li><li><p>Autoscaling follows queue depth</p></li></ul><p>At first glance, this looked like a normal AI pipeline.</p><p>In practice, it evolved into something else.</p><p>The deeper challenge was not inference. The challenge was maintaining alignment between:</p><p>the durable truth of the system,<br>the operational understanding of the system,<br>the work the system intended to perform,<br>and the execution layer actually performing it.</p><blockquote><p>Truth &#8594; Belief &#8594; Intent &#8594; Execution</p></blockquote><p>TBIE was never intended as branding. It emerged as an operational language for reasoning about reliability.</p><p>The model eventually shaped:</p><p>the event-driven reconciliation architecture,<br>the autoscaling strategy,<br>the replay model,<br>the control plane,<br>failure recovery,<br>multi-tenant orchestration,<br>policy regrading,<br>infrastructure debugging,<br>and eventually the broader direction of Parjanya itself.</p><p>This article is a deep dive into that journey.</p><p>It is not a summary. It is a detailed architectural walkthrough of:</p><p>how TBIE emerged,<br>why event-driven reconciliation mattered,<br>what failed in production,<br>how those failures were diagnosed,<br>and why reconciliation patterns matter far more than most AI infrastructure discussions acknowledge.</p><p>The goal is not merely to explain Parjanya.</p><p>The goal is to explain how resilient AI systems are actually built.</p><h2>1. The Real Problem in Distributed AI Systems</h2><p>Most modern AI infrastructure discussions focus heavily on models.</p><p>Which VLM?<br>Which embedding strategy?<br>Which vector database?<br>Which GPU?<br>Which inference framework?<br>Which quantization?</p><p>These questions matter.</p><p>But they are not usually what breaks systems.</p><p>The real production problems tend to look different:</p><p>Work disappears.<br>Retries become impossible.<br>Workers process stale state.<br>Uploads partially succeed.<br>Queues drain without progress.<br>Control planes silently stop coordinating.<br>Autoscaling behaves correctly against the wrong metric.<br>Infrastructure layers drift away from declared source-of-truth.</p><p>In other words:</p><p>The problem is not merely computation. The problem is reconciliation.</p><p>Distributed systems are fundamentally coordination systems.</p><p>A resilient architecture needs to answer:</p><p>What is the durable truth?<br>What work should exist?<br>What execution is currently happening?<br>Can the system reconstruct work after failures?<br>Can the system distinguish transient failure from terminal failure?<br>Can infrastructure drift be detected?<br>Can the system replay work safely?<br>Can policy changes be re-applied deterministically?</p><p>Most architectures answer these implicitly.</p><p>TBIE attempts to answer them explicitly.</p><h2>2. TBIE &#8212; Truth, Belief, Intent, Execution</h2><p>The TBIE model separates distributed systems into four operational layers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JoPa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JoPa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JoPa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JoPa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JoPa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JoPa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1312875,&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://blog.phagyul.ai/i/203038071?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.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_!JoPa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JoPa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JoPa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JoPa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa319b520-37eb-4f90-ab0a-b458e9b31038_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The model becomes powerful because it forces explicit boundaries.</p><h3>Truth</h3><p>Truth represents the authoritative record.</p><p>Truth must be:</p><p>durable,<br>reconstructable,<br>queryable,<br>replayable,<br>and independent of transient execution state.</p><p>In Parjanya:</p><p>S3 object bytes are Truth.<br>DynamoDB workflow fields are Truth.<br>Pipeline status transitions are Truth.<br>Curation outputs are Truth.<br>Hashes and metadata are Truth.</p><p>Truth is what remains after workers crash.</p><p>Truth is what survives retries.</p><p>Truth is what operators use to reconstruct system state.</p><h3>Belief</h3><p>Belief is operational understanding.</p><p>Belief is not always perfectly accurate.</p><p>Examples:</p><ul><li><p>Queue depth</p></li><li><p>Autoscaling desired capacity</p></li><li><p>In-flight SQS messages</p></li><li><p>Worker health</p></li><li><p>Current GPU availability</p></li><li><p>Visibility timeout state</p></li></ul><p>Belief may lag reality. Belief may be partial. Belief may even temporarily be wrong.</p><p>But Belief matters because orchestration depends on it.</p><p>Importantly:</p><p>Belief should be derivable from Truth + Intent.</p><p>That distinction becomes critical later.</p><h3>Intent</h3><p>Intent represents durable declarations of work.</p><p>Intent answers:</p><blockquote><p>&#8220;What should the system attempt next?&#8221;</p></blockquote><p>In Parjanya:</p><p>SQS messages are Intent.<br>Replay queues are Intent.<br>Regrade operations are Intent.<br>Retry workflows are Intent.</p><p>Intent is one of the most important concepts in the entire architecture.</p><p>Execution should never destroy Intent casually.</p><p>Why?</p><p>Because Intent is replayability.</p><p>Without replayable Intent:</p><p>transient failures become permanent,<br>retries become manual,<br>reconciliation becomes impossible,<br>and the system loses self-healing capability.</p><h3>Execution</h3><p>Execution is the stateless machinery that realizes work.</p><p>Execution includes:</p><p>Lambdas,<br>GPU workers,<br>autoscaling groups,<br>validation services,<br>EXIF processors,<br>and inference pipelines.</p><p>Execution should ideally be:</p><p>disposable,<br>reproducible,<br>restartable,<br>and stateless.</p><p>If an execution worker disappears, the system should still be able to recover from Truth + Intent.</p><p>That principle drove many later architectural decisions.</p><h2>3. Mapping TBIE onto Parjanya v2.0</h2><p>Once TBIE became the operational lens, the architecture became easier to reason about.</p><h3>Truth Layer</h3><p>Truth in Parjanya consisted primarily of:</p><p><strong>S3</strong></p><ul><li><p>original uploads,</p></li><li><p>RAW image payloads,</p></li><li><p>generated previews,</p></li><li><p>derived thumbnails,</p></li><li><p>metadata artifacts.</p></li></ul><p><strong>DynamoDB</strong></p><p>Workflow state:</p><ul><li><p>batch_status</p></li><li><p>pipeline_status</p></li><li><p>curation</p></li><li><p>quality scores</p></li><li><p>VLM outputs</p></li><li><p>EXIF metadata</p></li><li><p>technical validation</p></li><li><p>image hashes</p></li><li><p>routing information</p></li></ul><p>Truth represented the durable state of every image.</p><h3>Intent Layer</h3><p>Intent existed primarily in SQS.</p><p>Examples:</p><ul><li><p>ml-large-jobs</p></li><li><p>replay queues</p></li><li><p>regrade operations</p></li><li><p>retry workflows</p></li></ul><p>Each Intent payload encoded:</p><ul><li><p>bucket,</p></li><li><p>object key,</p></li><li><p>tenant,</p></li><li><p>image id,</p></li><li><p>execution metadata.</p></li></ul><p>Intent was intentionally replayable.</p><p>That design decision later prevented multiple catastrophic replay-loss scenarios.</p><h3>Belief Layer</h3><p>Belief included:</p><ul><li><p>ASG desired capacity,</p></li><li><p>queue visibility counts,</p></li><li><p>in-flight message counts,</p></li><li><p>CloudWatch metrics,</p></li><li><p>worker availability,</p></li><li><p>queue backlog,</p></li><li><p>GPU scale state.</p></li></ul><p>Belief drove orchestration.</p><p>For example:</p><ul><li><p>queue depth controlled autoscaling,</p></li><li><p>replay Lambdas checked queue visibility,</p></li><li><p>scaling decisions relied on approximate message counts.</p></li></ul><p>Belief was operationally useful but never fully authoritative.</p><h3>Execution Layer</h3><p>Execution included:</p><p><strong>Lambda Workers</strong></p><ul><li><p>EXIF extraction</p></li><li><p>technical validation</p></li><li><p>replay orchestration</p></li><li><p>autoscaling control-plane logic</p></li></ul><p><strong>GPU Workers</strong></p><ul><li><p>Qwen VLM inference</p></li><li><p>IQA processing</p></li><li><p>curation scoring</p></li><li><p>natural-language enrichment</p></li></ul><p>Execution workers remained stateless wherever possible.</p><p>That allowed replay to remain safe.</p><h2>4. Why Reconciliation Matters</h2><p>A distributed system does not stay healthy merely because components exist.</p><p>Health depends on reconciliation.</p><p>Consider this state:</p><p>DynamoDB row says pending_vlm_enrichment<br>SQS queue is empty<br>GPU ASG is scaled to zero</p><p>Nothing is technically &#8220;down.&#8221;</p><p>And yet the system is stuck.</p><p>Truth says work should exist. Intent does not exist. Execution never begins. Belief incorrectly suggests the system is idle.</p><p>This is a reconciliation failure.</p><p>TBIE made this visible.</p><p>The system needed a mechanism that continuously aligned:</p><p>Truth &#8596; Intent &#8596; Execution</p><p>That eventually led to the event-driven reconciliation architecture.</p><h2>5. From Polling to Event-Driven Reconciliation</h2><p>The original architecture used scheduled polling.</p><p>Every few minutes:</p><p>EventBridge triggered a Lambda,<br>the Lambda scanned DynamoDB,<br>pending work was discovered,<br>SQS messages were emitted,<br>GPU autoscaling was triggered.</p><p>This worked.</p><p>But it introduced fundamental limitations.</p><h3>Problems with Polling</h3><p><strong>Latency</strong></p><p>An image could wait:</p><p>0&#8211;15 minutes before the next poll cycle.</p><p>GPU cold starts already consumed several minutes. Adding polling latency made the UX significantly worse.</p><p><strong>Waste</strong></p><p>Most polling invocations found no work.</p><p>The control plane continuously woke up merely to rediscover emptiness.</p><p><strong>Operational Ambiguity</strong></p><p>Polling blurred the distinction between:</p><p>&#8220;there is no work,&#8221;<br>and<br>&#8220;the system has not discovered the work yet.&#8221;</p><p>That ambiguity complicated debugging.</p><p><strong>Poor Reactive Scaling</strong></p><p>Autoscaling became tied to polling frequency.</p><p>Queue discovery latency directly affected GPU startup latency.</p><h2>6. DynamoDB Streams Changed the Architecture</h2><p>The major architectural shift came from moving reconciliation into an event-driven model.</p><p>Instead of periodically checking for state changes:</p><p>The system reacted immediately when Truth changed.</p><h3>The New Model</h3><p>DynamoDB row transitions to pending_vlm_enrichment<br>DynamoDB Streams emits an event<br>Event source mapping filters relevant writes<br>Replay Lambda triggers immediately<br>SQS Intent is emitted<br>GPU ASG is kicked from zero<br>GPU workers process work<br>Results are written back into Truth</p><p>The architecture became reactive.</p><h2>7. Anatomy of the Event-Driven TBIE</h2><h3>Architecture</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iIx-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iIx-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!iIx-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!iIx-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!iIx-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iIx-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1627507,&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://blog.phagyul.ai/i/203038071?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.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_!iIx-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!iIx-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!iIx-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!iIx-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F191eeab5-afd4-46c6-bd82-f0f651daa6b4_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>DynamoDB Streams</h4><p>The table emits:</p><ul><li><p>INSERT events</p></li><li><p>MODIFY events</p></li></ul><p>Filtered specifically for:</p><p>batch_status = pending_vlm_enrichment</p><p>This is extremely important.</p><p>The system does not react to every write. It reacts only when Truth crosses a workflow boundary requiring Intent creation.</p><h4>Event Source Mapping</h4><p>The stream mapping aggregates:</p><p>up to 50 records,<br>or up to 5 seconds.</p><p>This balances:</p><p>latency,<br>throughput,<br>Lambda cost,<br>queue pressure.</p><p>The system effectively performs micro-batching naturally.</p><h4>Replay Lambda</h4><p>The replay Lambda became the core reconciliation engine.</p><p>Responsibilities:</p><ul><li><p>inspect stream events,</p></li><li><p>discover pending rows,</p></li><li><p>identify retriable failures,</p></li><li><p>generate replayable Intent,</p></li><li><p>avoid duplicate queueing,</p></li><li><p>trigger autoscaling.</p></li></ul><p>This Lambda evolved into the operational heart of the platform.</p><h4>Queue Backlog Guard</h4><p>One subtle but extremely important design decision:</p><p>The replay Lambda checks queue visibility before re-enqueueing pending work.</p><p>Why?</p><p>Because replay itself can become destructive if uncontrolled.</p><p>Without a backlog guard:</p><p>the control plane could continuously duplicate Intent,<br>queue pressure would inflate,<br>workers would process stale state,<br>autoscaling would overreact.</p><p>This is a classic reconciliation trap.</p><p>The backlog guard prevented it.</p><h4>GPU ASG Kick</h4><p>The replay Lambda also became responsible for scaling GPU workers.</p><p>This matters because scale-to-zero architectures create a hidden problem:</p><p>The queue may contain work while compute remains asleep.</p><p>The replay Lambda solved this by:</p><p>emitting Intent,<br>then immediately setting desired ASG capacity.</p><p>That turned the replay engine into both:</p><p>a reconciliation layer,<br>and a control-plane orchestrator.</p><h2>8. Latency Transformation</h2><p>The shift from polling to event-driven reconciliation fundamentally changed responsiveness.</p><h3>Before</h3><p>Upload &#8594; wait for poll &#8594; queue &#8594; ASG scale &#8594; GPU boot</p><p>Total latency:</p><p>~3&#8211;20 minutes</p><p>depending on polling window timing.</p><h3>After</h3><p>Upload &#8594; stream event &#8594; immediate reconciliation &#8594; queue &#8594; ASG scale</p><p>Total latency:</p><p>~4&#8211;6 minutes</p><p>with remaining delay dominated almost entirely by:</p><p>EC2 startup,<br>model load,<br>GPU warm-up.</p><p>This is a very different operational profile.</p><p>The system stopped feeling batch-oriented.</p><p>It began behaving like a reactive platform.</p><h2>9. The First Major TBIE Failure</h2><h3>Intent Destroyed Too Early</h3><p>One of the earliest major incidents exposed why TBIE mattered.</p><h4>Symptom</h4><p>GPU workers experienced transient:</p><ul><li><p>S3 download failures,</p></li><li><p>temporary consistency races,</p></li><li><p>OOM conditions.</p></li></ul><p>But the worker still deleted the SQS message.</p><p>At the same time:</p><p>DynamoDB was updated with:</p><p>vlm_failed</p><p>The result:</p><p>Intent disappeared,<br>Truth claimed terminal failure,<br>automatic replay became impossible.</p><p>This was a severe reconciliation violation.</p><h4>The Core TBIE Violation</h4><p>Execution destroyed Intent before retries were exhausted.</p><p>That single decision broke replayability.</p><p>TBIE clarified the failure immediately.</p><p>The problem was not merely worker instability.</p><p>The problem was:</p><p>Execution invalidated Intent prematurely.</p><h4>The Fix</h4><p>The worker execution model changed.</p><p>Instead of binary success/failure, workers returned:</p><p>retry</p><ul><li><p>do NOT delete SQS message</p></li><li><p>do NOT write terminal Truth</p></li></ul><p>terminal_failure</p><ul><li><p>write durable failure state</p></li><li><p>delete Intent</p></li></ul><p>completed</p><ul><li><p>write success state</p></li><li><p>delete Intent</p></li></ul><p>This restored replay semantics.</p><h4>Why This Matters Beyond Parjanya</h4><p>Many distributed systems accidentally conflate:</p><p>&#8220;execution failed once&#8221; with<br>&#8220;execution is permanently impossible.&#8221;</p><p>Those are not equivalent.</p><p>TBIE forced the architecture to encode that distinction explicitly.</p><h2>10. Truth Pending, Intent Missing</h2><p>Another class of failures appeared repeatedly.</p><h3>Symptom</h3><p>Rows remained:</p><p>pending_vlm_enrichment</p><p>But:</p><ul><li><p>queues were empty,</p></li><li><p>GPU workers never started,</p></li><li><p>no replay existed.</p></li></ul><p>The system appeared healthy.</p><p>But nothing moved.</p><h3>What TBIE Revealed</h3><p>Truth and Intent were decoupled.</p><p>The architecture had assumed:</p><p>&#8220;If Truth says pending, Intent must already exist.&#8221;</p><p>That assumption was false.</p><p>Reconciliation cannot be assumed. It must be continuously enforced.</p><h3>The Replay Architecture</h3><p>This led to:</p><ul><li><p>replay scripts,</p></li><li><p>scheduled replay Lambdas,</p></li><li><p>retriable failure reset workflows,</p></li><li><p>queue reconstruction logic.</p></li></ul><p>The replay Lambda evolved into a continuously running reconciler.</p><p>This was the moment the architecture stopped being merely a pipeline.</p><p>It became a platform.</p><h2>11. Wrong Bucket, Right Key</h2><h3>A Perfect Distributed Systems Failure</h3><p>One of the most revealing incidents involved bucket mismatch.</p><h4>Symptom</h4><p>GPU workers repeatedly failed with:</p><p>s3_download_error</p><p>Yet:</p><ul><li><p>queue depth was growing,</p></li><li><p>autoscaling worked,</p></li><li><p>workers were alive,</p></li><li><p>previews existed.</p></li></ul><p>Everything looked operational.</p><h4>Root Cause</h4><p>The SQS payload contained:</p><p>the correct object key,<br>but the wrong bucket.</p><p>The preview existed.</p><p>Just not in the referenced bucket.</p><h4>Why This Was Architecturally Important</h4><p>The system was reliably executing the wrong instruction.</p><p>This is one of the hardest classes of distributed failures.</p><p>Nothing is technically broken.</p><p>The system is functioning exactly as instructed.</p><p>The instruction itself is invalid.</p><p>TBIE framed this correctly:</p><p>Intent must not merely exist. Intent must be correct and replayable.</p><h4>The Fix</h4><p>The architecture introduced:</p><ul><li><p>bucket source-of-truth rules,</p></li><li><p>preview-aware routing,</p></li><li><p>enqueue eligibility tightening,</p></li><li><p>RAW-aware preview validation,</p></li><li><p>replay resets for retriable failures.</p></li></ul><p>The fix was operationally deeper than changing one field.</p><p>It hardened the meaning of Intent itself.</p><h2>12. CORS Failures and Split Truth</h2><p>One of the most subtle incidents occurred at the ingestion boundary.</p><h3>Symptom</h3><p>Frontend uploads failed with browser CORS errors.</p><p>But backend APIs:</p><ul><li><p>generated presigned URLs,</p></li><li><p>wrote pending upload records,</p></li><li><p>and returned success responses.</p></li></ul><p>Truth looked correct.</p><p>Execution never happened.</p><h3>What Actually Failed</h3><p>The browser failed during:</p><p>OPTIONS preflight.</p><p>Execution never reached:</p><p>PUT upload.</p><h3>The TBIE Interpretation</h3><p>Truth existed. Intent existed. Execution failed before realization.</p><p>This became an important diagnostic heuristic:</p><p>When work is stuck:</p><p>Ask whether:</p><ul><li><p>Truth is missing,</p></li><li><p>Intent is missing,</p></li><li><p>or Execution cannot realize Intent.</p></li></ul><p>That framing simplified debugging enormously.</p><h2>13. Event-Driven Architecture Exposes Infrastructure Drift Faster</h2><p>As the architecture became more reactive, infrastructure drift became easier to detect.</p><p>This was unexpected.</p><h3>Example: Stale Worker Image Tag</h3><p>The ASG launch template still referenced:</p><p>:v20</p><p>while the actual system had moved to:</p><p>:v23</p><p>The ASG launched correctly. Cloud-init executed. Docker attempted to pull. The image no longer existed.</p><p>Workers never started.</p><h3>The Deeper Problem</h3><p>Terraform ignored user_data changes.</p><p>This created silent divergence between:</p><p>declared source-of-truth,<br>and actual runtime execution.</p><p>TBIE exposed this as an Execution drift problem.</p><p>Truth, Belief, and Intent were all correct.</p><p>Execution itself had drifted away from reality.</p><h3>The Architectural Lesson</h3><p>Infrastructure reproducibility is not optional.</p><p>Execution environments must remain tied to durable source-of-truth.</p><p>Otherwise replay becomes dangerous because:</p><p>the same Intent may produce different outcomes over time.</p><h2>14. AMI Drift and Runtime Incompatibility</h2><p>Another failure emerged at the AMI layer.</p><h3>Symptom</h3><p>Containers started. But model loading crashed.</p><p>The model weights existed. The processors did not.</p><p>The AMI bake omitted Python files required by:</p><p>trust_remote_code=True</p><p>The worker entered a crashloop.</p><h3>Why This Was Important</h3><p>Again:</p><p>Truth was correct. Intent was correct. Belief suggested workers existed.</p><p>Execution failed due to stale artifacts.</p><p>This is precisely why replayable systems require reproducible execution environments.</p><p>TBIE repeatedly reinforced this architectural truth.</p><h2>15. The Replay Lambda Became the Control Plane</h2><p>Originally, the replay Lambda was operational glue.</p><p>Eventually, it became the platform control plane.</p><p>Responsibilities expanded to include:</p><ul><li><p>pending reconciliation,</p></li><li><p>retriable failure resets,</p></li><li><p>tenant discovery,</p></li><li><p>queue backlog management,</p></li><li><p>autoscaling coordination,</p></li><li><p>replay orchestration,</p></li><li><p>dynamic routing.</p></li></ul><p>The replay layer became central infrastructure.</p><p>This was a critical architectural evolution.</p><h2>16. The IAM Incident</h2><h3>When the Control Plane Goes Blind</h3><p>One of the most dangerous incidents involved a missing IAM permission.</p><h4>Symptom</h4><p>The replay Lambda continuously crashed on:</p><p>sqs:GetQueueAttributes</p><p>for nearly 12 hours.</p><p>But:</p><ul><li><p>EventBridge still invoked it,</p></li><li><p>the schedule looked healthy,</p></li><li><p>the infrastructure appeared alive.</p></li></ul><p>Meanwhile:</p><ul><li><p>pending rows accumulated,</p></li><li><p>queues stopped reconciling,</p></li><li><p>autoscaling logic failed.</p></li></ul><h3>The TBIE Lesson</h3><p>The control plane had lost Belief.</p><p>Without Belief:</p><p>the replay engine could not safely emit Intent,<br>queue guards could not function,<br>orchestration collapsed.</p><p>The system looked operational while the reconciler was effectively dead.</p><h3>The Operational Insight</h3><p>A scheduled Lambda is not necessarily a healthy Lambda.</p><p>Control-plane observability matters more than worker observability.</p><p>Why?</p><p>Because worker failures are recoverable.</p><p>Control-plane blindness disables recovery itself.</p><h2>17. Dynamic Tenant Discovery</h2><p>As Parjanya moved toward beta onboarding, static tenant configuration became a bottleneck.</p><p>Originally:</p><p>The replay Lambda used static tenant lists.</p><p>Every new tenant required:</p><ul><li><p>Terraform changes,</p></li><li><p>environment updates,</p></li><li><p>redeploys.</p></li></ul><p>This violated the self-service model.</p><h3>The Evolution</h3><p>The architecture introduced:</p><ul><li><p>tenant registry writes during upload completion,</p></li><li><p>runtime tenant discovery,</p></li><li><p>dynamic reconciliation.</p></li></ul><p>The control plane became data-driven rather than configuration-driven.</p><p>This is a major architectural distinction.</p><p>Reactive systems scale operationally only when discovery becomes dynamic.</p><h2>18. Regrading and Policy Replay</h2><p>One of the most powerful consequences of TBIE was deterministic replay.</p><p>This became especially valuable during policy changes.</p><h3>Example</h3><p>The IQA policy evolved to reject:</p><ul><li><p>screenshots,</p></li><li><p>banners,</p></li><li><p>posters,</p></li><li><p>slides,</p></li><li><p>social cards,</p></li><li><p>infographics,</p></li><li><p>illustrations.</p></li></ul><p>The architecture needed to:</p><ul><li><p>reset VLM-derived Truth,</p></li><li><p>regenerate Intent,</p></li><li><p>rerun GPU enrichment,</p></li><li><p>rewrite curation outputs.</p></li></ul><p>This was not merely a retry.</p><p>It was a deterministic policy replay.</p><h3>Why This Matters</h3><p>Most ML systems struggle with:</p><p>&#8220;How do we reprocess historical data safely?&#8221;</p><p>TBIE already contained the answer.</p><p>Truth could be reset to a replay boundary. Intent could be regenerated. Execution remained stateless.</p><p>The system became replay-native.</p><p>This is a profound operational capability.</p><h2>19. Queue Retention and Weekend Gaps</h2><p>Another subtle operational issue:</p><p>Scale-to-zero architectures create temporal gaps.</p><h3>Scenario</h3><p>Users upload images Friday evening. GPU workers remain offline over the weekend.</p><p>If queue retention is too short:</p><p>Intent disappears before execution resumes.</p><p>Truth remains pending.</p><p>Intent vanishes.</p><p>This is catastrophic reconciliation drift.</p><h3>The Fix</h3><p>Queue retention was extended.</p><p>This ensured Intent outlived temporary execution dormancy.</p><p>An important TBIE lesson emerged:</p><p>Intent durability must exceed execution availability windows.</p><h2>20. Why Event-Driven Reconciliation Matters</h2><h3>Beyond AI</h3><p>Although Parjanya is an AI platform, the architectural lessons generalize broadly.</p><p>The same TBIE principles apply to:</p><p>distributed media systems,<br>payment processing,<br>ETL pipelines,<br>logistics systems,<br>asynchronous workflows,<br>microservice orchestration,<br>large-scale ingestion platforms.</p><p>The core challenge is universal:</p><p>How do you maintain alignment between:</p><p>durable truth,<br>intended work,<br>operational state,<br>and actual execution?</p><p>TBIE provides a vocabulary for reasoning about that alignment.</p><h2>21. The Shift from Pipeline to Platform</h2><p>This was perhaps the most important realization.</p><p>A pipeline moves data.</p><p>A platform:</p><ul><li><p>survives retries,</p></li><li><p>supports replay,</p></li><li><p>reconciles state continuously,</p></li><li><p>tolerates execution drift,</p></li><li><p>evolves policy safely,</p></li><li><p>supports operational introspection,</p></li><li><p>and remains debuggable under failure.</p></li></ul><p>The event-driven TBIE architecture pushed Parjanya decisively toward the latter.</p><p>The replay Lambda stopped being a utility.</p><p>It became the reconciliation brain of the system.</p><p>The architecture stopped being:</p><p>&#8220;process uploaded images.&#8221;</p><p>It became:</p><p>&#8220;maintain durable correctness while asynchronous distributed execution continuously changes.&#8221;</p><p>That is a very different engineering problem.</p><h2>22. The Operator&#8217;s Mental Model</h2><p>TBIE becomes most useful when it changes how incidents are diagnosed.</p><p>By the time Parjanya matured into an event-driven reconciliation system, the debugging approach itself had changed. Operators no longer began by asking whether &#8220;the queue is healthy&#8221; or whether &#8220;the GPU workers are running.&#8221; Those signals still mattered, but they were no longer treated as authoritative.</p><p>Instead, every investigation began with a much more precise question:</p><p>Is the system waiting because Intent is missing, or is Intent present but Execution cannot realize it?</p><p>That distinction dramatically narrowed the search space during incidents.</p><p>If Truth showed a growing backlog while Intent remained near zero, the issue was usually in reconciliation itself. Replay Lambda failure, queue emission failure, stale tenant discovery, or a blind control plane could all create this pattern. The queue might look empty and the autoscaling group might remain at zero, yet the real failure would not be in the workers. It would be in the system&#8217;s ability to regenerate Intent from Truth.</p><p>If Intent existed but Execution failed repeatedly, the investigation shifted toward realization problems instead: bucket routing mismatches, stale AMIs, launch-template drift, IAM gaps, runtime incompatibilities, model-loading failures, endpoint routing problems, or browser-side execution failures.</p><p>That diagnostic framing changed operations significantly. Incidents became easier to classify because TBIE separated the architecture into meaningful operational boundaries. Instead of treating the platform as one opaque pipeline, operators could isolate whether the failure belonged to Truth, Belief, Intent, or Execution.</p><p>The model also made one uncomfortable reality obvious: dashboards alone are not enough. A queue can look healthy while Truth continues accumulating backlog. Autoscaling can look correct while workers continuously crashloop. A scheduled Lambda can appear operational while silently failing every invocation because of an IAM permission gap.</p><p>TBIE did not eliminate debugging complexity. What it did was make debugging systematic.</p><h2>23. When the System Hangs at 02:00 AM</h2><p>Architectural diagrams are useful during design reviews.</p><p>Runbooks matter during incidents.</p><p>One of the most important evolutions in Parjanya v2.0 was realizing that reconciliation needed to exist not only in architecture, but also in operational practice. TBIE only became truly useful once there was a repeatable process for recovering the system under pressure.</p><p>The first step during any &#8220;hung VLM&#8221; investigation became identifying the TBIE boundary itself.</p><p>Truth consisted of the DynamoDB image rows and their workflow state. Intent consisted of SQS messages representing GPU work. Execution consisted of GPU workers consuming that Intent and writing enriched Truth back into DynamoDB. Belief consisted of queue depth, autoscaling state, visibility counts, worker health, and operational telemetry.</p><p>Once those boundaries were established, incident triage became much more structured.</p><p>Operators first checked Truth backlog. Were rows accumulating in pending_vlm_enrichment? If yes, the system still believed work should happen.</p><p>Next came Intent backlog. Did SQS contain replayable work items? If Truth backlog was high while Intent remained near zero, then reconciliation itself had failed.</p><p>Then came Execution health. Were GPU workers alive? Were containers actually starting? Were model loads succeeding? Were workers consuming messages or continuously failing before acknowledgement?</p><p>Several operational shortcuts emerged over time.</p><p>If the GPU log group was empty while ASG instances existed, the problem was often below the application layer entirely. Cloud-init failures, stale image tags, or broken launch templates frequently surfaced first through EC2 console output rather than through CloudWatch worker logs.</p><p>If the replay Lambda appeared scheduled but no queue activity existed, IAM permissions became the first thing to inspect. One of the most dangerous incidents in the system occurred precisely because the reconciliation Lambda could no longer read queue attributes, effectively blinding the control plane while the infrastructure superficially appeared healthy.</p><p>If rows repeatedly failed with S3 download errors while workers remained alive, the issue was often deterministic addressing rather than transient instability. Wrong-bucket references, preview routing mismatches, or endpoint configuration drift could all create workers that failed consistently while still appearing operational.</p><p>Over time, this changed the operational mindset of the platform. The goal stopped being &#8220;restart the workers and hope.&#8221; The goal became understanding exactly where reconciliation had broken down and then repairing the appropriate boundary.</p><p>That distinction is subtle, but extremely important.</p><p>A resilient platform is not the one that avoids incidents. It is the one that can recover from them methodically.</p><h2>24. Guardrails and Proactive Controls</h2><p>One of the clearest architectural patterns that emerged from Parjanya was that every major incident eventually needed to produce a permanent guardrail.</p><p>Without that discipline, incidents remain stories. With it, incidents become operational evolution.</p><p>The architecture gradually accumulated a large number of proactive controls:</p><p>Transient worker failures no longer delete Intent prematurely. Replay Lambdas continuously reconcile pending Truth. Reproducible lockfiles prevent dependency drift. Terraform validations reject invalid wildcard CORS patterns. Tenant discovery became dynamic rather than operator-maintained. Queue retention was extended to match real outage windows rather than idealized assumptions.</p><p>Many of these controls were not introduced because the architecture diagram required them. They emerged because production failures revealed where reconciliation could silently drift.</p><p>This is one of the strongest long-term lessons from the TBIE model.</p><p>Resilience is not achieved through one large design decision. It is accumulated gradually through operational guardrails.</p><p>The mature version of the system looked very different from the original one not because the core architecture changed dramatically, but because every important failure eventually became:</p><p>a validation rule,<br>a replay strategy,<br>a Terraform constraint,<br>a CI assertion,<br>a queue safeguard,<br>or an operational diagnostic.</p><p>That is how resilient systems evolve in practice.</p><p>They convert incidents into institutional memory.</p><h2>25. Maintenance as a Reliability Discipline</h2><p>One of the easiest mistakes in distributed systems is assuming resilience is something implemented once.</p><p>In reality, resilience is maintained continuously.</p><p>By the later stages of Parjanya v2.0, the team had accumulated a growing operational checklist precisely because many failures were caused not by dramatic outages, but by small forms of drift.</p><p>Replay logic and worker behavior needed to evolve together. GPU image tags needed to stay aligned with launch templates. Lockfiles had to remain committed when dependencies changed. Tenant buckets required CORS validation before onboarding. Queue retention needed to reflect actual business downtime windows. Backend API contracts and frontend types had to remain synchronized.</p><p>None of these tasks sound individually sophisticated.</p><p>But distributed systems rarely collapse from a single catastrophic event. They erode through gradual inconsistency.</p><p>That realization changed how the platform was maintained.</p><p>Operational discipline became part of the architecture itself.</p><p>The maintenance checklist was therefore not merely documentation. It was a recognition that reconciliation must continue throughout the entire lifecycle of the platform.</p><h2>26. Why TBIE Matters Beyond AI</h2><p>Although Parjanya is an AI platform, the architectural lessons generalize broadly.</p><p>The same TBIE principles apply to:</p><p>distributed media systems,<br>payment processing,<br>ETL pipelines,<br>logistics systems,<br>asynchronous workflows,<br>microservice orchestration,<br>large-scale ingestion platforms.</p><p>The core challenge is universal:</p><p>How do you maintain alignment between:</p><p>durable truth,<br>intended work,<br>operational state,<br>and actual execution?</p><p>TBIE provides a vocabulary for reasoning about that alignment.</p><h2>27. The Shift from Pipeline to Platform</h2><ol><li><p>Truth must remain durable and replayable</p></li></ol><p>If Truth cannot reconstruct the system after failures, the architecture becomes operationally fragile.</p><ol start="2"><li><p>Intent is more important than most systems realize</p></li></ol><p>Intent is replayability.</p><p>Destroying Intent prematurely destroys recovery.</p><ol start="3"><li><p>Event-driven systems expose hidden drift faster</p></li></ol><p>Reactive architectures surface infrastructure inconsistencies earlier.</p><p>This is painful initially.</p><p>But healthier long-term.</p><ol start="4"><li><p>Execution must remain reproducible</p></li></ol><p>Replay without reproducibility becomes dangerous.</p><ol start="5"><li><p>Control-plane observability matters more than worker observability</p></li></ol><p>Worker crashes are recoverable. Blind reconcilers are not.</p><ol start="6"><li><p>Queue depth alone is not truth</p></li></ol><p>Belief metrics require interpretation.</p><p>Approximate counts are operational signals, not durable truth.</p><ol start="7"><li><p>Policy replay should be designed intentionally</p></li></ol><p>Eventually every ML platform needs deterministic reprocessing.</p><p>Replay-native architectures handle this gracefully.</p><ol start="8"><li><p>Distributed systems fail by divergence</p></li></ol><p>Not by total outage.</p><p>The hardest bugs were:</p><p>wrong bucket,<br>stale AMI,<br>hidden CORS mismatch,<br>invisible IAM gap,<br>frozen replay,<br>missing Intent.</p><p>TBIE helped make those failures explainable.</p><h2>28. The Future Direction</h2><p>The current architecture already points toward several future evolutions:</p><ul><li><p>multi-stage event-driven pipelines,</p></li><li><p>adaptive batching,</p></li><li><p>warm GPU pools,</p></li><li><p>richer metrics export,</p></li><li><p>dynamic replay orchestration,</p></li><li><p>per-stage autoscaling,</p></li><li><p>event-sourced workflow history,</p></li><li><p>tenant-aware media delivery,</p></li><li><p>replayable policy evolution.</p></li></ul><p>Importantly:</p><p>These evolutions do not require rewriting the architecture.</p><p>They emerge naturally because reconciliation is already foundational.</p><p>That is one of the strongest signs that the architecture direction is correct.</p><h2>Closing Thoughts</h2><p>TBIE did not begin as an attempt to create a framework.</p><p>It emerged because distributed AI infrastructure repeatedly exposed the same class of operational failures:</p><p>work disappearing,<br>retries becoming impossible,<br>control planes drifting,<br>execution environments diverging,<br>queues losing meaning,<br>infrastructure behaving correctly against stale assumptions.</p><p>The model became useful because it created clarity.</p><p>Truth. Belief. Intent. Execution.</p><p>Once those boundaries became explicit:</p><p>replay became easier,<br>debugging became faster,<br>autoscaling became safer,<br>policy evolution became manageable,<br>and infrastructure failures became explainable.</p><p>The most important lesson from Parjanya v2.0 is not that event-driven architectures are faster.</p><p>The deeper lesson is:</p><p>Resilient distributed systems are fundamentally reconciliation systems.</p><p>The system that survives is not necessarily the one with the fastest workers.</p><p>It is the one that can continuously reconstruct:</p><p>what is true,<br>what work should exist,<br>what execution already happened,<br>and what still needs to be reconciled.</p><p>That is what ultimately transformed Parjanya from a pipeline into a platform.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Prompt Debt: How We Doubled Throughput Without Changing the Model]]></title><description><![CDATA[A Parjanya v2.0 field note on inferencing, information waste, and why deleting things sometimes creates more value than adding them]]></description><link>https://blog.phagyul.ai/p/prompt-debt-how-we-doubled-throughput</link><guid isPermaLink="false">https://blog.phagyul.ai/p/prompt-debt-how-we-doubled-throughput</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Wed, 17 Jun 2026 04:16:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!h96B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h96B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h96B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!h96B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!h96B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!h96B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h96B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1298886,&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://blog.phagyul.ai/i/202383039?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.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_!h96B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!h96B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!h96B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!h96B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3a4725-4e40-481b-bd3e-1c7c7aab5df3_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In May 2026, I found myself staring at a familiar engineering problem.</p><p>Parjanya&#8217;s Image Quality Assessment pipeline was approaching the limits of what our infrastructure could comfortably handle.</p><p>Inference workloads were growing.</p><p>Batch sizes were increasing.</p><p>Memory utilization was climbing.</p><p>And eventually, the system hit a wall.</p><p>A larger image.</p><p>A slightly bigger batch.</p><p>A little more context.</p><p>And then:</p><blockquote><p>CUDA Out of Memory.</p></blockquote><p>The obvious answer was straightforward.</p><p>Upgrade the hardware.</p><p>Move to larger GPUs.</p><p>Increase the budget.</p><p>Scale vertically.</p><p>That&#8217;s what I almost did.</p><p>Instead, I opened the prompt.</p><p>And that decision ended up saving far more money than a hardware upgrade would have.</p><div><hr></div><h2>The Assumption I Didn&#8217;t Question</h2><p>By this point in the Parjanya v2.0 journey, I had spent months thinking about infrastructure.</p><p>The previous two posts in this series covered:</p><ul><li><p>Multi-account AWS architecture</p></li><li><p>Terraform and operational discipline</p></li><li><p>CI/CD pipelines</p></li><li><p>IAM boundaries</p></li><li><p>Infrastructure scaling</p></li></ul><p>So when inference started becoming expensive, my instinct was predictable.</p><p>I looked at the hardware.</p><p>That&#8217;s what engineers do.</p><p>We assume the bottleneck lives where the graphs are red.</p><p>GPU memory usage was high.</p><p>Throughput was flattening.</p><p>Batch sizes were constrained.</p><p>The diagnosis seemed obvious.</p><p>But infrastructure metrics were only showing symptoms.</p><p>They weren&#8217;t showing the cause.</p><div><hr></div><h2>The Audit That Changed Everything</h2><p>Instead of pricing larger GPUs, I decided to audit the prompt itself.</p><p>At that point our VLM-based IQA system had evolved through multiple versions.</p><p>Each release added new capabilities:</p><ul><li><p>Better composition evaluation</p></li><li><p>Improved wildlife classification</p></li><li><p>More robust defect detection</p></li><li><p>Additional structured outputs</p></li><li><p>More nuanced confidence handling</p></li></ul><p>Every version added knowledge.</p><p>Almost nothing removed knowledge.</p><p>The prompt had become a living document.</p><p>Like most living documents, it accumulated debt.</p><p>When I finally measured it, the numbers surprised me.</p><p>The system prompt plus user context had grown to roughly:</p><p><strong>4,150 tokens</strong></p><p>Not because we needed 4,150 tokens.</p><p>Because nobody had challenged whether we still needed them.</p><div><hr></div><h2>What I Found</h2><p>The easiest way to describe it is this:</p><p>The prompt looked less like a carefully engineered system and more like a codebase that hadn&#8217;t been refactored in years.</p><p>There was useful logic.</p><p>There was historical baggage.</p><p>And there was a lot of dead code.</p><div><hr></div><h3>Unused Outputs</h3><p>One section calculated an overall quality score.</p><p>The model spent tokens reasoning about it.</p><p>The downstream system ignored it completely.</p><p>The actual acceptance and rejection decisions came from deterministic rules elsewhere in the pipeline.</p><p>The score existed because an earlier version needed it.</p><p>The current version didn&#8217;t.</p><p>Yet the prompt still carried the instructions.</p><div><hr></div><h3>Features That Never Shipped</h3><p>I found sections generating:</p><ul><li><p>search tags</p></li><li><p>mood descriptions</p></li><li><p>discovery metadata</p></li></ul><p>These outputs were originally intended for future content discovery features.</p><p>Those features never launched.</p><p>The instructions remained.</p><p>Every inference paid the cost.</p><p>Every single time.</p><div><hr></div><h3>Teaching the Model Things It Already Knew</h3><p>This was the biggest surprise.</p><p>Over time we&#8217;d added examples.</p><p>Then more examples.</p><p>Then explanations for the examples.</p><p>Then explanations explaining the explanations.</p><p>The prompt contained long sections describing:</p><ul><li><p>composition techniques</p></li><li><p>confidence scoring</p></li><li><p>framing recognition</p></li><li><p>classification behavior</p></li></ul><p>At one point those explanations were useful.</p><p>But the model wasn&#8217;t learning from scratch anymore.</p><p>The explanatory scaffolding had become informational overhead.</p><p>The rules mattered.</p><p>The essays explaining the rules did not.</p><div><hr></div><h2>I Started Thinking About It Like Technical Debt</h2><p>The moment everything clicked was when I stopped calling it prompt engineering.</p><p>This wasn&#8217;t prompt engineering.</p><p>This was refactoring.</p><p>The exact same process we apply to software.</p><p>In software we ask:</p><ul><li><p>Is this function still used?</p></li><li><p>Does this dependency still matter?</p></li><li><p>Is this abstraction providing value?</p></li><li><p>Can this code be simplified?</p></li></ul><p>I realized prompts deserve the same scrutiny.</p><p>A prompt is infrastructure.</p><p>It consumes resources.</p><p>It affects latency.</p><p>It affects throughput.</p><p>It affects cost.</p><p>And like any infrastructure, it accumulates debt.</p><p>I started calling this:</p><p><strong>Prompt Debt.</strong></p><div><hr></div><h2>What Stayed</h2><p>This is the part that surprised me most.</p><p>Almost all of the intelligence survived.</p><p>The capabilities remained intact.</p><p>The model still knew how to:</p><ul><li><p>recognize deliberate composition</p></li><li><p>distinguish artistic choices from technical defects</p></li><li><p>apply confidence-aware wildlife classification</p></li><li><p>detect focus issues</p></li><li><p>identify exposure problems</p></li><li><p>generate structured outputs</p></li><li><p>evaluate image quality</p></li></ul><p>We didn&#8217;t remove intelligence.</p><p>We removed repetition.</p><p>We removed explanation.</p><p>We removed historical residue.</p><p>The distinction matters.</p><div><hr></div><h2>The Numbers</h2><p>After the audit:</p><h3>System Prompt</h3><p>~700 tokens &#8594; ~360 tokens</p><h3>User Prompt</h3><p>~3,450 tokens &#8594; ~890 tokens</p><h3>Total Context</h3><p>~4,150 tokens &#8594; ~1,250 tokens</p><p>Approximately:</p><p><strong>70% reduction</strong></p><p>without changing:</p><ul><li><p>the model</p></li><li><p>the hardware</p></li><li><p>the infrastructure</p></li><li><p>the deployment architecture</p></li></ul><p>Only the prompt changed.</p><div><hr></div><h2>Why 70% Matters</h2><p>It&#8217;s tempting to see this as an academic optimization.</p><p>It wasn&#8217;t.</p><p>Those tokens had real operational consequences.</p><p>Every unnecessary token consumes:</p><ul><li><p>memory</p></li><li><p>compute</p></li><li><p>latency budget</p></li><li><p>throughput capacity</p></li></ul><p>On paper, a token looks small.</p><p>At scale, thousands of unnecessary tokens become infrastructure.</p><p>And infrastructure costs money.</p><p>Before the cleanup, our batching limits were constrained by context size.</p><p>After the cleanup, we could process roughly twice as many images within similar memory budgets.</p><p>The result was effectively:</p><p><strong>2x throughput without changing hardware.</strong></p><p>The kind of gain most teams expect from an expensive infrastructure project.</p><p>We got it from deleting text.</p><div><hr></div><h2>Every Token Has a Cost</h2><p>This became the biggest lesson of the entire exercise.</p><p>Engineers often think about infrastructure costs.</p><p>Few think about information costs.</p><p>Every token carries a burden.</p><p>A token occupies memory.</p><p>A token increases inference time.</p><p>A token competes for attention.</p><p>A token introduces complexity.</p><p>The question isn&#8217;t:</p><blockquote><p>&#8220;Can the model read this?&#8221;</p></blockquote><p>The question is:</p><blockquote><p>&#8220;Should the model be reading this at all?&#8221;</p></blockquote><p>Those are very different questions.</p><p>This was a practical reminder of a lesson I explored earlier in <em>Grounding Is Not a Prompt</em>. Models don&#8217;t become more faithful simply because we provide more instructions. What matters is the quality and relevance of information available at inference time. A smaller, denser prompt often outperforms a larger one filled with historical baggage and explanatory noise.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;b18987ef-e1f5-4c1b-8bb3-39710cb58f7b&quot;,&quot;caption&quot;:&quot;Source: How Well Do Large Language Models Truly Ground?&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Grounding Is Not a Prompt&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-02-07T02:21:22.979Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!HHAz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f120e84-49db-45ec-a506-edf56f9c4e73_1536x970.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/grounding-is-not-a-prompt&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:187075330,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>The Broader Pattern</h2><p>The more I reflected on the exercise, the more it felt familiar.</p><p>This pattern appears everywhere.</p><p>Organizations accumulate meetings.</p><p>Software accumulates dependencies.</p><p>Infrastructure accumulates services.</p><p>Prompts accumulate instructions.</p><p>Over time, complexity grows through addition.</p><p>Rarely through subtraction.</p><p>Most systems become slower because nobody asks what can be removed.</p><p>Prompts are no different.</p><p>While reviewing the prompt, I kept thinking about a principle we previously discussed in <em>Databases, Caches and Queues: A Universal Rule for Distributed Systems</em>. Systems become resilient when information has clear ownership and purpose. The same principle applies to prompts. Every instruction should exist for a reason. If nobody consumes it, it becomes operational debt.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;a0f2bc2c-55c1-46a1-b16b-e699ad9c583a&quot;,&quot;caption&quot;:&quot;Modern distributed systems fail not because of scale, but because of misplaced responsibility. As systems grow asynchronous, replicated, and fault-tolerant, confusion often arises over what represents reality, what represents optimization, and what represents&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Databases, Caches and Queues: A universal Rule for Distributed Systems&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-02-01T03:44:43.149Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!FlV_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F678c2435-563e-447a-86c3-de6ba19a0970_800x533.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/databases-caches-and-queues-a-universal&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:186410680,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:4,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>The Connection to Inferencing</h2><p>This experience fundamentally changed how I think about inference optimization.</p><p>Most conversations focus on:</p><ul><li><p>larger models</p></li><li><p>larger context windows</p></li><li><p>larger GPUs</p></li><li><p>more sophisticated hardware</p></li></ul><p>Those matter.</p><p>But they&#8217;re not always the first lever.</p><p>Sometimes the most effective optimization isn&#8217;t computational.</p><p>It&#8217;s informational.</p><p>Before changing the model, review the prompt.</p><p>Before upgrading the GPU, review the prompt.</p><p>Before increasing context windows, review the prompt.</p><p>The cheapest token is the one you never generate.</p><div><hr></div><h2>What Comes Next</h2><p>Prompt reduction was only one layer.</p><p>The next frontier involves serving optimization:</p><ul><li><p>prompt prefix caching</p></li><li><p>KV cache reuse</p></li><li><p>vLLM batching improvements</p></li><li><p>quantization strategies</p></li><li><p>memory-efficient inference</p></li></ul><p>Those areas still offer meaningful gains.</p><p>But they sit on top of a more fundamental principle.</p><p>Optimize information before optimizing infrastructure.</p><div><hr></div><h2>The Takeaway</h2><p>When the system first ran out of memory, I assumed we had a hardware problem.</p><p>What we actually had was an information problem.</p><p>The model wasn&#8217;t struggling because it lacked capacity.</p><p>It was struggling because we were making it carry unnecessary baggage.</p><p>That distinction changed how I think about AI systems.</p><p>We often assume progress requires adding something.</p><p>A larger model.</p><p>A larger GPU.</p><p>A larger context window.</p><p>A larger budget.</p><p>In this case, the breakthrough came from subtraction.</p><p>The model already knew enough.</p><p>The system simply needed less noise.</p><p>And that&#8217;s a lesson that extends far beyond prompts.</p><p>It&#8217;s a lesson about engineering itself.</p><div><hr></div><p><em>This concludes the initial Parjanya v2.0 engineering series. Across these three posts&#8212;from AWS account boundaries, to Terraform discipline, to prompt debt&#8212;the common theme has been surprisingly consistent: systems scale best when boundaries are clear, assumptions are explicit, and unnecessary complexity is removed. The challenge is rarely adding more. The challenge is knowing what to keep.</em></p><div><hr></div><h2>Further Reading</h2><p>If this article resonated with you, these related essays expand on the ideas discussed here:</p><ul><li><p><strong><a href="https://blog.phagyul.ai/p/grounding-is-not-a-prompt">Grounding Is Not a Prompt</a></strong> &#8212; Why better information retrieval often matters more than adding more instructions to a model.</p></li><li><p><strong><a href="https://blog.phagyul.ai/p/vlm-batch-inference-4-bit-quantization">VLM Batch Inference - 4 bit quantisation depth</a></strong> &#8212; The Hidden Cost of &#8220;Almost Fitting&#8221;</p></li><li><p><strong><a href="https://blog.phagyul.ai/p/context-engineering-and-context-debt">Context Engineering and Context Debt</a> &#8212; </strong><em><span data-color="rgb(54, 55, 55)" style="color: rgb(54, 55, 55);">a data investigation that revealed ~77% of my token spend was context accumulation waste, not productive reasoning. This is the framework I built to fix it &#8212; and the problem has a name: </span>Context Debt <span data-color="rgb(54, 55, 55)" style="color: rgb(54, 55, 55);">and the fix is:</span> Context Engineering <span data-color="rgb(54, 55, 55)" style="color: rgb(54, 55, 55);">.</span></em></p></li><li><p><strong><a href="https://blog.phagyul.ai/p/databases-caches-and-queues-a-universal">Databases, Caches and Queues: A Universal Rule for Distributed Systems</a></strong><a href="https://blog.phagyul.ai/p/databases-caches-and-queues-a-universal"> </a>&#8212; The Truth, Belief and Intent framework that inspired how we think about information flow across systems.</p></li><li><p><strong><a href="https://blog.phagyul.ai/p/tbie-in-practice-designing-resilient">TBIE in Practice: Designing Resilient AI Pipelines That Recover, Reconcile, and Re-run</a> - </strong>Reconciliation loop and TBIE model with case studies with Parjanya v2.0</p></li><li><p><strong><a href="https://blog.phagyul.ai/p/terraform-at-scale-what-actually">Terraform at Scale: What Actually Worked, What Didn&#8217;t, and the Cost of Trusting AI with Infrastructure</a></strong> &#8212; The previous post in this series, exploring operational discipline and infrastructure boundaries.</p></li><li><p><strong><a href="https://blog.phagyul.ai/p/why-we-use-three-aws-accounts-not">Why We Use Three AWS Accounts (Not Two) for Parjanya v2.0</a></strong><a href="https://blog.phagyul.ai/p/why-we-use-three-aws-accounts-not"> </a>&#8212; The architectural foundation that enabled the optimizations described here.</p></li></ul><div><hr></div><h2>Introducing the Inferencing Series</h2><p>This article marks the beginning of a new series exploring inferencing as a first-class engineering discipline. Much of the AI conversation today revolves around models, benchmarks, and training. Yet in production systems, the economics and behaviour of AI are often determined long after training is complete&#8212;during inference. The choices we make around prompts, context, quantization, batching, memory management, caching, retrieval, and serving architecture frequently have a greater impact on cost, latency, and reliability than changing the model itself.</p><p>Throughout this series, I&#8217;ll share lessons learned while building and operating Parjanya&#8217;s Visual Language Model (VLM) pipelines. Rather than focusing on LLM chat applications, the emphasis will be on real-world image understanding systems: image quality assessment, wildlife classification, structured extraction, multimodal reasoning, and the engineering decisions required to run them efficiently at scale. The goal is not simply to reduce costs, but to understand how information flows through an AI system and where meaningful optimization actually lives.</p><div><hr></div><h2>Why Start With Prompt Debt?</h2><p>Prompt Debt is an ideal starting point because it reveals a common misconception about AI systems: that performance improvements come primarily from adding more. More instructions. More examples. More context. More hardware. In practice, many mature VLM systems accumulate informational debt in the same way software accumulates technical debt&#8212;unused outputs, redundant instructions, abandoned features, and historical assumptions that continue consuming resources long after they stop creating value.</p><p>Future articles in the Inferencing Series will build on this foundation by exploring quantization, context engineering, grounding strategies, serving architectures, prompt caching, KV-cache optimization, batching, multimodal pipelines, and the operational realities of running VLM workloads in production. Prompt Debt is simply the first lens. The broader question&#8212;and the one that interests me most&#8212;is how to maximize signal while minimizing computational waste across the entire inferencing stack.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Terraform at Scale: What Actually Worked, What Didn’t, and the Cost of Trusting AI with Infrastructure]]></title><description><![CDATA[A Parjanya v2.0 field note from migrating a real platform across AWS accounts, repositories, and automation layers]]></description><link>https://blog.phagyul.ai/p/terraform-at-scale-what-actually</link><guid isPermaLink="false">https://blog.phagyul.ai/p/terraform-at-scale-what-actually</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Tue, 16 Jun 2026 04:30:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FmcI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FmcI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FmcI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!FmcI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!FmcI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!FmcI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FmcI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1502563,&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://blog.phagyul.ai/i/202230143?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.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_!FmcI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!FmcI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!FmcI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!FmcI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F981e19f5-1c53-45d1-b071-7abbe56d44bb_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When people talk about Terraform, they often talk about Infrastructure as Code.</p><p>What I learned while building Parjanya v2.0 is that Terraform is really about something else:</p><p><strong>forcing operational discipline.</strong></p><p>Terraform didn&#8217;t magically simplify our infrastructure. It exposed assumptions, surfaced hidden dependencies, and forced us to formalize decisions we had previously gotten away with making informally.</p><p>As Parjanya evolved from a collection of scripts, console clicks, and one-off configurations into a multi-tenant image processing platform, Terraform became the backbone that allowed us to scale infrastructure without losing control.</p><p>It also introduced new challenges.</p><p>And when I layered AI-assisted engineering into the workflow, I discovered an entirely different category of problems worth documenting.</p><p>This post is the implementation companion to my previous article on why we chose a three-account AWS architecture for Parjanya v2.0.</p><p>That post explained the boundaries.</p><p>This one explains how we turned those boundaries into code.</p><div><hr></div><h2>The Reality of Operating Across Five Repositories</h2><p>Parjanya today spans five repositories.</p><p>Each exists for a reason.</p><ul><li><p><strong>parjanya-ml</strong> handles inference and model serving.</p></li><li><p><strong>parjanya-ops</strong> owns infrastructure and platform operations.</p></li><li><p><strong>parjanya-backend</strong> manages orchestration and APIs.</p></li><li><p><strong>parjanya-frontend</strong> serves tenant-facing experiences.</p></li><li><p><strong>parjanya-shared-libraries</strong> contains contracts and shared abstractions.</p></li></ul><p>The separation works well organizationally.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;2c65bc97-28aa-4849-96b3-84776f8019de&quot;,&quot;caption&quot;:&quot;After shipping Parjanya v1.0 through v1.3 (with 17+ patch releases), we&#8217;ve evolved from monolithic friction to a deliberate five-repository polyrepo architecture aligned with team structure and technical boundaries. This post documents our research-driven thought process, the specific tech stack (Nx frontend, FastAPI microservices, PyTorch + MIT-license&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Parjanya&#8217;s Polyrepo Architecture: Building Scalable AI/LLM Products with Organizational Autonomy (Part 1)&quot;,&quot;publishedBylines&quot;:[],&quot;post_date&quot;:&quot;2025-12-23T12:34:44.703Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!DlFL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48be658-e370-4fcc-861a-5574afd8b22f_782x533.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/parjanyas-polyrepo-architecture-building&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:182407614,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>ML engineers don&#8217;t need to understand IAM condition keys.</p><p>Infrastructure engineers don&#8217;t need to navigate PyTorch dependencies.</p><p>Backend engineers don&#8217;t need to modify Terraform every time they ship a feature.</p><p>But Terraform exposed a challenge that few people talk about:</p><p><strong>cross-repository infrastructure dependencies.</strong></p><p>The moment one repository depends on infrastructure outputs defined in another, coordination becomes critical.</p><p>A renamed Terraform output in one repository can quietly break another repository that references it through remote state.</p><p>I&#8217;ve been bitten by this more than once.</p><p>Terraform didn&#8217;t prevent those mistakes.</p><p>What it did provide was visibility.</p><p>And visibility is often the difference between a recoverable issue and a production incident.</p><div><hr></div><h2>What Terraform Actually Improved</h2><p>A lot of Terraform discussions stay theoretical.</p><p>Here&#8217;s what it changed in practice for us.</p><h3>ECS and Warm Pools</h3><p>One of the first problems we tackled was cold-start latency.</p><p>Inference workloads running on ECS-backed EC2 instances would occasionally wait several minutes for capacity to become available.</p><p>To solve this, we implemented Auto Scaling Group warm pools.</p><p>The result wasn&#8217;t just faster startup times.</p><p>It gave us a repeatable way to define capacity behavior for different tenant tiers.</p><p>Instead of manually tuning infrastructure across environments, we could express those decisions through variables and deploy them consistently.</p><p>That may sound mundane.</p><p>But consistency becomes incredibly valuable once multiple environments, tenants, and deployment pipelines are involved.</p><div><hr></div><h3>Multi-Tenant S3 Isolation</h3><p>Parjanya is a multi-tenant platform.</p><p>Tenant isolation isn&#8217;t optional.</p><p>Terraform allowed us to codify S3 prefix-level isolation directly into IAM policies.</p><p>The most important outcome wasn&#8217;t the policy itself.</p><p>It was the reviewability.</p><p>A missing condition that could have exposed tenant object metadata became visible during code review instead of after deployment.</p><p>That&#8217;s one of Terraform&#8217;s underrated strengths:</p><p>It turns invisible infrastructure assumptions into visible diffs.</p><div><hr></div><h3>DynamoDB Tenant Boundaries</h3><p>The same pattern applied to DynamoDB.</p><p>Every tenant&#8217;s data is partitioned using tenant identifiers, with IAM enforcing access boundaries.</p><p>Could application code enforce those rules?</p><p>Yes.</p><p>Should application code be the only layer enforcing them?</p><p>Absolutely not.</p><p>Terraform helped us move those guarantees into infrastructure itself.</p><p>Even if application logic fails, IAM remains the final gatekeeper.</p><div><hr></div><h3>Event-Driven Infrastructure</h3><p>Parjanya&#8217;s processing pipeline relies heavily on EventBridge and SQS.</p><p>Before Terraform, environment drift was a recurring problem.</p><p>A queue configuration changed in Production but not Development.</p><p>An EventBridge rule existed in one environment but not another.</p><p>Over time these differences accumulate.</p><p>Terraform gave us repeatability.</p><p>The same modules, deployed consistently, dramatically reduced configuration divergence.</p><div><hr></div><h2>The Three-Account Migration</h2><p>The biggest Terraform project in Parjanya v2.0 wasn&#8217;t a service deployment.</p><p>It was infrastructure reorganization.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;78556e34-5bf1-4614-8cb0-f0c964a7944f&quot;,&quot;caption&quot;:&quot;When you&#8217;re building a startup, the default path is obvious:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Why We Use Three AWS Accounts (Not Two) for Parjanya v2.0&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-06-15T04:34:11.507Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!QEIO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18c5c405-f110-4c39-aa87-4a649cc75bf0_1536x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/why-we-use-three-aws-accounts-not&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:202074805,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>We migrated from a single AWS account into:</p><ul><li><p>Management / Tooling</p></li><li><p>Development</p></li><li><p>Production</p></li></ul><p>Terraform made that migration possible.</p><p>It did not make it easy.</p><div><hr></div><h3>Making State Account-Aware</h3><p>Our original infrastructure assumed everything lived in one account.</p><p>Provider configurations were implicit.</p><p>Cross-account roles didn&#8217;t exist.</p><p>Account boundaries didn&#8217;t exist.</p><p>The first step was making account ownership explicit.</p><p>That sounds simple until you realize every Terraform resource suddenly needs to know which AWS account it belongs to.</p><p>The work wasn&#8217;t intellectually difficult.</p><p>It was painstaking.</p><p>And this is where I learned an important lesson about AI-assisted engineering:</p><p>AI is surprisingly bad at repetitive infrastructure migrations unless it has complete context.</p><div><hr></div><h3>Migrating State Safely</h3><p>One of the most valuable Terraform commands I encountered during this process was:</p><p><code>terraform state mv</code></p><p>State migration sounds boring.</p><p>Until you realize a single mistake can cause Terraform to believe a production resource should be destroyed and recreated.</p><p>The migration process became an exercise in discipline:</p><p>Move state.</p><p>Run a plan.</p><p>Review carefully.</p><p>Repeat.</p><p>Slowly.</p><p>The temptation to batch changes is enormous.</p><p>Resisting that temptation saved us multiple times.</p><div><hr></div><h3>Cross-Account IAM</h3><p>The three-account architecture introduced a new category of complexity.</p><p>Trust relationships.</p><p>The Management account hosts shared tooling.</p><p>Development and Production need access to those resources.</p><p>Terraform became the mechanism for expressing those trust boundaries consistently.</p><p>What surprised me wasn&#8217;t the complexity of the IAM policies.</p><p>It was how much architectural thinking is required before writing any Terraform.</p><p>The tooling faithfully implements your design.</p><p>It does not validate whether the design itself is sensible.</p><div><hr></div><h3>Centralized State Management</h3><p>One decision I remain happy with is keeping Terraform state centralized within the Management account.</p><p>Development engineers can operate Development.</p><p>Production operators can manage Production.</p><p>But neither automatically gains access to every state file.</p><p>This separation aligns with the overall philosophy behind the architecture:</p><p>Boundaries first.</p><p>Convenience second.</p><div><hr></div><h2>Where AI Helped &#8212; And Where It Didn&#8217;t</h2><p>Throughout this migration I relied heavily on AI-assisted development.</p><p>Claude became part of the workflow.</p><p>Over time I learned that different models excel at very different tasks.</p><p>The results were revealing.</p><div><hr></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;172d4a1b-7754-4334-8b8f-aa5828ec4385&quot;,&quot;caption&quot;:&quot;A few months ago, I wrote about why I believed in a Haiku-first strategy: start with the cheapest and fastest model possible, then escalate only when the task genuinely becomes harder. That idea still makes sense in principle.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Sonnet 4.6 Became My New Benchmark for Building an Infra-Heavy VLM Platform&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-11T04:33:51.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!OkJ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/sonnet-46-became-my-new-benchmark&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:197172333,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h3>Haiku: Fast But Dangerous for Infrastructure</h3><p>Haiku was excellent at generating boilerplate.</p><p>Variable files.</p><p>Module outputs.</p><p>Simple scaffolding.</p><p>But infrastructure isn&#8217;t just syntax.</p><p>Infrastructure is reasoning.</p><p>I repeatedly found that Haiku could generate valid Terraform that contained subtle security flaws.</p><p>The code looked correct.</p><p>The logic wasn&#8217;t.</p><p>That distinction matters.</p><p>A lot.</p><p>My conclusion became simple:</p><p><strong>Haiku should never be trusted with security-sensitive infrastructure decisions.</strong></p><div><hr></div><h3>Sonnet: The Daily Driver</h3><p>Most of our Terraform work happened with Sonnet.</p><p>For implementation tasks inside a repository, it performed extremely well.</p><p>Module structures.</p><p>Provider configurations.</p><p>Refactors.</p><p>General Terraform development.</p><p>Where it struggled was context.</p><p>A repository rename might affect multiple repositories.</p><p>A queue change might impact systems it couldn&#8217;t see.</p><p>The problem wasn&#8217;t model intelligence.</p><p>The problem was visibility.</p><p>The model can only reason about what you show it.</p><div><hr></div><h3>Opus: Better at Architecture Than Implementation</h3><p>I brought Opus into the process whenever decisions became architectural.</p><p>Questions like:</p><ul><li><p>Should this responsibility live in Management or Production?</p></li><li><p>How should artifacts flow between accounts?</p></li><li><p>What&#8217;s the cleanest trust model?</p></li></ul><p>These are trade-off questions.</p><p>Opus consistently handled them better than implementation-focused tasks.</p><p>The irony was that the more strategic the question became, the more useful the model became.</p><div><hr></div><h2>The Biggest Problem Wasn&#8217;t Terraform</h2><p>It Was Context.</p><p>This became one of the clearest lessons from Parjanya v2.0.</p><p>The hardest infrastructure problems weren&#8217;t provider bugs.</p><p>They weren&#8217;t Terraform limitations.</p><p>They weren&#8217;t AWS limitations.</p><p>They were context problems.</p><p>Infrastructure lived in one repository.</p><p>ML workloads lived in another.</p><p>Shared interfaces lived somewhere else.</p><p>Every repository understood part of the system.</p><p>No repository understood the entire system.</p><p>That&#8217;s why we started building supporting tooling and internal agents focused on context discovery and verification.</p><p>The challenge wasn&#8217;t generating code.</p><p>The challenge was understanding the system before generating code.</p><div><hr></div><h2>What Terraform Didn&#8217;t Solve</h2><p>It&#8217;s important to be honest about this.</p><p>Terraform isn&#8217;t a cure-all.</p><p>We still accumulated module sprawl.</p><p>We still dealt with drift.</p><p>We still had to manage secrets separately.</p><p>We still needed human judgment when reviewing large infrastructure changes.</p><p>Terraform gave us control.</p><p>It did not eliminate responsibility.</p><div><hr></div><h2>The Practical Lessons</h2><p>If I were starting again today, these are the lessons I&#8217;d carry forward.</p><p><strong>Use Terraform to enforce boundaries, not just provision resources.</strong></p><p><strong>Treat account architecture as an IAM problem first and a Terraform problem second.</strong></p><p><strong>Invest in cross-repository visibility before investing in more automation.</strong></p><p><strong>Choose AI models based on task type, not convenience.</strong></p><p><strong>Review infrastructure plans like code. Because they are.</strong></p><p><strong>Prioritize understanding the system before changing it.</strong></p><p>Most infrastructure failures aren&#8217;t caused by bad tooling.</p><p>They&#8217;re caused by incomplete context.</p><div><hr></div><h2>Looking Ahead</h2><p>The three-account architecture gave us the boundaries.</p><p>Terraform gave us the implementation.</p><p>But neither addressed another challenge that emerged as Parjanya&#8217;s inference workloads grew:</p><p>Cost.</p><p>Specifically, inference cost.</p><p>While we were optimizing infrastructure, another inefficiency was hiding in plain sight.</p><p>Our VLM system prompt had quietly grown to over 4,000 tokens.</p><p>Most of it wasn&#8217;t doing useful work.</p><p>Tomorrow&#8217;s post moves from infrastructure into inference engineering.</p><p>I&#8217;ll share how we reduced prompt size by nearly 70%, doubled throughput on the same hardware, and discovered that some of the most impactful optimizations don&#8217;t involve changing models at all.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;255188e9-f6ce-4a93-bb4d-47d72d38a327&quot;,&quot;caption&quot;:&quot;TL;DR: I noticed Haiku 4.5 being spawned as a subagent during an Opus 4.7 session. That observation opened a data investigation that revealed ~77% of my token spend was context accumulation waste, not productive reasoning. This is the framework I built to fix it &#8212; and the problem has a name:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Context Engineering and Context Debt&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-20T06:06:57.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!dA7S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/context-engineering-and-context-debt&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:198514119,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>The Takeaway</h2><p>Terraform didn&#8217;t make Parjanya v2.0 successful.</p><p>What it did was force us to be explicit.</p><p>Explicit about ownership.</p><p>Explicit about trust boundaries.</p><p>Explicit about infrastructure decisions.</p><p>And perhaps most importantly, explicit about the assumptions we were making.</p><p>That&#8217;s the real value of Infrastructure as Code.</p><p>Not automation.</p><p>Clarity.</p><p>And clarity scales far better than heroics.</p><div><hr></div><p><em>This is part of my ongoing Parjanya v2.0 field notes, documenting the architectural, operational, and engineering decisions behind building a multi-tenant AI platform. In the next post, I&#8217;ll move beyond infrastructure and into inference optimization&#8212;where a prompt review ended up delivering more value than a hardware upgrade.</em></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Why We Use Three AWS Accounts (Not Two) for Parjanya v2.0]]></title><description><![CDATA[The infrastructure decision most startups postpone &#8212; and the one I almost did too]]></description><link>https://blog.phagyul.ai/p/why-we-use-three-aws-accounts-not</link><guid isPermaLink="false">https://blog.phagyul.ai/p/why-we-use-three-aws-accounts-not</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Mon, 15 Jun 2026 04:34:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UKDk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When you&#8217;re building a startup, the default path is obvious:</p><p>One AWS account.</p><p>Maybe two if you&#8217;re feeling disciplined.</p><p>One for development. One for production.</p><p>It sounds clean. It sounds sufficient.</p><p>For a while, I thought so too.</p><p>As Parjanya evolved into a multi-tenant image processing platform with real workloads, real customers, and increasingly complex infrastructure, I started asking a different question:</p><p><strong>What does the minimum viable production-grade AWS architecture actually look like?</strong></p><p>The answer wasn&#8217;t one account.</p><p>It wasn&#8217;t even two.</p><p>It was three.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UKDk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UKDk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!UKDk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!UKDk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!UKDk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UKDk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1357909,&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://blog.phagyul.ai/i/202074805?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.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_!UKDk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!UKDk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!UKDk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!UKDk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a8ba4f8-7108-45e5-8859-896188a41372_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Today Parjanya v2.0 runs on a three-account AWS structure:</p><ul><li><p>Management / Tooling</p></li><li><p>Development</p></li><li><p>Production</p></li></ul><p>It added complexity upfront.</p><p>It also removed entire categories of risk that I didn&#8217;t want to discover during an incident.</p><p>This post explains why I made that decision, what problems it solved, what I intentionally chose not to build yet, and how I think other SaaS teams should approach the same trade-offs.</p><div><hr></div><h2>The Setup We Started With</h2><p>Like most startups, we began with a single AWS account.</p><p>Everything lived there:</p><ul><li><p>Development resources</p></li><li><p>Production workloads</p></li><li><p>CI/CD pipelines</p></li><li><p>Container registries</p></li><li><p>Shared infrastructure</p></li></ul><p>The setup was fast.</p><p>The problem with fast is that it often hides risk.</p><p>Nothing feels wrong until the day an experiment, a permission mistake, or an infrastructure change unexpectedly affects production.</p><p>As we started formalising Parjanya v2.0, I realised I didn&#8217;t want to keep relying on discipline alone.</p><p>I wanted structural safety.</p><p>That&#8217;s when the three-account model emerged.</p><div><hr></div><h2>The Third Account Isn&#8217;t Staging</h2><p>Whenever I mention three accounts, people assume I mean:</p><ul><li><p>Dev</p></li><li><p>Staging</p></li><li><p>Prod</p></li></ul><p>That&#8217;s not what I built.</p><p>The structure is:</p><h3>Management / Tooling Account</h3><p>This account owns the operational plumbing:</p><ul><li><p>Container registry</p></li><li><p>Terraform state</p></li><li><p>CI/CD definitions</p></li><li><p>Cross-account IAM roles</p></li><li><p>Billing aggregation</p></li><li><p>Audit aggregation</p></li></ul><p>Importantly, <strong>it never runs application workloads.</strong></p><h3>Development Account</h3><p>This is where experimentation happens.</p><p>Infrastructure changes.</p><p>New features.</p><p>Testing.</p><p>Things break here by design.</p><h3>Production Account</h3><p>This runs live tenant workloads and customer-facing infrastructure.</p><p>Nothing experimental belongs here.</p><p>The critical insight is that the third account isn&#8217;t another environment.</p><p>It&#8217;s neutral territory.</p><p>It owns the things both Dev and Prod need, without forcing either environment to depend directly on the other.</p><div><hr></div><h2>The First Problem It Solves: Artifact Ownership</h2><p>Consider a simple CI/CD pipeline.</p><p>It builds a Docker image.</p><p>Where should that image live?</p><p>If the registry sits in Dev, then Production depends on Development.</p><p>If the registry sits in Prod, Development depends on Production.</p><p>Neither feels right.</p><p>The Management account solves this neatly.</p><p>CI builds once.</p><p>Pushes once.</p><p>Both Dev and Prod pull the exact same artifact.</p><p>No rebuilds.</p><p>No copies.</p><p>No divergence.</p><p>One image.</p><p>One source of truth.</p><p>Multiple promotions.</p><p>That sounds like a small detail until you&#8217;re debugging an issue and need absolute confidence that Production is running the same artifact that passed validation earlier.</p><div><hr></div><h2>The Real Reason: Blast Radius</h2><p>This is the reason that mattered most to me.</p><p>AWS accounts are the strongest isolation boundary AWS provides.</p><p>A broken IAM policy.</p><p>An accidental deletion.</p><p>A Terraform mistake.</p><p>A bad deployment.</p><p>These things cannot casually cross account boundaries.</p><p>That matters because Development should be chaotic.</p><p>People test things.</p><p>Infrastructure changes.</p><p>Experiments happen.</p><p>Failures are expected.</p><p>Production should not inherit that chaos.</p><p>With separate accounts, Dev can fail spectacularly and Prod remains untouched.</p><p>That&#8217;s a much stronger guarantee than &#8220;everyone promises to be careful.&#8221;</p><div><hr></div><h2>Credentials Become Safer by Default</h2><p>A surprisingly useful side effect is credential isolation.</p><p>When someone is working in the Dev account, their credentials only see Dev resources.</p><p>They aren&#8217;t merely discouraged from touching Production.</p><p>Production is outside their scope.</p><p>The same applies to automation.</p><p>The deployment pipeline for Dev assumes different roles than the deployment pipeline for Prod.</p><p>The separation isn&#8217;t cultural.</p><p>It&#8217;s structural.</p><p>And structural controls tend to survive stressful situations much better than process documents.</p><div><hr></div><h2>Cost Visibility Becomes Obvious</h2><p>Another benefit I underestimated was cost attribution.</p><p>Using AWS Organizations means every account naturally reports its own spending.</p><p>Development spend is visible.</p><p>Production spend is visible.</p><p>There&#8217;s no tagging strategy to maintain.</p><p>No allocation spreadsheets.</p><p>No cost archaeology.</p><p>When the AWS bill changes, I immediately know whether it was caused by:</p><ul><li><p>a production feature,</p></li><li><p>increased tenant activity,</p></li><li><p>or a development experiment that ran longer than intended.</p></li></ul><p>That clarity is surprisingly valuable.</p><div><hr></div><h2>What Lives Where</h2><p>The distribution is straightforward.</p><h3>Management Account</h3><ul><li><p>Container registry</p></li><li><p>Terraform backend</p></li><li><p>CI/CD pipelines</p></li><li><p>Cross-account IAM roles</p></li><li><p>Billing aggregation</p></li><li><p>Audit logging</p></li></ul><h3>Development Account</h3><ul><li><p>Full application stack</p></li><li><p>Synthetic tenant data</p></li><li><p>Reduced-scale services</p></li><li><p>Fast feedback loops</p></li><li><p>Manual automation triggers</p></li></ul><h3>Production Account</h3><ul><li><p>Live tenant workloads</p></li><li><p>Customer-facing services</p></li><li><p>Scheduled automation</p></li><li><p>Alerting</p></li><li><p>Full-scale infrastructure</p></li></ul><p>The key principle is simple:</p><p><strong>No application workloads run in the Management account.</strong></p><p>It exists to operate the platform, not host it.</p><div><hr></div><h2>The Deployment Flow</h2><p>The deployment path now looks like this:</p><ol><li><p>Code lands on the main branch.</p></li><li><p>CI/CD runs in the Management account.</p></li><li><p>The pipeline assumes a deployment role in Dev.</p></li><li><p>Integration tests run.</p></li><li><p>The same artifact is promoted into Prod.</p></li></ol><p>Production never builds code.</p><p>Production never owns source repositories.</p><p>Production simply runs validated artifacts.</p><p>That separation removes a surprising amount of operational risk.</p><div><hr></div><h2>What I Chose Not to Build Yet</h2><p>Architecture decisions are often more about what you don&#8217;t build than what you do.</p><h3>No Staging Environment</h3><p>Yet.</p><p>A true staging environment means maintaining a production-like replica.</p><p>That&#8217;s useful.</p><p>It&#8217;s also expensive.</p><p>At our current scale, good automated testing in Dev provides far more value than maintaining another full environment.</p><p>The architecture already supports a staging account.</p><p>I simply chose not to pay for it yet.</p><h3>No Tenant-Level VPC Isolation</h3><p>Today tenant isolation is logical rather than physical.</p><p>Data boundaries are enforced at the application and storage layers.</p><p>Per-tenant VPCs or accounts add stronger isolation, but also significant complexity.</p><p>Most SaaS companies don&#8217;t need that level of separation until enterprise customers explicitly require it.</p><p>We&#8217;re not there yet.</p><h3>No Dedicated Security Account</h3><p>AWS would ideally have:</p><ul><li><p>Management</p></li><li><p>Security</p></li><li><p>Dev</p></li><li><p>Prod</p></li></ul><p>with centralized immutable audit storage.</p><p>I agree with that architecture.</p><p>I also believe infrastructure maturity should follow business reality.</p><p>We&#8217;ll add a dedicated security account when compliance requirements justify it.</p><p>Not before.</p><div><hr></div><h2>My Rule of Thumb for Startups</h2><p>If you&#8217;re building a SaaS product and you&#8217;ve moved beyond proof-of-concept, my recommendation is straightforward:</p><h3>Start with Three Accounts</h3><p>Management.</p><p>Development.</p><p>Production.</p><p>The setup overhead is measured in hours.</p><p>The long-term safety benefits are measured in years.</p><h3>Don&#8217;t Rush Into Staging</h3><p>Build staging when your release process genuinely requires it.</p><p>Not because every architecture diagram on the internet includes one.</p><h3>Use AWS Organizations Early</h3><p>Retrofitting Organizations later is painful.</p><p>Starting with it is easy.</p><p>Future-you will be grateful.</p><h3>Treat the Management Account as Permanent Infrastructure</h3><p>Products evolve.</p><p>Tooling evolves.</p><p>The operational foundation should remain stable.</p><p>The Management account owns the plumbing, not the application.</p><div><hr></div><h2>Looking Ahead</h2><p>The current structure gives me a clear path forward.</p><p>When the platform grows, I can add:</p><ul><li><p>A staging account</p></li><li><p>A dedicated security account</p></li><li><p>Enterprise tenant accounts</p></li></ul><p>Each becomes an extension of the existing architecture rather than a redesign.</p><p>That&#8217;s exactly what I wanted.</p><div><hr></div><h2>The Takeaway</h2><p>The strongest boundary in AWS is the account boundary.</p><p>Use it deliberately.</p><p>For me, three accounts turned out to be the minimum structure that delivered:</p><ul><li><p>blast-radius isolation,</p></li><li><p>clean credential scoping,</p></li><li><p>predictable deployments,</p></li><li><p>and clear cost attribution.</p></li></ul><p>Not because it&#8217;s elegant on a diagram.</p><p>Because it makes operational mistakes dramatically less expensive.</p><p>Parjanya v2.0 is being built with longevity in mind.</p><p>The three-account architecture is one of the quiet decisions that makes everything else possible.</p><div><hr></div><p>The architecture looks clean on a diagram.</p><p>Reality was messier.</p><p>Moving Parjanya from a single AWS account to a three-account model meant refactoring Terraform state, redesigning IAM trust relationships, rebuilding deployment pipelines, and discovering that AI-generated infrastructure code is only as good as the context you give it.</p><p>Tomorrow, I&#8217;ll share the implementation story&#8212;what broke, what surprised us, and why the hardest part of infrastructure isn&#8217;t Terraform itself, but managing context across systems, repositories, and teams.</p><div><hr></div><p><em>This is part of my ongoing field notes from building Parjanya v2.0 &#8212; a multi-tenant image QA platform. I write about the architectural decisions, trade-offs, mistakes, and lessons learned while building it in public.</em></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Archetypes of the Southern Ocean]]></title><description><![CDATA[How the Falkland Islands, South Georgia and Antarctica Changed the Way I See Wildlife]]></description><link>https://blog.phagyul.ai/p/archetypes-of-the-southern-ocean</link><guid isPermaLink="false">https://blog.phagyul.ai/p/archetypes-of-the-southern-ocean</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Wed, 10 Jun 2026 15:55:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kI5-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kI5-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kI5-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png 424w, https://substackcdn.com/image/fetch/$s_!kI5-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png 848w, https://substackcdn.com/image/fetch/$s_!kI5-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!kI5-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kI5-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1921499,&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://blog.phagyul.ai/i/201469626?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.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_!kI5-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png 424w, https://substackcdn.com/image/fetch/$s_!kI5-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png 848w, https://substackcdn.com/image/fetch/$s_!kI5-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!kI5-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fe0392-4e38-4076-bd17-51ed46ad3c51_1535x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A few weeks ago, one of the photographs from this series, <em>Vamana</em>, was selected as a finalist in the Black &amp; White category of the <a href="https://refocus-awards.com/people-vote-award/vamana">ReFocus Awards.</a></p><p>The image sparked an unexpected response. Friends who had seen it over the past several months kept asking the same questions:</p><div class="pullquote"><p><em><strong>&#8220;How was this created?&#8221;</strong></em></p><p><em><strong>&#8220;Was it made in-camera?&#8221;</strong></em></p><p><em><strong>&#8220;What were you trying to show?&#8221;</strong></em></p><p><em><strong>&#8220;Why does it feel mythological?&#8221;</strong></em></p></div><p>I promised to write about it when I first shared the image shortly after returning from Antarctica in October 2025. Like many unfinished promises to myself, it remained buried beneath work, travel, writing and countless photographs waiting to be processed.</p><p>The ReFocus recognition felt like the right moment to finally tell the story.</p><p>Because these photographs were never planned as a project.</p><p>They emerged gradually during the journey.</p><p>And like many of my favourite images, they began with a problem.</p><div><hr></div><h2>The Problem of Scale</h2><p>Antarctica, South Georgia and the Falkland Islands repeatedly confronted me with a challenge that a single photograph struggled to solve.</p><p>Scale.</p><p>A portrait could show an individual bird.</p><p>A landscape could show the colony.</p><p>But neither could convey what it felt like to stand there.</p><p>One of the earliest moments came on Steeple Jason Island in the Falklands.</p><p>Before landing, we had been briefed that we would be visiting one of the world&#8217;s largest Black-browed Albatross colonies.</p><p>I knew the numbers.</p><p>I had seen the photographs.</p><p>But numbers and photographs do not prepare you for the experience.</p><p>As I climbed the slope and looked across the colony, thousands upon thousands of albatrosses occupied the hillsides in every direction.</p><p>My instinct was to photograph an individual bird.</p><p>My second instinct was to photograph the colony.</p><p>Neither image felt complete.</p><p>The bird lacked context.</p><p>The landscape lacked intimacy.</p><p>I wanted both.</p><p>That was the moment the experiment began.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!opmB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!opmB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!opmB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!opmB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!opmB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!opmB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1209987,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/201469626?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.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_!opmB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!opmB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!opmB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!opmB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a368b4-d573-4446-82e4-5ed5d4186d98_1920x1281.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Discovering Multiple Exposure</h2><p>The Canon R5C includes an in-camera multiple exposure mode.</p><p>It is a feature that many photographers know exists but few use regularly.</p><p>I had experimented with it before, but mostly as a creative exercise.</p><p>This time it felt useful.</p><p>Instead of creating a portrait and a landscape separately, I wondered whether I could combine them into a single frame.</p><p>Not digitally.</p><p>Not later in Photoshop.</p><p>But in-camera.</p><p>The goal wasn&#8217;t artistic abstraction.</p><p>At least not initially.</p><p>The goal was documentation.</p><p>I wanted to document how the place felt.</p><p>My settings remained remarkably simple throughout the project:</p><ul><li><p>Canon R5C</p></li><li><p>RF 100-500mm lens</p></li><li><p>Multiple Exposure mode</p></li><li><p>Continuous shooting</p></li><li><p>Additive/Luminance blending</p></li><li><p>Mostly 2 exposures per image (3 exposures only for <em>Vamana)</em></p></li></ul><p>Luminance blending proved especially important.</p><p>It allowed brighter areas from one frame to merge naturally with darker regions from another, creating layered images that retained structure without becoming visually chaotic.</p><p>The process quickly became addictive.</p><p>Instead of searching for a decisive moment, I began searching for relationships between moments.</p><div><hr></div><h2>Rajahamsa</h2><p>The first successful image from the experiment became what I later titled <em><strong>Rajahamsa</strong></em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o-Oe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o-Oe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!o-Oe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!o-Oe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!o-Oe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o-Oe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1175173,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/201469626?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.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_!o-Oe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!o-Oe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!o-Oe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!o-Oe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F052d764e-26e6-4676-b3e2-c7ebd087756e_1920x1281.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A Black-browed Albatross emerged from within its own colony.</p><p>The bird was simultaneously an individual and a multitude.</p><p>The more I looked at the image, the less it felt like a documentary photograph.</p><p>Something symbolic had appeared.</p><p>At the time I couldn&#8217;t fully explain it.</p><p>I only knew the image felt different.</p><p>It seemed to contain an idea rather than merely a subject.</p><p>Looking back now, I realize that was the first indication that the project was heading somewhere unexpected.</p><div><hr></div><h2>From Observation to Archetype</h2><p>The transformation happened gradually.</p><p>Not during editing.</p><p>Not even during shooting.</p><p>It happened while looking.</p><p>Many of the stories we encounter in childhood never truly leave us.</p><p>They remain dormant somewhere beneath conscious thought.</p><p>Standing among vast colonies of birds and seals at the edge of the world, those stories began resurfacing.</p><p>Not literally.</p><p>Symbolically.</p><p>The animals remained animals.</p><p>But they also began to resemble archetypes.</p><p>The same way clouds occasionally resemble faces.</p><p>Or mountains resemble sleeping giants.</p><p>The photographs were becoming bridges between observation and imagination.</p><div><hr></div><h2>Vamana</h2><p>The turning point arrived with a lone penguin(A&#271;el&#233;) standing alone an ice scape and there near by an immense colony of Adele and Rockhopper (I recall!)</p><p>Unlike the other images in the series, <em>Vamana</em> required three exposures.</p><p>An individual penguin.</p><p>The colony below.</p><p>The surrounding landscape.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!t4vK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!t4vK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg 424w, https://substackcdn.com/image/fetch/$s_!t4vK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg 848w, https://substackcdn.com/image/fetch/$s_!t4vK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!t4vK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!t4vK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg" width="1456" height="761" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:761,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1227283,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/201469626?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.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_!t4vK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg 424w, https://substackcdn.com/image/fetch/$s_!t4vK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg 848w, https://substackcdn.com/image/fetch/$s_!t4vK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!t4vK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47892cc-1249-40a9-bca5-7f1144ef15c7_1920x1003.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When the image appeared on the camera screen, something immediately felt familiar.</p><p>A small figure.</p><p>An immeasurable world.</p><p>A paradox of scale.</p><p>It reminded me of Vamana, the dwarf incarnation who expands beyond expectation and measures the universe itself.</p><p>The connection was not deliberate.</p><p>It emerged after the photograph existed.</p><p>The mythology wasn&#8217;t guiding the image.</p><p>The image was awakening the mythology.</p><p>For the first time I began wondering whether these photographs might belong together as a series.</p><div><hr></div><h2>Jatayu</h2><p>If there is a photograph that convinced me the project was real, it was <em>Jatayu</em>.</p><p>Captured among the king penguin colonies of South Georgia, the image combines a chick&#8217;s portrait with thousands of penguins spread across a glacial valley.</p><p>The resulting figure feels monumental.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T76a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T76a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!T76a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!T76a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!T76a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T76a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1387963,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/201469626?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.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_!T76a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!T76a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!T76a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!T76a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d3168e-52fc-474e-8ed8-f5d25b5d2ff0_1920x1281.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Protective.</p><p>Almost watchful.</p><p>The glacier behind it only amplifies that sensation.</p><p>I remember staring at the rear LCD and immediately thinking:</p><p><strong>&#8220;That looks like Jatayu.&#8221;</strong></p><p>Not because it resembled any traditional depiction.</p><p>But because it carried the emotional weight I associated with the character.</p><p>Courage.</p><p>Guardianship.</p><p>Sacrifice.</p><p>For the first time, I stopped thinking about multiple exposure as a technique.</p><p>And started thinking about it as a language.</p><div><hr></div><h2>When Wildlife Becomes Myth</h2><p>One question I am often asked is whether these photographs were intended to illustrate Hindu mythology.</p><p>The answer is no.</p><p>At least not consciously.</p><p>I wasn&#8217;t searching for Vamana.</p><p>I wasn&#8217;t searching for Jatayu.</p><p>I wasn&#8217;t searching for Rajahamsa.</p><p>I was searching for ways to describe experiences that exceeded the limits of a single frame.</p><p>The mythology appeared later.</p><p>What fascinates me now is that this happened almost automatically.</p><p>Faced with extraordinary wildlife spectacles, my mind reached for archetypes I had inherited through stories.</p><p>Perhaps that is what myths have always done.</p><p>They give us a language for experiences that feel larger than ordinary reality.</p><div><hr></div><h2>Technical Notes</h2><p>All photographs in this series were created entirely in-camera using the Canon R5C.</p><p>No compositing was performed in post-processing.</p><p>The images rely on:</p><ul><li><p>Multiple Exposure mode</p></li><li><p>Continuous shooting</p></li><li><p>Luminance blending</p></li><li><p>Telephoto compression using the RF 100-500mm lens</p></li></ul><p>Most images use two exposures.</p><p><em>Vamana</em> uses three exposures.</p><p>What appears complex is actually the result of repeated experimentation in the field and a willingness to embrace unpredictability.</p><p>The final image often revealed itself only after the shutter sequence was complete.</p><div><hr></div><h2>Looking Back</h2><p>When I boarded the expedition vessel, I expected wildlife photography.</p><p>I did not expect a conversation with memory.</p><p>Yet that is ultimately what this project became.</p><p>The Southern Ocean presented extraordinary animals, extraordinary landscapes and extraordinary scale.</p><p>Multiple exposure allowed those experiences to coexist within a single frame.</p><p>And somewhere between observation and imagination, the birds became archetypes.</p><p>Not because they ceased being wildlife.</p><p>But because they became something more.</p><p>A reminder that every act of seeing is shaped by the stories we carry with us.</p><div><hr></div><p>more images from the series arrived unexpectedly, </p><h3>Matsya &#8594; Preservation of life</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fzMD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fzMD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fzMD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fzMD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fzMD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fzMD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:965530,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/201469626?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.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_!fzMD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fzMD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fzMD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fzMD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40da258-5c03-4e04-bd89-fdd47f8f5d33_1920x1281.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>While photographing a Gentoo penguin colony in Antarctica, I created a multiple exposure that combined the landscape, the colony, and a solitary penguin. Later, as I revisited the frame, it reminded me of <strong>Matsya</strong>, the fish incarnation of Vishnu in Hindu mythology.</p><p>In the ancient story, Matsya appears during a great deluge and guides a vessel carrying life through the flood, ensuring continuity when the world stands on the edge of destruction. In this photograph, the expedition ship (our own Ortelius MV) rests in the distant background while the penguin emerges as a quiet, symbolic guide in the foreground. The resemblance was not planned in the field, but revealed itself later&#8212;one of those moments where photography becomes less about recording what is seen and more about discovering meaning within what was witnessed.</p><p>Whether coincidence or subconscious association, the image felt like a reminder that stories often exist before we recognize them. The camera records light; imagination completes the journey.</p><h3>Varaha &#8594; Restoration of the world</h3><p>By the end of the expedition, I had stopped looking for specific characters. Instead, I simply observed and waited for forms to emerge on their own. Varaha appeared unexpectedly&#8212;in the shape of ice, snow, and a colony scattered across the shoreline. In Hindu mythology, Varaha rescues the Earth from cosmic waters and restores balance to the world. Standing in Antarctica, a place that constantly reminds us of both fragility and endurance, I found the symbolism difficult to ignore. It became a fitting final archetype: not a story of survival alone, but of renewal.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1owV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1owV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1owV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1owV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1owV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1owV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1093809,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/201469626?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.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_!1owV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1owV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1owV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1owV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6aca099-1339-472c-956c-e4b72e522df0_1920x1281.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>I will be Continuing the search for new archetypes in new landscapes in the future</strong></p><div><hr></div><p>What began as an experiment has quietly become an ongoing creative pursuit. I now find myself actively searching for new characters and visual metaphors wherever I travel. They may emerge from different landscapes, different species, and different cultures, but the underlying idea remains the same: finding stories that exist somewhere between reality and imagination. More than anything, this project reminded me how much joy there is in playful exploration. I had an incredible amount of fun creating these images, and I look forward to discovering where the next character appears. You can follow my work <a href="https://www.instagram.com/jagadeeshrampam/">here</a> </p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Building a Second Brain]]></title><description><![CDATA[Why memory, context and accumulated knowledge may matter more than bigger models.]]></description><link>https://blog.phagyul.ai/p/building-a-second-brain</link><guid isPermaLink="false">https://blog.phagyul.ai/p/building-a-second-brain</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Sun, 07 Jun 2026 03:51:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JmrH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the years, I&#8217;ve accumulated thousands of notes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JmrH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JmrH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JmrH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JmrH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JmrH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JmrH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1900925,&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://blog.phagyul.ai/i/200964585?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.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_!JmrH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JmrH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JmrH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JmrH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7e86d4-2dfd-4b80-bc74-f997eb2a05da_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The challenge was never collecting information.</p><p>The challenge was remembering it, connecting it and turning it into something useful.</p><p>Modern AI is remarkably capable.</p><p>Yet most systems remain surprisingly forgetful.</p><p>Every conversation begins from scratch.</p><p>Every project requires context to be reintroduced.</p><p>Every insight risks being lost in another folder, notebook or document.</p><p>The more I worked across research, photography, software, storytelling and archival work, the more obvious the problem became:</p><p><strong>Knowledge was accumulating faster than understanding.</strong></p><p>Instead of building another assistant, I started exploring a different idea.</p><p>What would a genuine second brain look like?</p><p>Not a chatbot.</p><p>Not a search engine.</p><p>Not a note-taking application.</p><p>A system that could:</p><p><strong>Observe &#8594; Remember &#8594; Understand &#8594; Create &#8594; Preserve</strong></p><p>A system capable of connecting ideas across years rather than conversations.</p><p>A system that becomes more valuable as its memory grows.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;0729728d-6b46-4c80-9cbf-808dec6605ae&quot;,&quot;caption&quot;:&quot;Source: How Well Do Large Language Models Truly Ground?&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Grounding Is Not a Prompt&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-02-07T02:21:22.979Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!HHAz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f120e84-49db-45ec-a506-edf56f9c4e73_1536x970.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/grounding-is-not-a-prompt&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:187075330,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>From Information to Understanding</h2><p>Most AI systems operate on prompts.</p><p>A second brain should operate on context.</p><p>Every note should strengthen understanding.</p><p>Every project should enrich memory.</p><p>Every experiment should improve future decisions.</p><p>The objective is not simply to retrieve information.</p><p>The objective is to build accumulated intelligence.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;46b420b4-892c-4a6e-bda7-aacc59164cc1&quot;,&quot;caption&quot;:&quot;Most teams deploy AI as a single endpoint.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Intelligent Model Orchestration for AI Agent Systems&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-02-12T06:05:38.014Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!X5Qv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb19fe57-9a3a-4370-bf3d-334da29e3c91_1536x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/intelligent-model-orchestration-for&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:187683979,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>The Emergence of Smriti</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iABO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iABO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!iABO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!iABO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!iABO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iABO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1466499,&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://blog.phagyul.ai/i/200964585?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.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_!iABO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!iABO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!iABO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!iABO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d92d9b-829d-4905-bb20-7d985a5df33f_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This thinking eventually evolved into a concept I now call:</p><p><strong>Parjanya&#8217;s Second Brain</strong></p><p>At its core sits <strong>Smriti</strong>.</p><p>Smriti is not simply another product.</p><p>It is the memory and intelligence layer that connects everything else.</p><p>A system designed to preserve context, connect knowledge and build long-term understanding.</p><p>Around this core are four complementary domains:</p><h3>Parjanya</h3><p>Visual Intelligence</p><p>Image quality assessment, visual understanding, benchmarking and insight generation.</p><h3>WilderhoodTV</h3><p>Creative Intelligence</p><p>Storytelling, production workflows, media creation and distribution.</p><h3>Smriti</h3><p>Rooted Intelligence</p><p>Memory, context, reflection and accumulated knowledge.</p><h3>Prakriti</h3><p>Archival Intelligence</p><p>Documenting and preserving wildlife, nature, heritage and field knowledge.</p><p>Together they form a connected intelligence ecosystem rather than a collection of independent products.</p><div><hr></div><h2>Why Context Matters</h2><p>The AI industry is understandably focused on models.</p><p>Bigger models.</p><p>Smarter models.</p><p>Faster models.</p><p>But I increasingly believe the next frontier may be something else.</p><p><strong>Context.</strong></p><p>Models will continue to improve.</p><p>What remains unique is the context we accumulate.</p><p>Our notes.</p><p>Our observations.</p><p>Our projects.</p><p>Our experiences.</p><p>Our decisions.</p><p>Our understanding of the world.</p><p>Without context, intelligence becomes generic.</p><p>With context, intelligence becomes personal.</p><div><hr></div><h2>Looking Ahead</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LiwH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LiwH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!LiwH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!LiwH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!LiwH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LiwH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.png" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1596533,&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://blog.phagyul.ai/i/200964585?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_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_!LiwH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!LiwH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!LiwH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!LiwH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58623d1c-e36b-4606-b1c6-4e80e9ce9229_1024x1536.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is still an evolving idea.</p><p>The architecture will change.</p><p>The tools will change.</p><p>The models will change.</p><p>What remains constant is the underlying belief:</p><p><strong>Knowledge should not disappear. It should compound.</strong></p><p>The goal is not to automate thought.</p><p>The goal is to augment it.</p><p>To build a system that helps transform information into understanding, understanding into wisdom and wisdom into meaningful work.</p><div><hr></div><h3>Guiding Principle</h3><p><strong>Observe &#8594; Remember &#8594; Understand &#8594; Create &#8594; Preserve.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8eky!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8eky!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!8eky!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!8eky!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!8eky!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8eky!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1332917,&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://blog.phagyul.ai/i/200964585?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.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_!8eky!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!8eky!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!8eky!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!8eky!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ab7cb3-aee2-4839-af72-32d47e792ea4_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Valuing an Indian Octopus: Info Edge Through Damodaran’s Lens]]></title><description><![CDATA[Two engines. One balance sheet. A sum-of-the-parts valuation.]]></description><link>https://blog.phagyul.ai/p/valuing-an-indian-octopus-info-edge</link><guid isPermaLink="false">https://blog.phagyul.ai/p/valuing-an-indian-octopus-info-edge</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Fri, 05 Jun 2026 03:20:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YTxS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="pullquote"><p style="text-align: center;"><em><strong>DISCLAIMER: This article is part of my personal learning journey and is meant purely for educational and informational purposes. I have drawn insights from Prof. Aswath Damodaran&#8217;s publicly available teachings and financial information available in the public domain.</strong></em></p><p style="text-align: center;"><em><strong>While preparing this write-up, I referred to platforms such as Screener and AI-based study tools to better understand the concepts and validate publicly available data such as company filings and information available for investors from the company domain. The interpretations and conclusions shared here are entirely my own, and any errors or misunderstandings are solely my responsibility.</strong></em></p><p style="text-align: center;"><em><strong>This is not investment advice or a recommendation to buy, sell, or hold any securities. I encourage readers to do their own research and consult a SEBI-registered investment advisor before making any investment decisions.</strong></em></p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YTxS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YTxS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!YTxS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!YTxS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!YTxS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YTxS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1486727,&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://blog.phagyul.ai/i/200706956?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.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_!YTxS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!YTxS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!YTxS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!YTxS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c2f4773-364b-41d3-bff0-d5e495f6faed_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Key Takeaways</h2><ul><li><p>Info Edge is best understood as two businesses under one roof: a dominant internet classifieds franchise and a highly successful venture investment engine.</p></li><li><p>Traditional valuation multiples can be misleading because a significant portion of the company&#8217;s value comes from listed and unlisted investments.</p></li><li><p>A sum-of-the-parts framework, inspired by Aswath Damodaran&#8217;s valuation approach, is the most appropriate way to analyze the company.</p></li><li><p>The core operating business appears to be a high-quality, cash-generative franchise with strong margins and durable competitive advantages.</p></li><li><p>At current prices, the stock appears to be trading around fair value rather than at a significant discount.</p></li><li><p>Future returns will likely depend on both the continued strength of the Naukri ecosystem and the success of the next generation of startup investments.</p></li></ul><div><hr></div><p>When I look at Info Edge, I do not see a normal listed company. I see two businesses stitched together: a dominant, cash-generating internet classifieds franchise led by Naukri, and a venture-style investment engine that has produced extraordinary value through stakes such as Eternal and PB Fintech.</p><p><strong>That is exactly why I think Info Edge is one of the best Indian case studies for applying Professor Aswath Damodaran's framework. Damodaran has repeatedly argued that cash, cross-holdings, and other non-operating assets should be valued separately from the operating business. In his discussions on holding companies and cross-holdings, he notes that the "sum of the parts" can often be greater than the whole when these assets are not properly accounted for. For a company like Info Edge, where listed and unlisted investments contribute materially to shareholder value, a sum-of-the-parts approach is not optional&#8212;it is essential.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></strong></p><p>In Info Edge&#8217;s case, that distinction is not academic. As of June 2026, the company itself had a market capitalization of roughly &#8377;65,000 crore, while a substantial part of its value sat in listed investments and a startup portfolio that management valued at nearly &#8377;37,000 crore.</p><blockquote><p><strong>So the right question is not, &#8220;Is Naukri expensive on earnings?&#8221;</strong></p></blockquote><p>The right question is:</p><blockquote><p><strong>How much am I paying for the core franchise after adjusting for Eternal, PB Fintech, and the next cohort of private investments?</strong></p></blockquote><div><hr></div><h2>Why Info Edge Is a Perfect case study for understanding Prof. Damodaran&#8217;s lens</h2><p>Damodaran&#8217;s valuation philosophy begins with a story and then forces the numbers to be consistent with that story.</p><p>My story for Info Edge is simple.</p><p>The first engine is a high-quality operating business with a durable moat in recruitment classifieds, strong operating leverage, and real free-cash-flow discipline.</p><p>The second engine is a capital allocator with a demonstrated ability to identify, back, and hold asymmetric winners for long periods.</p><p>That combination makes Info Edge unusual.</p><p>Many companies are either operating businesses or investment vehicles.</p><p><strong>Info Edge is both.</strong></p><blockquote><p>Naukri remains the core cash machine, but the market&#8217;s view of the company is also shaped by what happened with Zomato&#8212;now Eternal&#8212;and with Policybazaar through PB Fintech.</p></blockquote><p>This also explains why plain P/E ratios can mislead. Reported earnings often include large amounts of investment-related income and mark-to-market effects, creating accounting noise that distorts headline valuation multiples.</p><div><hr></div><h2>The Operating Story I Am Telling Myself</h2><p>When I strip away the investment book, I am left with a business that is significantly better than a typical Indian internet company.</p><p>FY25 standalone revenue was approximately &#8377;2,654 crore, operating profit was around &#8377;973 crore, and the starting EBIT margin in my model was roughly 36.7%.</p><p>That is not what a fragile, capital-hungry internet business looks like.</p><p>It looks like a platform business with real pricing power and low incremental capital intensity.</p><p>Info Edge&#8217;s own disclosures increasingly describe Naukri as evolving from a traditional job-search platform into a broader talent ecosystem. That matters because deeper workflow relevance typically strengthens both customer stickiness and monetization potential.</p><p>The cash-flow quality is equally important.</p><p>Free-cash-flow conversion remains strong, and cash generation has consistently supported both internal reinvestment and external venture investments.</p><p>That cash discipline sits at the center of my thesis.</p><p>In a Damodaran framework, earnings are only useful if they can be converted into cash and distributed or reinvested intelligently.</p><p>Info Edge passes that test far better than many businesses trading on technology narratives.</p><div><hr></div><h2>The Second Engine: Capital Allocation</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4SYu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4SYu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!4SYu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!4SYu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!4SYu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4SYu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1728259,&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://blog.phagyul.ai/i/200706956?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.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_!4SYu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!4SYu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!4SYu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!4SYu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F234b5880-a671-48a7-9aa2-3f81038eea1d_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The other half of the story is where Info Edge becomes truly distinctive.</p><p>Management disclosed that total invested capital across its startup platform stood at roughly &#8377;4,000 crore, while the fair market value of those investments approached &#8377;37,000 crore.</p><p>Those are extraordinary numbers.</p><p>More importantly, they fundamentally change how I think about the balance sheet.</p><p>This is not idle treasury cash.</p><p>This is a portfolio that has already produced two listed winners and still carries meaningful optionality from the rest of the investment book.</p><p>The listed winners are the easiest to value.</p><p>Using June 2026 market values, Info Edge&#8217;s stakes in Eternal and PB Fintech together were worth approximately &#8377;39,500 crore.</p><p>That single number explains why this company must be valued in pieces.</p><p>If the market capitalization is roughly &#8377;65,000 crore and the two listed holdings alone are worth nearly &#8377;40,000 crore, then the market is implicitly assigning the remaining value to the core operating franchises plus the unlisted portfolio.</p><div><hr></div><h2>How I Split the Business</h2><p>Damodaran&#8217;s treatment of cash and cross-holdings provides the right starting point.</p><p>First, value the parent company&#8217;s operating assets.</p><p>Second, value the holdings separately.</p><p>Third, decide whether those holdings deserve to be added at full value or at a discount because of taxes, opacity, or governance considerations.</p><p>For Info Edge, I split the company into three buckets:</p><ul><li><p>The core operating business: Naukri, 99acres, Jeevansathi, Shiksha, and other controlled operating assets.</p></li><li><p>The listed investment book: Eternal and PB Fintech.</p></li><li><p>The private portfolio: the broader startup portfolio, valued through probability-weighted assumptions and appropriate haircuts.</p></li></ul><p>Once I do that, the valuation becomes much clearer.</p><p>I no longer have to force one multiple to explain two fundamentally different economic engines.</p><div><hr></div><h2>My Core-Business DCF</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Noi3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Noi3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Noi3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Noi3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Noi3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Noi3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1290281,&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://blog.phagyul.ai/i/200706956?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.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_!Noi3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Noi3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Noi3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Noi3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce65570-e5fa-42fc-8931-5213c48f06f3_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I built three versions of the core-business valuation.</p><p>The first was a conventional FCFF model.</p><p>The second was a stricter Damodaran-style build with a higher cost of capital and explicit return-on-capital fade.</p><p>The third was an owner-earnings model that treats Info Edge more like a high-ROIC platform business with low maintenance reinvestment requirements.</p><p>The conventional FCFF model produced an intrinsic value range of:</p><p>&#8377;805.83 to &#8377;1,173.05 based on Bear to Bull scenario</p><p>The stricter Damodaran build produced:</p><p>&#8377;624.07-&#8377;675.71-&#8377;722.74(Bear-Base-Bull)</p><p>The owner-earnings model produced:</p><p>Bear&#8377;856.76, Base&#8377;978.00, Bull&#8377;1,150.75</p><p>I do not treat any one of these as the truth.</p><p>I treat them as a range generated by different but intellectually honest stories about the business.</p><p><strong>That is very much in the spirit of Damodaran: valuation is a disciplined conversation between narrative and numbers, not a hunt for a fake precision point estimate.</strong></p><div><hr></div><h2>What the Three Models Are Really Saying</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!avW1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!avW1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!avW1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!avW1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!avW1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!avW1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.png" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1290071,&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://blog.phagyul.ai/i/200706956?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_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_!avW1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!avW1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!avW1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!avW1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26450a9e-e5a6-424d-9d5f-df0966ec01b5_1024x1536.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Taken together, these models say something simple.</p><p>Info Edge is not obviously cheap.</p><p>But it is also not wildly expensive if I believe the core operating franchise deserves a premium for moat, cash conversion, and capital allocation quality.</p><p>The overlap zone between my more realistic base cases falls roughly between &#8377;950 and &#8377;1,000 per share.</p><p>That sits remarkably close to where the market currently values the stock.</p><p>My conclusion is not that the stock is a bargain.</p><p>My conclusion is that the stock is trading around intrinsic value, with modest upside or downside depending on how optimistic I choose to be about the operating business and how much of the private investment book I am willing to recognize.</p><div><hr></div><h2>Why the Private Portfolio Cannot Be Ignored</h2><p>A lot of investors stop after marking Eternal and PB Fintech.</p><p>I think that is incomplete.</p><p>It is easy to value listed stakes and pretend the rest of the startup book is noise.</p><p>Management&#8217;s disclosures suggest otherwise.</p><p>At the same time, I do not want to value the private portfolio lazily.</p><p>For early-stage companies, the right framework resembles venture-capital valuation rather than traditional DCF analysis.</p><p>Estimate a plausible exit value.</p><p>Assign a probability of success.</p><p>Adjust for dilution.</p><p>Discount back at a sufficiently high required return.</p><p>That is why, in my own sum-of-the-parts framework, I do not add the startup portfolio at full value by default.</p><p>I use scenario-based weights and meaningful haircuts rather than assuming every fair-value mark will eventually translate into realized gains.</p><div><hr></div><h2>Promoter Skin, Moat, and Cash Discipline</h2><p>My three favourite lenses for evaluating businesses are:</p><ol><li><p>Moat</p></li><li><p>Promoter skin in the game</p></li><li><p>Free-cash-flow discipline</p></li></ol><p>Info Edge scores well on all three.</p><p>Promoter ownership remains meaningful at approximately 37.5%, with founder Sanjeev Bikhchandani individually holding about 24% of the company. This level of ownership creates strong alignment between management and minority shareholders, particularly in a business where long-term capital allocation is a major driver of value creation.</p><p>When founders continue to own a meaningful portion of the business after decades of operation, I generally have greater confidence that capital allocation decisions are being made with a long-term mindset.</p><p>On moat, the easiest evidence is visible in the economics of the core business.</p><p>A business generating EBIT margins north of 35%, producing strong free cash flow, and maintaining leadership in a category for years is rarely doing so by accident.</p><p>Those economics are often downstream manifestations of:</p><ul><li><p>Brand strength</p></li><li><p>Network effects</p></li><li><p>Embedded workflows</p></li><li><p>Customer inertia</p></li><li><p>Rational competition</p></li></ul><p>Naukri benefits from several of these simultaneously.</p><p>Employers want access to the largest candidate pool.</p><p>Candidates want access to the largest number of recruiters.</p><p>That creates a reinforcing flywheel that becomes increasingly difficult for competitors to replicate.</p><p>On cash-flow discipline, the story becomes even stronger.</p><p>The company has remained largely debt free while continuing to:</p><ul><li><p>Fund organic growth</p></li><li><p>Invest in adjacent businesses</p></li><li><p>Build a venture portfolio</p></li><li><p>Maintain balance-sheet flexibility</p></li></ul><p>That combination is surprisingly rare.</p><p>Many firms with venture portfolios lack a strong operating engine.</p><p>Many cash-generative firms struggle to identify high-return external investments.</p><p>Info Edge has demonstrated an ability to do both.</p><div><hr></div><h2>The Buy-Below Levels I Would Use</h2><p>Because the stock appears to be trading around fair value, I think price discipline matters more than enthusiasm.</p><p>Valuation should influence position sizing.</p><p>Quality tells me <em>what</em> to buy.</p><p>Valuation tells me <em>when</em> to buy.</p><p>My framework currently looks like this:</p><p>ZoneInterpretationBelow &#8377;850Strong Buy&#8377;850&#8211;&#8377;930Buy&#8377;930&#8211;&#8377;1,030Hold / WatchAbove &#8377;1,100Avoid aggressive additions</p><h3>Below &#8377;850</h3><p>At these levels, even relatively conservative valuation frameworks begin to show a meaningful margin of safety.</p><p>The investment case becomes less dependent on perfect execution and more dependent on simply avoiding major mistakes.</p><p>That is usually where I prefer to deploy capital.</p><h3>&#8377;850&#8211;&#8377;930</h3><p>The valuation starts tilting in my favor while still allowing room for execution risk.</p><p>The core franchise remains attractive and the optionality from investments is available at a more reasonable price.</p><h3>&#8377;930&#8211;&#8377;1,030</h3><p>This is approximately fair-value territory.</p><p>At these levels I would be comfortable holding existing positions but would not feel a strong urge to increase exposure.</p><h3>Above &#8377;1,100</h3><p>At these valuations, I would need a substantially more optimistic view regarding:</p><ul><li><p>Core business growth</p></li><li><p>Margin expansion</p></li><li><p>The next generation of startup winners</p></li><li><p>Long-term value creation from the investment portfolio</p></li></ul><p>Without that conviction, future returns become increasingly dependent on continued multiple expansion rather than fundamental value creation.</p><div><hr></div><h2>What Could Break My Thesis</h2><p>No valuation is complete without understanding what can go wrong.</p><p>There are four developments that would make me materially less constructive on Info Edge.</p><h3>1. Naukri Loses Pricing Power</h3><p>Naukri remains the economic anchor of the entire group.</p><p>If recruiters begin reducing spend, switching platforms, or finding better alternatives, the valuation of the entire business changes.</p><p>The investment portfolio may be exciting, but the operating franchise pays the bills.</p><p>A weakening recruitment moat would force me to revisit almost every assumption in my model.</p><h3>2. Adjacent Businesses Fail to Improve Economics</h3><p>The long-term narrative depends on businesses such as 99acres and other operating segments continuing to improve efficiency and monetization.</p><p>If these businesses fail to progress toward stronger economics, some of the optionality embedded in my valuation disappears.</p><p>The result would be lower growth assumptions and reduced confidence in margin expansion.</p><h3>3. Capital Allocation Discipline Deteriorates</h3><p>One of the biggest strengths of Info Edge has been its investment discipline.</p><p>Successful startup investors often face a dangerous temptation after early wins.</p><p>Past success can encourage larger bets, weaker underwriting standards, or excessive optimism.</p><p>If management begins prioritizing valuation marks over governance and business quality, I would immediately apply a larger discount to the investment portfolio.</p><p>The track record has earned credibility.</p><p>But credibility must continually be re-earned.</p><h3>4. A Prolonged Decline in Eternal or PB Fintech</h3><p>The market currently recognizes Info Edge not only as an operating company but also as a successful allocator of capital.</p><p>If Eternal and PB Fintech experience significant and prolonged declines, investors may stop assigning value to that allocator identity.</p><p>In that scenario, the market could increasingly focus only on the operating business while assigning lower value to the investment portfolio.</p><p>That would compress valuation multiples even if the underlying businesses remain fundamentally sound.</p><div><hr></div><h2>The Bigger Lesson</h2><p>One reason I enjoy studying Info Edge is that it demonstrates how valuation is often more about structure than forecasting.</p><p>Most investors spend their time debating whether revenue growth will be 12% or 15%.</p><p>In many situations, that is not where the real insight lies.</p><p>The real insight is understanding what exactly you are valuing.</p><p>Info Edge forces that discipline.</p><p>You cannot treat it as a simple internet stock.</p><p>You cannot treat it as a venture capital fund.</p><p>You cannot treat it as a holding company.</p><p>It is all three at the same time.</p><p>And that complexity creates both confusion and opportunity.</p><p>This is precisely the type of situation where Damodaran&#8217;s framework shines.</p><p>Separate the pieces.</p><p>Value each piece independently.</p><p>Then bring them back together.</p><p>Simple in principle.</p><p>Difficult in practice.</p><div><hr></div><h2>My Final Verdict</h2><p>When I put everything together, I keep arriving at the same conclusion.</p><p>Info Edge is a high-quality business with:</p><ul><li><p>A genuine moat</p></li><li><p>Meaningful promoter alignment</p></li><li><p>Strong free-cash-flow generation</p></li><li><p>Exceptional capital-allocation history</p></li><li><p>Significant optionality through its startup portfolio</p></li></ul><p>Those are characteristics I actively seek in long-term compounders.</p><p>However, quality alone does not make something cheap.</p><p>At roughly &#8377;1,010 per share, I believe the market already recognizes much of what makes Info Edge special.</p><blockquote><p>The Naukri franchise is appreciated.</p><p>The Eternal success story is appreciated.</p><p>The PB Fintech investment is appreciated.</p></blockquote><p><strong>A significant portion of the optionality is already reflected in the price.</strong></p><p>That leaves me with a conclusion that may sound less exciting but is probably more useful:</p><p><strong>Info Edge is not a deep-value opportunity today.</strong></p><p><strong>It is a high-quality business trading around intrinsic value.</strong></p><blockquote><p>Would I own it?</p></blockquote><p>Yes.</p><blockquote><p>Would I chase it aggressively?</p></blockquote><p>Probably not.</p><blockquote><p>Would I become significantly more interested if the market offered it closer to &#8377;850&#8211;&#8377;900?</p></blockquote><p>Absolutely.</p><p>If I were forced to summarize my view in a single sentence, it would be this:</p><blockquote><p><strong>Info Edge is one of the clearest examples in India of how Aswath Damodaran&#8217;s framework helps separate a great operating business from a great capital allocator living inside the same stock.</strong></p></blockquote><p>And that is precisely what makes it such a fascinating company to study.</p><div><hr></div><h3>Disclosure</h3><p>This article is intended solely for educational and research purposes and should not be construed as investment advice. The valuation frameworks, assumptions, and conclusions presented here reflect my personal analysis and may prove incorrect. Investors should conduct their own due diligence and consider their risk tolerance before making any investment decisions.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p><a href="https://aswathdamodaran.blogspot.com/2013/06/a-tangled-web-of-values-enterprise.html">https://aswathdamodaran.blogspot.com/2013/06/a-tangled-web-of-values-enterprise.html</a></p><div id="youtube2-R5vaEkbXgDs" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;R5vaEkbXgDs&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/R5vaEkbXgDs?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h1><strong>DISCLAIMER</strong></h1><blockquote><blockquote><p>The content published in this post is intended <strong>solely for educational and informational purposes</strong>. I am <strong>not registered with SEBI</strong> as an investment advisor, research analyst, broker, or financial influencer, and nothing in this post should be construed as investment advice, stock recommendations, or solicitation to buy, sell, or hold any securities.</p></blockquote><blockquote><p>This analysis is part of my <strong>personal learning journey in finance and valuation</strong>, heavily influenced by academic frameworks and publicly available material from <strong>Aswath Damodaran</strong>, particularly his work on <strong>Cash, crossholdings, and others.</strong><br><br>The post reflects my own interpretation and application of these concepts as a finance student and practitioner, and any errors or assumptions are entirely my own.</p></blockquote><blockquote><p>The valuation models, assumptions, scenarios, and conclusions presented here are <strong>illustrative learning exercises</strong>, not predictions. They do not account for individual financial circumstances, risk tolerance, tax considerations, or investment objectives.</p></blockquote><blockquote><p>Readers are strongly encouraged to perform <strong>independent due diligence</strong> and/or consult a <strong>SEBI-registered financial professional</strong> before making any investment decisions. I shall not be responsible for any financial losses or outcomes resulting from reliance on this content.</p></blockquote></blockquote><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Traditional Japan (Monochrome)]]></title><description><![CDATA[When I first arrived in Hokkaido, I was captivated by colour.]]></description><link>https://blog.phagyul.ai/p/traditional-japan-monochrome</link><guid isPermaLink="false">https://blog.phagyul.ai/p/traditional-japan-monochrome</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Mon, 01 Jun 2026 05:22:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GRC8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I first arrived in Hokkaido, I was captivated by colour.</p><p>The crimson crowns of cranes against fresh snow. The blue hues of winter mornings. The warm glow of sunrise spilling across frozen landscapes.</p><p>Naturally, those scenes became the foundation of C1 &#8212; <em>Vibrant Hokkaido</em>.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;319cdc4e-6162-4579-a7c5-4869eafc3965&quot;,&quot;caption&quot;:&quot;Several months before travelling to Hokkaido, I found myself doing something I had not originally planned.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Vibrant Hokkaido&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Phagyul AI Systems Pvt Ltd&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69779d00-e8d0-4783-8d18-6eefd0dd0a36_82x82.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-31T02:39:22.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!yFHV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.phagyul.ai/p/vibrant-hokkaido&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:199934487,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:7361555,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>But as the journey unfolded, I found myself increasingly drawn to something else.</p><p>Not colour.</p><p>Time.</p><p>The more I travelled through Hokkaido, the more I felt that many of its landscapes, traditions, and wildlife existed outside the rhythm of the modern world. A crane standing motionless in the snow, a sea eagle gliding across a winter valley, steam rising through an outdoor onsen&#8212;these scenes felt as though they could belong to today, fifty years ago, or perhaps even longer.</p><p>That feeling became the inspiration for C2.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GRC8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GRC8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!GRC8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!GRC8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!GRC8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GRC8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2603084,&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://blog.phagyul.ai/i/200075615?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.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_!GRC8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!GRC8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!GRC8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!GRC8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb628b9cc-1106-44b7-a65b-be5d13591569_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Why Monochrome?</h2><p>For me, monochrome was never about removing colour.</p><p>It was about removing time.</p><p>Colour often anchors a photograph to a specific moment. We recognise the palette of a season, the look of a particular era, or the visual characteristics of modern life.</p><p>Monochrome strips away those references.</p><p>What remains are the essential elements of a photograph:</p><ul><li><p>Light</p></li><li><p>Form</p></li><li><p>Texture</p></li><li><p>Atmosphere</p></li><li><p>Emotion</p></li></ul><p>More importantly, it allows a scene to feel timeless.</p><p>In Hokkaido, monochrome became the most natural way to express what I was experiencing. The enduring elegance of Japanese culture, the quiet beauty of winter landscapes, and the sense that many traditions continue largely unchanged despite the rapid pace of the world around them.</p><p>Rather than documenting Japan as it appeared before me, I wanted to create images that felt suspended between past and present.</p><div><hr></div><h2>Building C2</h2><p>The objective was not to create dramatic black-and-white photographs.</p><p>Instead, I wanted to create images that felt calm, restrained, and enduring.</p><p>The settings were designed to emphasize tonal separation rather than contrast alone. Snow remained soft and luminous. Shadows retained detail. Blacks provided structure without overwhelming the frame.</p><p>The result was a visual language inspired less by spectacle and more by permanence.</p><p>A crane became a silhouette against endless snow.</p><p>An eagle became a dark brushstroke against mountain ridges.</p><p>Steam transformed a crowded onsen into something almost dreamlike.</p><p>The photographs began to feel less like records of a journey and more like fragments of memory.</p><div><hr></div><h2>What I Found</h2><p>The most unexpected outcome was how much attention shifted from the subject to the feeling of the scene.</p><p>Without colour competing for attention, subtle details became more important:</p><p>The curve of a crane&#8217;s neck.</p><p>The delicate footprints pressed into fresh snow.</p><p>The layers of mist drifting through an onsen.</p><p>The patterns of winter forests beneath a soaring eagle.</p><p>Many photographs became simpler, yet somehow more evocative.</p><p>The absence of colour encouraged me to focus on what initially drew me to the frame rather than what made it visually striking.</p><div><hr></div><h2>The Images</h2><p>The red-crowned cranes became symbols of grace rather than colour.</p><p>Against the snow, they appeared almost sculptural&#8212;reduced to elegant lines, shapes, and movement.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IloJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IloJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IloJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IloJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IloJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IloJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg" width="1281" height="1920" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1920,&quot;width&quot;:1281,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:158529,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/200075615?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.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_!IloJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IloJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IloJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IloJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3e1b52-f26a-48c8-93b5-ba8c1668ad97_1281x1920.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The sea eagle soaring across Hokkaido&#8217;s mountains felt timeless, its silhouette echoing the rugged landscape beneath it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-Ate!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Ate!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-Ate!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-Ate!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-Ate!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Ate!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:711627,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/200075615?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.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_!-Ate!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-Ate!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-Ate!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-Ate!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F384411bd-d294-4ece-baa0-c64a76408e0e_1920x1281.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The onsen scene revealed a different side of Japan. Visitors gathered quietly in rising steam while nature enveloped the entire experience, blurring the distinction between people and place.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JIyH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JIyH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JIyH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JIyH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JIyH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JIyH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg" width="1281" height="1920" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1920,&quot;width&quot;:1281,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:416314,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/200075615?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.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_!JIyH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JIyH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JIyH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JIyH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d7f60c3-03f6-4aa9-b7d8-631c9587ee34_1281x1920.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Even moments of intentional blur and abstraction began to feel more meaningful in monochrome, emphasizing atmosphere over description.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V7M6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V7M6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg 424w, https://substackcdn.com/image/fetch/$s_!V7M6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg 848w, https://substackcdn.com/image/fetch/$s_!V7M6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!V7M6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V7M6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg" width="1920" height="1016" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1016,&quot;width&quot;:1920,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45630,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/200075615?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab7f6809-ed11-4501-9062-78c5667c7b5f_1920x1280.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_!V7M6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg 424w, https://substackcdn.com/image/fetch/$s_!V7M6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg 848w, https://substackcdn.com/image/fetch/$s_!V7M6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!V7M6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49782b78-6f32-44dd-90cc-a1980b9f1874_1920x1016.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Each image seemed less concerned with documenting what was there and more interested in conveying what it felt like to stand there.</p><div><hr></div><h2>What C2 Taught Me</h2><p>Photography often encourages us to capture moments.</p><p>Monochrome encouraged me to capture permanence.</p><p>It reminded me that some places possess a character that transcends a single season, a single journey, or even a single generation.</p><p>Hokkaido&#8217;s wildlife, landscapes, and traditions carry that quality.</p><p>By removing colour, I wasn&#8217;t simplifying the story.</p><p>I was revealing the part of it that felt enduring.</p><div><hr></div><p><strong>C2 &#8212; Traditional Japan (Monochrome)</strong> is my attempt to explore the timeless side of Hokkaido&#8212;a visual journey through landscapes, wildlife, and traditions that feel as relevant today as they might have decades ago, expressed through a monochrome palette that celebrates simplicity, atmosphere, and the enduring beauty of Japan.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Vibrant Hokkaido]]></title><description><![CDATA[Several months before travelling to Hokkaido, I found myself doing something I had not originally planned.]]></description><link>https://blog.phagyul.ai/p/vibrant-hokkaido</link><guid isPermaLink="false">https://blog.phagyul.ai/p/vibrant-hokkaido</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Sun, 31 May 2026 02:39:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yFHV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Several months before travelling to Hokkaido, I found myself doing something I had not originally planned.</p><p>I wasn&#8217;t researching locations.</p><p>I wasn&#8217;t building shot lists.</p><p>I wasn&#8217;t even looking at wildlife photography.</p><p>Instead, I was revisiting old Japanese films and spending far too much time pausing anime scenes.</p><p>As someone who grew up watching anime, I had always been fascinated by how Japanese artists treated landscapes. Snow felt different. Forests felt different. Even ordinary roads seemed to carry a sense of atmosphere that was difficult to describe but immediately recognizable.</p><p>The colours were often richer than reality, yet never felt artificial.</p><p>The landscapes felt vibrant, but never loud.</p><p>Somewhere between memory and observation, a distinct visual language emerged.</p><p>Without realizing it, I had already started naming it in my head.</p><p><strong>Vibrant Hokkaido.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yFHV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yFHV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yFHV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yFHV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yFHV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yFHV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2722916,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/199934487?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!yFHV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yFHV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yFHV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yFHV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0427a49-7fc7-4368-a6d1-4513021ddccf_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>At the time, I thought it was a colour problem.</p><p>By the end of the trip, I realized it was a luminance problem.</p><p>And that distinction changed everything.</p><h2>Designing Hokkaido Before Seeing Hokkaido</h2><p>Long before boarding a flight to Japan, I started building two custom shooting profiles on my Canon EOS R5 Mark II.</p><p>The first became <strong>C1: Vibrant Hokkaido</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Lu7J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Lu7J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Lu7J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Lu7J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Lu7J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Lu7J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2031280,&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://blog.phagyul.ai/i/199934487?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.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_!Lu7J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Lu7J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Lu7J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Lu7J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb0d2304-c8f7-41dc-9e98-d240ba503364_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The second became <strong>C2: Traditional Japan</strong>.</p><p>The intention behind C1 was relatively straightforward. I wanted a profile that embraced the visual qualities I associated with modern Japanese landscape art and anime backgrounds&#8212;strong colour separation, rich blues, warm wildlife subjects and an overall sense of atmosphere.</p><p>The foundation was Canon&#8217;s Landscape Picture Style, but pushed further through additional contrast, saturation and colour tuning.</p><div class="pullquote"><p>The goal wasn&#8217;t realism.</p><p><strong>The goal was emotional realism.</strong></p></div><p>I wasn&#8217;t trying to reproduce exactly what I saw.</p><p>I was trying to reproduce what Hokkaido felt like in my imagination after years of consuming Japanese visual culture.</p><p>C2 was built for a completely different reason and deserves its own article, but in short, it was inspired by older Japanese cinema, monochrome photography and traditional aesthetics where form, shape and negative space matter more than colour.</p><p>At the time, both profiles felt complete.</p><p>I thought I had already solved the problem.</p><p>Hokkaido had other plans.</p><h2>The Surprise Waiting in the Snow</h2><p>One of the assumptions I carried into the trip was that colour would be the defining characteristic of the landscape.</p><p>After all, C1 was built around colour.</p><p>Yet once I started photographing winter scenes, I noticed something unexpected.</p><p>The strongest images weren&#8217;t necessarily the most colourful ones.</p><p>In fact, many of them contained remarkably little colour.</p><p>The fox crossing an icy road became one of those moments.</p><p>Initially, what attracted me to the scene was obvious.</p><p>A warm-toned fox against a cold blue landscape.</p><p>Classic colour contrast.</p><p>The kind of scene that fits perfectly within the original idea of Vibrant Hokkaido.</p><p>But as I reviewed the images later, I found myself paying less attention to the fox and more attention to the snow.</p><p>The snow wasn&#8217;t acting as background.</p><p>It was acting as structure.</p><p>The wind patterns across the frozen surface were creating visual pathways.</p><p>The lighter areas pulled the eye forward.</p><p>The darker areas acted as leading lines.</p><p>The fox wasn&#8217;t creating the composition.</p><p>The snow already had.</p><p>The fox was simply completing it.</p><p>That realization became one of the most important lessons of the trip.</p><h2>Snow Isn&#8217;t White</h2><p>Photographers often talk about exposing snow correctly.</p><p>What I discovered in Hokkaido was slightly different.</p><p>The challenge wasn&#8217;t exposure.</p><p>The challenge was preserving luminance relationships.</p><p>When we think about snow, we instinctively think about whiteness.</p><p>But Hokkaido snow rarely appears truly white.</p><p>It contains subtle blues.</p><p>Grey tones.</p><p>Cyan shifts.</p><p>Tiny variations that create depth and dimension.</p><p>Push everything toward pure white and the landscape becomes flatter.</p><p>Neutralize the colour too aggressively and winter loses its atmosphere.</p><p>The more I photographed, the more I realized that the visual identity of Hokkaido wasn&#8217;t being created by colour alone.</p><p>It was being created by the way snow carries light.</p><p>That became the foundation of what I eventually started calling <strong>Snow Luminance Control</strong>.</p><p>Not as a formal technique.</p><p>Not as a preset.</p><p>Simply as a way of seeing.</p><p>The objective became preserving those tonal transitions so that the snow itself could guide the viewer through the frame.</p><p>The fox remained important.</p><p>But the snow became the protagonist.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AwyP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AwyP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AwyP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AwyP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AwyP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AwyP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/abb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1613127,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/199934487?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.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_!AwyP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AwyP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AwyP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AwyP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb68a72-1201-4e6f-ab18-ddea3c86791f_1920x1281.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>The Lightroom Problem</h2><p>Ironically, the next lesson arrived after I returned from the field.</p><p>Opening the RAW files inside Lightroom was a shock.</p><p>The images didn&#8217;t look anything like what I had seen on the back of the camera.</p><p>The carefully tuned colours from C1 seemed to disappear.</p><p>The atmosphere felt different.</p><p>The tonal relationships felt different.</p><p>For a while, I assumed the profile simply wasn&#8217;t working as intended.</p><p>That confusion continued until a conversation with Rahul Sachdev.</p><p>Rahul, a Canon Ambassador and someone whose field experience I deeply respect, pointed me toward something surprisingly simple.</p><p><strong>Match Camera.</strong></p><p>Once Lightroom and Photoshop were instructed to honour the in-camera rendering through Canon&#8217;s camera-matching profiles, the images immediately started resembling what I had designed and seen in the field.</p><p>It was one of those moments that seems obvious in hindsight.</p><p>I had spent months creating a visual language inside the camera, only to discover that my software workflow was quietly replacing it.</p><p>That lesson alone probably saved me countless hours of unnecessary editing.</p><div><hr></div><h2>The Limitations of Custom Modes</h2><p>As useful as the C1 and C2 workflow became, the trip also exposed some practical limitations.</p><p>One of the biggest frustrations involved crop settings.</p><p>Certain shooting configurations&#8212;particularly 1.6x crop workflows that proved useful for wildlife&#8212;did not always behave the way I expected once stored inside the custom modes.</p><p>Moving between C1, C2 and C3 often required additional verification to ensure the camera was actually operating the way I intended.</p><p>It wasn&#8217;t a deal-breaker.</p><p>But it was a reminder that custom modes are powerful shortcuts rather than perfect state-management systems.</p><p>The creative intent remains consistent.</p><p>The technical details still need supervision.</p><h2>Looking Back</h2><p>What started as an attempt to recreate a visual style inspired by anime eventually became something far more interesting.</p><p>I arrived in Hokkaido thinking about colour.</p><p>I left thinking about luminance.</p><p>The preset I designed before the trip survived.</p><p>But the reasoning behind it evolved.</p><p>Vibrant Hokkaido was never really about making colours stronger.</p><p>It was about allowing winter to remain expressive.</p><p>About preserving the subtle pathways hidden inside snow.</p><p>About understanding that a landscape can lead the eye long before a wildlife subject enters the frame.</p><p>The fox helped me recognize that.</p><p>The snow taught me why.</p><p>In the next post, I&#8217;ll explore the other half of this experiment&#8212;<strong>C2: Traditional Japan</strong>&#8212;a profile inspired not by modern anime aesthetics, but by older Japanese cinema, monochrome photography and the idea that sometimes removing colour reveals more than adding it ever could.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Silence in Three Movements]]></title><description><![CDATA[I headed to Hokkaido, Japan, in February 2026 with two visual themes already shaping the journey in my mind: Vibrant Hokkaido and Traditional Japan. (post upcomingon Traditional Japan)]]></description><link>https://blog.phagyul.ai/p/silence-in-three-movements</link><guid isPermaLink="false">https://blog.phagyul.ai/p/silence-in-three-movements</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Fri, 29 May 2026 05:29:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vDQY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I headed to Hokkaido, Japan, in February 2026 with two visual themes already shaping the journey in my mind: <em>Vibrant Hokkaido</em> and <em>Traditional Japan</em>. (post upcomingon Traditional Japan)</p><p>I was drawn to the contrast between Hokkaido&#8217;s vivid winter character &#8212; cranes, foxes, snowfields, isolated color, landscapes &#8212; and the quieter monochromatic side of Japan that emerges through mist, overcast skies, bare forests, and restrained tonal palettes.</p><p>What I did not anticipate was discovering an entirely different visual phenomenon altogether: what I now think of as <em>layered winter landscapes</em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vDQY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vDQY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png 424w, https://substackcdn.com/image/fetch/$s_!vDQY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png 848w, https://substackcdn.com/image/fetch/$s_!vDQY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!vDQY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vDQY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2652741,&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://blog.phagyul.ai/i/199695112?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.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_!vDQY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png 424w, https://substackcdn.com/image/fetch/$s_!vDQY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png 848w, https://substackcdn.com/image/fetch/$s_!vDQY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!vDQY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F950ff4b1-5138-4652-91d6-e864e88bdf34_1535x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Somewhere during the trip, while photographing frozen wetlands and distant forests through a telephoto lens, I began noticing that the landscape no longer behaved as a single continuous scene. Instead, it appeared to separate itself into distinct visual planes &#8212; snowfields, reed belts, dense trunks, atmospheric canopy &#8212; each carrying its own tonal identity.</p><p>The effect was subtle in reality but became remarkably pronounced through the viewfinder.</p><p>That discovery was unexpected.</p><p>I had travelled searching for color and monochrome as emotional themes, but Hokkaido quietly revealed a third visual language to me &#8212; one built not around color, but around compression, atmosphere, tonal separation, and layered perception.</p><p>The more time I spent with these scenes, the more they began feeling less like traditional wildlife photographs and more like studies in visual structure.</p><div class="pullquote"><p>The snowfields simplified the foreground into negative space.<br>The narrow reed belts became transitional bands of muted color.<br>The forests compressed into repeating vertical rhythm.<br>The distant canopy dissolved softly into atmosphere.</p></div><p>What fascinated me most was that this separation only became obvious through the camera itself.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X_Tl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X_Tl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg 424w, https://substackcdn.com/image/fetch/$s_!X_Tl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg 848w, https://substackcdn.com/image/fetch/$s_!X_Tl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!X_Tl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X_Tl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg" width="1281" height="1920" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1920,&quot;width&quot;:1281,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:926077,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/199695112?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.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_!X_Tl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg 424w, https://substackcdn.com/image/fetch/$s_!X_Tl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg 848w, https://substackcdn.com/image/fetch/$s_!X_Tl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!X_Tl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9a43e9-b6e6-430f-98bf-613a3d006261_1281x1920.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Standing in the landscape, I did not experience the scene as strongly layered in this way. But once framed through a long lens, the environment transformed. The world flattened, distance compressed, and the landscape started behaving almost like a composed arrangement rather than a naturally receding space.</p><p>It was as though the camera was not only recording the landscape &#8212; but reorganizing it.</p><div><hr></div><h2>Understanding the Layers</h2><p>The more I photographed these scenes, the more I realized that several visual ideas were quietly working together inside the frame.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cu2X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cu2X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cu2X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cu2X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cu2X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cu2X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg" width="1281" height="1920" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1920,&quot;width&quot;:1281,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:727885,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/199695112?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.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_!cu2X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cu2X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cu2X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cu2X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f34e748-718d-4cfd-9fef-459cc15bb4c9_1281x1920.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Telephoto compression</strong> was one of them. Long focal lengths visually compress distance, making separate parts of the landscape appear stacked closer together. Instead of feeling deep and continuous, the world begins separating into flatter layers.</p><p>There was also an element of <strong>Gestalt perception</strong> at play. Human vision naturally groups similar tones, textures, and patterns together. Snowfields, reed belts, forests, and mist each become their own visual regions, which is why a single photograph can sometimes feel like multiple images stacked together.</p><p>And finally, there is <strong>visual rhythm</strong> &#8212; the repetition of trunks, rocks, reeds, and negative space across the frame. Winter simplifies the landscape enough for these repeating forms to become more noticeable, almost musical in their spacing and flow.</p><p>Individually, these ideas are subtle. But together, they create the layered winter landscapes I unexpectedly found myself drawn toward in Hokkaido.</p><div><hr></div><h2>Searching for a Visual Parallel</h2><p>Interestingly, none of this was intentional.</p><p>I did not travel to Hokkaido inspired by any particular art movement or visual tradition. The connection appeared only later, after returning from the trip and trying to understand why these images felt so visually separated and structured.</p><p>That curiosity eventually led me toward ukiyo-e.</p><p>While researching whether similar spatial phenomena had existed in historical art, I found myself repeatedly drawn to Japanese landscape prints &#8212; particularly the quieter atmospheric works of Utagawa Hiroshige.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U14M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U14M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!U14M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!U14M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!U14M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U14M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2685635,&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://blog.phagyul.ai/i/199695112?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.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_!U14M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!U14M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!U14M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!U14M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129a9a22-e1a8-472b-9bb2-358c558d554f_1774x887.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>What resonated was not necessarily the subject matter, but the way space behaved within those images.</p><p>Many ukiyo-e landscapes organize the frame through layers and intervals rather than strong linear depth. Snow, water, mist, forests, and sky often exist as separate visual regions while still remaining part of a unified composition. The eye drifts across the scene rather than moving directly into it.</p><p>That sensation felt remarkably close to what I had been experiencing through the viewfinder in Hokkaido.</p><p>The similarity was especially striking in winter-oriented prints where forests compress into texture, snow becomes open negative space, and atmosphere quietly separates one plane from another.</p><p>What fascinated me was that photography and ukiyo-e arrive at this layered perception through entirely different means.</p><p>Ukiyo-e achieved it through artistic interpretation and compositional stylization.</p><p>The photographs achieve it through:</p><ul><li><p>optical compression,</p></li><li><p>atmospheric flattening,</p></li><li><p>tonal simplification,</p></li><li><p>and perceptual grouping.</p></li></ul><p>The overlap, therefore, is not imitation.</p><p>It is convergence.</p><p>Different mediums.<br>Different centuries.<br>Yet arriving at a strangely similar way of organizing space.</p><p>That realization changed how I began thinking about these images. I stopped seeing them purely as wildlife or winter photographs and started viewing them as studies in perception &#8212; moments where optics quietly transform reality into layered abstraction.</p><div><hr></div><h2>Winter as an Abstraction Engine</h2><p>I suspect winter may be uniquely suited for this kind of visual experience.</p><p>Snow removes clutter.</p><blockquote><p>Color palettes collapse into restraint.<br>Foreground distractions disappear.<br>Shadows soften beneath overcast skies.<br>The world simplifies itself into line, tone, rhythm, and silence.</p></blockquote><p>Under those conditions, landscapes stop behaving purely as physical environments and begin functioning almost like visual structures.</p><p>The camera intensifies this transformation further.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pG-p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pG-p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pG-p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pG-p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pG-p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pG-p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1100472,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/199695112?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.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_!pG-p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pG-p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pG-p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pG-p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cebb95-2eaa-45ed-ab4a-99fba71d8458_1920x1281.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The moment the frame edges isolate the scene, the eye stops navigating physical space and instead begins reading intervals:<br>foreground,<br>transition,<br>structure,<br>atmosphere.</p><p>That was the most unexpected lesson Hokkaido offered me.</p><p>I arrived searching for vibrant winter and monochrome quietness.<br>I left discovering layered perception.</p><div><hr></div><h2>Looking Ahead</h2><p>What began as a winter wildlife trip has quietly reshaped how I now look at landscapes.</p><p>I am increasingly interested in searching for places where this phenomenon might emerge again &#8212; environments where atmosphere, distance, weather, and optics work together to create layered spatial separation.</p><p>Not necessarily dramatic landscapes.<br>Not necessarily famous locations.</p><p>Just places where the world simplifies enough for its internal structure to reveal itself.</p><div class="pullquote"><p><strong>Hokkaido happened to offer those conditions naturally:</strong><br>snow, mist, telephoto distance, muted tonality, and silence.</p><p>But I suspect this visual language exists elsewhere too, waiting quietly in landscapes that reward slower observation.</p></div><p>Perhaps that is what photography continues to teach me most:<br>sometimes the camera does not merely document a place.</p><p>Sometimes it changes the way we perceive space itself.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[The ARM Wheel Problem: What's Actually Standing Between You and Graviton's 34% Cost Savings ]]></title><description><![CDATA[AWS will tell you Graviton Lambda delivers up to 34% better price-performance over x86.]]></description><link>https://blog.phagyul.ai/p/the-arm-wheel-problem-whats-actually</link><guid isPermaLink="false">https://blog.phagyul.ai/p/the-arm-wheel-problem-whats-actually</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Wed, 27 May 2026 05:12:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PPpf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AWS will tell you Graviton Lambda delivers up to <strong>34% better price-performance</strong> over x86. That number is not wrong. But it also is not the number that matters when you are trying to migrate a real system.</p><p>The number that matters is this one: <strong>how many of your Lambda functions can actually run on ARM64 today</strong> &#8212; not in theory, not on a clean greenfield stack, but with your actual dependencies, your actual Python version, and your actual C extensions.</p><p>For Parjanya, an ML-powered image quality pipeline, the answer started at 1 out of 4. That gap &#8212; between what Graviton promises and what your stack allows &#8212; is almost entirely explained by a single, under appreciated concept: the <strong>ARM wheel</strong>.</p><p>This article explains what ARM wheels are, why they are the gatekeeper to Graviton savings, how the Parjanya re-architecture navigated them, and how to build a framework for evaluating Graviton readiness in any product.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PPpf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PPpf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!PPpf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!PPpf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!PPpf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PPpf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1342571,&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://blog.phagyul.ai/i/199420348?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.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_!PPpf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!PPpf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!PPpf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!PPpf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec36df4-b62e-4000-a45e-a906ab92a62c_1774x887.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>First, an Honest Framing of the 34% Number</h2><p>AWS&#8217;s stated price-performance advantage for Graviton Lambda comes from two compounding factors:</p><p><strong>Pricing</strong>: ARM64 Lambda is priced approximately <strong>20% lower</strong> per GB-second than equivalent x86 Lambda. This is a direct line-item discount.</p><p><strong>Performance</strong>: For SIMD-heavy workloads &#8212; image processing, compression, media encoding &#8212; ARM NEON instruction sets often complete work faster than x86 AVX-512 for the same memory allocation, which effectively reduces billed duration.</p><p>In Parjanya&#8217;s $10 POC (running PIL-based image processing against Graviton4 and Intel x86), the empirical result was a <strong>24% cost delta</strong> &#8212; Intel x86 cost 24% more for identical or worse performance. AWS&#8217;s 34% claim holds at the higher end because it accounts for the full price-performance package including EC2 and container workloads.</p><p>The savings are real. The caveat is that they only materialise if your software stack is compatible.</p><div class="pullquote"><p><strong>And this is almost entirely an AWS-specific story.</strong> Other cloud providers have ARM compute (Azure&#8217;s Ampere A1, GCP&#8217;s Tau T2A), but the degree of ecosystem investment &#8212; SDK support, Lambda ARM64 availability, Graviton-specific tuning, managed service integration &#8212; is significantly deeper on AWS. If you are evaluating Graviton for cost optimisation, that analysis does not port cleanly to other clouds without re-running the entire readiness assessment from scratch.</p></div><h2>What Is an ARM Wheel?</h2><p>Before evaluating Graviton readiness, you need to understand what a Python wheel is and why the ARM variant specifically matters.</p><p>A <strong>wheel</strong> (<code>.whl</code>) is a pre-built binary distribution of a Python package. When you run <code>pip install numpy</code>, pip looks for a wheel that matches your platform. If it finds one, it downloads and installs it directly &#8212; no compilation required. If it does not, pip falls back to downloading source code and compiling it locally.</p><p>For pure Python packages, this distinction is irrelevant. The bytecode runs anywhere.</p><p>For packages with native C/C++ extensions &#8212; NumPy, Pillow, OpenCV, PyTorch, SciPy, and most of the ML ecosystem &#8212; a wheel is architecture-specific. A wheel built for <code>x86_64</code> will not install on <code>aarch64</code>. The package must publish a separate wheel for ARM64.</p><p>The naming convention tells you exactly what architecture a wheel targets:</p><pre><code>numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl   # x86
numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl  # ARM64</code></pre><p>The <code>aarch64</code> suffix is what you are looking for. If it exists, installation is clean. If it does not, you are in source-build territory &#8212; and source builds in Lambda container images introduce a layer of complexity that breaks most &#8220;just change the architecture flag&#8221; migration plans.</p><h3>The Four States of a Dependency</h3><p>When evaluating a Python service for ARM64 migration, every dependency falls into one of four categories:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lsKp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lsKp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!lsKp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!lsKp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!lsKp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lsKp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1400983,&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://blog.phagyul.ai/i/199420348?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.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_!lsKp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!lsKp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!lsKp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!lsKp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bc4146e-39da-4be6-badd-4be1992127e9_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This matrix is the actual output of a Graviton readiness assessment. Not a benchmark. Not a cost model. The wheel matrix.</p><div><hr></div><h2>The Parjanya Case Study: From 1/4 to 3/4</h2><p>Parjanya&#8217;s pipeline had four compute stages, each containerised and isolated. When the first Graviton migration attempt was made, only one &#8212; the deduplication stage &#8212; made it onto ARM64. The other three were blocked.</p><p>Here is what happened at each stage:</p><h3>Stage 1: RAW Processing (Blocked &#8594; Eventually Bypassed)</h3><p>Camera RAW files require binary parsing to extract embedded JPEGs. The dependency chain pulled in native image parsers without clean <code>aarch64</code> wheels. Compilation from source failed or produced unstable binaries in the Lambda container environment.</p><p><strong>Resolution</strong>: The stage architecture changed. Rather than fight a fragile native dependency chain, the pipeline design shifted to extract JPEG previews at ingest &#8212; earlier in the flow &#8212; reducing the surface area where native RAW parsing was required.</p><h3>Stage 2: CLIP-IQA Scoring (Blocked &#8594; Replaced)</h3><p><strong>CLIP-IQA</strong> was being used for visual quality scoring. It had two problems:</p><ol><li><p><strong>Wheel problem</strong>: The ARM64 wheel chain for its dependencies was incomplete. Installing it in a Graviton Lambda container was unreliable.</p></li><li><p><strong>Model problem</strong>: CLIP-IQA was trained on stock photos, not professional RAW captures. It accepted only ~1% of professional images, making it useless for the actual curation use case.</p></li></ol><blockquote><p><strong>Resolution: </strong><em>The entire stage was replaced with a rule-based technical validator &#8212; exposure clipping detection, blur scoring, sharpness scoring, and perceptual hashing. No ML forward pass. No compiled extensions in the hot path. The new validator ran in pure Python, deployed cleanly on ARM64, and executed in under 100ms per image.</em></p></blockquote><p>This is the single most important insight from the Parjanya migration:</p><blockquote><p><strong>The fastest path to ARM64 is sometimes not to migrate the workload. It is to replace the workload.</strong></p></blockquote><p>The new <code>parjanya-technical_validator</code> runs on <code>arm64</code> with Python 3.12 and 512 MB memory. It is not a compromise &#8212; it is measurably better: faster, cheaper, more correct, and production-verified.</p><h3>Stage 3: GPU Inference (Intentional Hard Boundary)</h3><p>The VLM inference stage runs <code>Qwen3-VL-8B-Instruct</code> and requires CUDA. CUDA is the hard architectural boundary.</p><p>CUDA is NVIDIA&#8217;s parallel computing platform. It runs on NVIDIA GPUs, which are paired with x86_64 hosts in most production setups including AWS g5 instances. There is no ARM64 CUDA story in Lambda.</p><p><strong>Resolution</strong>: The GPU inference stage was <strong>not</strong> migrated. Instead, the control plane was separated from execution:</p><ul><li><p>A lightweight Lambda &#8212; ARM64 &#8212; handles scheduling logic: when to scale the GPU fleet, when to drain it</p></li><li><p>The actual VLM inference runs on EC2 g5 instances in an Auto Scaling Group</p></li><li><p>The Lambda no longer needs ML libraries, so it migrated to Graviton without any dependency issues</p></li></ul><p>This is architectural isolation &#8212; moving the ARM64-compatible logic (scheduling, orchestration) onto Graviton and leaving the ARM64-incompatible logic (GPU inference) exactly where it belongs.</p><h3>Stage 4: Deduplication (Original Success)</h3><p>Small, CPU-bound, dependency-light. Perceptual hashing with no native C extensions in the hot path. This was the function that migrated cleanly from day one, and it remains the model for what &#8220;Graviton-ready&#8221; looks like: pure logic, minimal native dependencies, well-supported Python ecosystem.</p><h3>The Current State</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RVAv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RVAv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!RVAv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!RVAv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!RVAv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RVAv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1268097,&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://blog.phagyul.ai/i/199420348?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.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_!RVAv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!RVAv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!RVAv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!RVAv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b92b44-d06a-4a1a-8f60-a12892b3c4fb_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Three of four Lambda functions on Graviton (+1 scheduler). The remaining x86 workload is the one that genuinely belongs there.</p><div><hr></div><h2>Why ARM Wheels Fail: The Root Causes</h2><p>Understanding why a package lacks an ARM64 wheel helps you predict and resolve failures faster.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tAxd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tAxd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!tAxd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!tAxd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!tAxd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tAxd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1108106,&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://blog.phagyul.ai/i/199420348?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tAxd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!tAxd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!tAxd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!tAxd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F026f3ec8-c1ad-46be-ac11-db38ad8c53af_1672x941.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>1. The package maintainer hasn&#8217;t built it yet</h3><p>Many packages added <code>aarch64</code> wheel support in 2022&#8211;2024 as AWS Graviton gained adoption. Packages that haven&#8217;t been updated since then may still not publish ARM64 wheels. This is solvable by checking the current release on PyPI &#8212; support often appears in later versions.</p><h3>2. GLIBC version mismatch</h3><p>Lambda&#8217;s ARM64 runtime uses Amazon Linux 2023. A wheel built against an older GLIBC version (<code>manylinux2014</code>) may not install cleanly in that environment. When you see installation errors that reference GLIBC, this is the cause. The fix is to build your container image from the correct ARM64 base image and verify wheel compatibility inside it &#8212; not on your development machine.</p><h3>3. Transitive dependencies break the chain</h3><p>Even if the top-level package publishes an ARM64 wheel, its transitive dependencies may not. OpenCV is a canonical example: <code>opencv-python</code> may install, but a transitive dependency on a specific image codec library may not have an ARM64 wheel. The failure surface is the entire dependency tree, not just the packages you explicitly listed.</p><h3>4. ABI incompatibility</h3><p>Some packages have version-specific ABI contracts. A package pinned to an older version may have published an x86_64 wheel for that version but not an ARM64 one. When you pin for stability and the pinned version predates ARM64 support, you are stuck &#8212; until you unpin.</p><h3>5. Build-time assumptions in C extensions</h3><p>Some C extensions were written with x86 assumptions baked into SIMD code paths, memory alignment behaviour, or endianness handling. These may compile on ARM64 but behave incorrectly at runtime. This is rare but dangerous &#8212; it is the category where correctness testing matters most.</p><div><hr></div><h2>A Practical Evaluation Framework for Any Product</h2><p>The following process translates the Parjanya experience into a repeatable assessment for any Lambda-based system.</p><h3>Phase 1: Dependency Audit (Before Touching Infrastructure)</h3><p>For every Lambda or containerised service, generate the full dependency tree including transitive dependencies:</p><pre><code>pip install pipdeptree
pipdeptree --warn silence</code></pre><p>Then, for every package with a native C extension (you can identify these by checking if the installed package contains <code>.so</code> files):</p><pre><code>find /path/to/site-packages -name "*.so" | sort</code></pre><p>Classify each package against the four-state matrix above. The output is your wheel matrix &#8212; one row per native dependency, one column per state.</p><h3>Phase 2: Build Environment Test (Before Assuming Local Results)</h3><p>Do not test ARM64 compatibility on your development machine. Build inside an ARM64 environment:</p><pre><code># Docker on an Apple Silicon Mac or a Graviton EC2 instance
docker build --platform linux/arm64 -f Dockerfile.arm64 .</code></pre><p>The Lambda execution environment is Amazon Linux 2023 on <code>aarch64</code>. Your build environment should match this exactly. A dependency that installs cleanly in a generic ARM64 Docker image may still fail in the Lambda runtime &#8212; validate inside the correct base image.</p><h3>Phase 3: Runtime Validation (Beyond Installation)</h3><p>Successful installation is not the same as correct runtime behaviour. For packages that made it through the build:</p><ul><li><p>Run your actual workload, not a smoke test</p></li><li><p>Measure latency and memory usage under ARM64 &#8212; they may differ from x86 even when the package installs cleanly</p></li><li><p>For any package in the &#8220;source build required&#8221; category, verify that the compiled binary links against the correct system libraries at runtime</p></li></ul><h3>Phase 4: The Three-Question Decision Gate</h3><p>For each service in your stack, answer these three questions:</p><ol><li><p><strong>Does every native dependency have an ARM64 wheel for my Python version and target runtime?</strong></p><ul><li><p>If yes: proceed to migration</p></li><li><p>If no: go to question 2</p></li></ul></li><li><p><strong>Can I build from source reliably in CI, in the correct ARM64 environment, with the correct GLIBC version?</strong></p><ul><li><p>If yes: proceed with source-build path; add a CI gate that fails if compilation regresses</p></li><li><p>If no: go to question 3</p></li></ul></li><li><p><strong>Can I replace the dependency or the entire stage with something ARM64-compatible?</strong></p><ul><li><p>If yes: replace it &#8212; this is often the better outcome anyway</p></li><li><p>If no: this stage stays on x86; isolate it intentionally rather than blocking the rest of the migration</p></li></ul></li></ol><p>This decision tree is what the Parjanya migration followed, even if it was not formalised until the second iteration.</p><h3>Phase 5: Architectural Boundary Declaration</h3><p>For every stage that cannot move to ARM64, declare the boundary explicitly in your architecture documentation:</p><ul><li><p>What is the technical reason it stays on x86 (CUDA dependency, missing wheel, untested behaviour)?</p></li><li><p>What would need to change for it to become migratable?</p></li><li><p>Is the x86 stage fully isolated so that the ARM64 migration of other stages is not blocked by it?</p></li></ul><p>The goal is intentional architecture, not incomplete migration. A GPU inference stage that stays on x86 by design is not a failure. It is a correct architectural boundary.</p><div><hr></div><h2>What This Means for New Products: Building for ARM Portability</h2><p>If you are building a new product and want to default to Graviton for cost efficiency, the considerations are different from migration. The choices you make at the start of your architecture will determine how much of the system can run on ARM64.</p><h3>Choose dependency-light stages where possible</h3><p>The deduplication stage in Parjanya worked on Graviton from day one because it had minimal native dependencies. When designing a new service, ask whether a pure-Python or well-supported-wheel implementation can solve the problem before reaching for a heavier ML or native library.</p><h3>Treat CUDA as a hard architectural boundary from the start</h3><p>If a stage requires GPU inference, isolate it behind a clean interface from day one. The scheduling logic, the orchestration, the result handling &#8212; all of that can run on ARM64. Only the GPU execution itself needs x86. Design for that split explicitly rather than letting the GPU requirement contaminate surrounding stages.</p><h3>Version-pin with ARM64 wheel availability in mind</h3><p>When locking dependency versions for reproducibility, verify that your pinned versions ship <code>manylinux_aarch64</code> wheels. A version that was pinned for stability before the package added ARM64 support will block migration silently &#8212; you will not know until you try to build.</p><h3>Build in CI on ARM64 from day one</h3><p>Adding ARM64 build validation to your CI pipeline when you start a project costs almost nothing. Adding it after 18 months of x86-first development costs weeks of debugging. Many packages add and remove ARM64 wheel support across versions; having a CI gate that verifies ARM64 builds on every dependency update catches regressions immediately.</p><h3>Use the 20% Lambda pricing delta as a design signal</h3><p>AWS prices ARM64 Lambda at approximately 20% less than x86. That is not just an operational saving &#8212; it is a signal about where to route compute. If a function is trivially portable (pure Python, well-supported wheels), choosing x86 without evaluating ARM64 first is a deliberate decision to pay a 20% premium for no benefit.</p><div><hr></div><h2>The AWS-Specific Caveat</h2><p>Everything in this post is calibrated to AWS. The cost numbers, the Lambda architecture flag, the Graviton family of processors, the <code>manylinux_aarch64</code> wheel availability for AWS runtimes &#8212; these are AWS-specific.</p><p>Other cloud providers offer ARM compute. Azure has Ampere A1-based VMs. GCP has Tau T2A. But:</p><ul><li><p>Serverless ARM support (equivalent to Lambda arm64) is not uniformly available or mature across providers</p></li><li><p>The degree of AWS-specific optimisation in the Python scientific and ML ecosystem &#8212; particularly for Graviton NEON instructions &#8212; is not replicated elsewhere</p></li><li><p>Cost structures differ; the 20% pricing delta is an AWS Lambda figure and does not translate directly to other billing models</p></li></ul><p>If you are building a multi-cloud or cloud-agnostic system, treat Graviton optimisation as an AWS-specific tuning layer rather than a foundational architectural decision. The portability of your ARM64-compatible stages will transfer. The AWS-specific performance characteristics will not.</p><div><hr></div><h2>The Real Cost Model</h2><p>The standard framing of Graviton savings is &#8220;20% cheaper Lambda.&#8221; That is accurate but incomplete. The full savings model for an architecture like Parjanya&#8217;s has four components:</p><ol><li><p><strong>Lower per-invocation Lambda cost</strong> on ARM64 (~20% pricing delta, compounding with every invocation)</p></li><li><p><strong>Avoided NAT data-path spend</strong> &#8212; VPC gateway endpoints route S3 and DynamoDB traffic without NAT tax; this is infrastructure rather than ARM64, but it compounds with the migration</p></li><li><p><strong>Reduced ML over-processing</strong> &#8212; a rule-based pre-filter like <code>parjanya-technical_validator</code> rejects bad images before they reach the GPU queue; every rejected frame is a GPU invocation that never happens</p></li><li><p><strong>Lower operational overhead</strong> &#8212; fragile native builds create deployment failures, cold start issues, and CI complexity; removing them reduces engineering time</p></li></ol><p>For a high-volume pipeline, component 3 often dominates. The ARM64 savings from the validator are real. But the savings from not running expensive GPU inference on images that would have been rejected anyway are an order of magnitude larger.</p><p>This is the correct way to think about Graviton adoption: not as a compute cost reduction in isolation, but as an opportunity to reconsider stage design, dependency choices, and processing flow in ways that compound the savings.</p><div><hr></div><h2>Summary</h2><p>The ARM wheel is the gatekeeper to Graviton savings. Not the hardware, not AWS support, not your application code. The compiled binary distribution of your Python dependencies &#8212; and whether it exists for <code>aarch64</code> &#8212; is what determines whether a given Lambda function can run on Graviton.</p><p>The practical conclusions from Parjanya&#8217;s full migration arc:</p><ul><li><p><strong>Audit your wheel matrix before you plan your migration.</strong> The output tells you which functions migrate, which need source builds, and which need architectural changes.</p></li><li><p><strong>Build in an ARM64 environment that matches your Lambda runtime.</strong> Local results on x86 do not predict ARM64 install success.</p></li><li><p><strong>Replacement is often faster than migration.</strong> A fragile ML stage replaced by a dependency-light rule-based implementation solves the ARM64 problem, the reliability problem, and often the correctness problem simultaneously.</p></li><li><p><strong>Isolate x86 hard boundaries explicitly.</strong> CUDA is the cleanest example &#8212; design around it rather than pretending it is temporary.</p></li><li><p><strong>Partial adoption is architecture, not failure.</strong> Running 3 of 4 Lambda functions on Graviton with an intentional x86 boundary at the GPU stage is a correct outcome.</p></li></ul><p>Graviton adoption is not a hardware decision. The hardware is already ready. It is an ecosystem decision &#8212; and the ARM wheel matrix is where that decision lives.</p><div><hr></div><h2>Further Reading</h2><ul><li><p><a href="https://github.com/aws/aws-graviton-getting-started/blob/main/python.md">AWS Graviton Getting Started &#8211; Python</a> &#8212; The canonical reference for why Python version and GLIBC version matter for wheel compatibility</p></li><li><p><a href="https://aws.amazon.com/blogs/compute/migrating-aws-lambda-functions-to-arm-based-aws-graviton2-processors/">Migrating AWS Lambda functions to ARM-based Graviton2</a> &#8212; AWS&#8217;s official guide; read between the lines for what is assumed about dependency simplicity</p></li><li><p><a href="https://aws.github.io/graviton/">AWS Graviton Technical Guide</a> &#8212; Deep reference on runtime support and ecosystem maturity by language</p></li><li><p><a href="https://blog.phagyul.ai/p/why-we-could-only-use-aws-graviton">Why We Could Only Use AWS Graviton for 1 of Our 4 ML Lambdas</a> &#8212; First Parjanya post: the ecosystem reality check</p></li><li><p><a href="https://blog.phagyul.ai/p/from-14-to-34-re-architecting-an">From 1/4 to 3/4: Re-architecting an ML Pipeline for Graviton</a> &#8212; Second Parjanya post: the re-architecture and cost analysis</p></li><li><p><a href="https://blog.phagyul.ai/p/aws-graviton4-vs-intel-x86-from-10">AWS Graviton4 vs Intel x86: From $10 POC to Production Validation</a> &#8212; The original POC that established the cost and performance baseline</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li></ul>]]></content:encoded></item><item><title><![CDATA[TBIE in Practice: Designing Resilient AI Pipelines That Recover, Reconcile, and Re-run]]></title><description><![CDATA[Abstract]]></description><link>https://blog.phagyul.ai/p/tbie-in-practice-designing-resilient</link><guid isPermaLink="false">https://blog.phagyul.ai/p/tbie-in-practice-designing-resilient</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Mon, 25 May 2026 05:36:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ok-g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ok-g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ok-g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png 424w, https://substackcdn.com/image/fetch/$s_!ok-g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png 848w, https://substackcdn.com/image/fetch/$s_!ok-g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png 1272w, https://substackcdn.com/image/fetch/$s_!ok-g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ok-g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png" width="1456" height="799" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:799,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1376345,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.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_!ok-g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png 424w, https://substackcdn.com/image/fetch/$s_!ok-g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png 848w, https://substackcdn.com/image/fetch/$s_!ok-g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png 1272w, https://substackcdn.com/image/fetch/$s_!ok-g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbe12bff-5e6a-4f47-92ca-1f9569ff933d_1692x929.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Abstract</h2><p>Resilient AI infrastructure is not defined only by model quality, throughput, or scaling efficiency. In production, the harder problem is <strong>reconciliation: keeping durable state, requested work, and actual execution aligned when workers fail, queues drift, storage paths change, policies evolve, and control planes become blind.</strong> Let me present TBIE, a practical operating model for distributed systems: <strong>Truth, Belief, Intent, and Execution</strong>. TBIE separates the authoritative record of what is true from the operational view of what seems to be happening, the replayable journal of work that should occur, and the stateless workers that realize side effects.</p><p>I have used Parjanya v2.0, an image ingestion and GPU-based visual scoring platform, as a detailed case study. Parjanya&#8217;s architecture spans immutable uploads, DynamoDB workflow state, SQS-based intent, event-driven replay, GPU autoscaling, browser-side uploads, policy regrading, and infrastructure drift. Across these layers, TBIE proved useful not as a slogan but as a diagnostic and design framework. It clarified why transient worker failure should not destroy replayable work, why pending state without corresponding intent is a reconciliation gap, why wrong-bucket routing can be deterministically wrong, why policy changes should be handled as controlled replay, and why control-plane blindness is more dangerous than isolated worker failure.</p><p>The central claim of this is that resilient AI platforms should be designed as reconciliation systems rather than one-way pipelines. A pipeline moves data forward. A reconciliation system continuously repairs the alignment between truth and work until intended outcomes are actually realized. That distinction changes how we design queues, retries, autoscaling, observability, IAM boundaries, tenant onboarding, model packaging, browser uploads, and recovery runbooks.</p><h2>1. Introduction</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZgMA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZgMA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ZgMA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ZgMA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ZgMA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZgMA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1412263,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.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_!ZgMA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ZgMA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ZgMA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ZgMA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a31422-9968-48dd-b72d-ee0b3228e5b0_1536x1024.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Modern AI systems are often described in terms of model choice, hardware selection, vector stores, and inference efficiency. Those concerns are important, but they are not usually what breaks production systems. In practice, systems fail because they lose work, duplicate work, misroute work, or misinterpret what is actually happening. A queue may look healthy while the underlying work has already vanished. A worker may crash without leaving a replayable record. A browser upload may fail after the backend has already committed a pending state. An autoscaling group may be configured correctly while the reconciliation control plane that should activate it is blind.</p><p>These failures are not unusual edge cases. They are the normal shape of distributed systems under stress. The question, then, is not whether a system will experience drift between state and execution, but whether the architecture is built to detect, explain, and repair that drift. TBIE was developed as a response to that question.</p><p>TBIE stands for Truth, Belief, Intent, and Execution. It is a practical decomposition of distributed systems that helps separate durable facts from operational signals, requested work from realized work, and recoverable failures from terminal ones. The model is especially useful in asynchronous AI pipelines, where storage, metadata, queues, workers, and control planes all operate independently and can fail independently.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DI0j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DI0j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.png 424w, https://substackcdn.com/image/fetch/$s_!DI0j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.png 848w, https://substackcdn.com/image/fetch/$s_!DI0j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.png 1272w, https://substackcdn.com/image/fetch/$s_!DI0j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DI0j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.png" width="1456" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f75e66e9-1015-4732-95e4-6352de5005e5_1717x916.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1531637,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.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_!DI0j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.png 424w, https://substackcdn.com/image/fetch/$s_!DI0j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.png 848w, https://substackcdn.com/image/fetch/$s_!DI0j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.png 1272w, https://substackcdn.com/image/fetch/$s_!DI0j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75e66e9-1015-4732-95e4-6352de5005e5_1717x916.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Parjanya v2.0 is an ideal case study because it combines all of those surfaces in a single system. Images are uploaded to S3. Metadata is written to DynamoDB. GPU work is performed asynchronously through SQS. Lambda functions handle technical validation and replay orchestration. GPU workers consume intent, perform visual-language inference, and write enriched truth back to the database. Autoscaling responds to queue depth. Browser uploads interact with tenant-specific buckets and CORS policies. Policy changes require historical reprocessing. Infrastructure drift can occur in launch templates, AMIs, model packages, and endpoint configuration.</p><p>Let&#8217;s deep dive how TBIE behaves in practice.</p><h2>2. The TBIE Model</h2><p>TBIE divides a distributed system into four layers that must remain conceptually distinct.</p><h3>2.1 Truth</h3><p>Truth is the durable record of what is actually true. It should survive worker restarts, deploys, transient outages, and runtime drift. In Parjanya, Truth lives in immutable S3 objects, DynamoDB workflow rows, hashes, status fields, curation metadata, and derived state that has been durably committed. Truth answers questions such as: What object exists? What stage of the workflow is this image in? What has already been computed? What is the authoritative record of the tenant, batch, or image?</p><h3>2.2 Belief</h3><p>Belief is the operational view of reality. It is derived from Truth and current signals, but it may lag, be partial, or be noisy. In Parjanya, Belief includes queue depth, in-flight message counts, worker health, GPU availability, desired ASG capacity, scaling activity, and alarm state. Belief is what operators see first, but it must not be confused with source-of-record truth.</p><h3>2.3 Intent</h3><p>Intent is the durable record of work that has been requested. It is the journal of &#8220;please do this work.&#8221; In Parjanya, SQS messages represent Intent. Replay jobs, regrade jobs, and retry workflows are all forms of Intent. The critical property of Intent is replayability. If Intent can be lost too early, then transient failures become permanent failures and manual rescue becomes necessary.</p><h3>2.4 Execution</h3><p>Execution is the stateless work that turns Intent into side effects and updated Truth. In Parjanya, Execution includes Graviton Lambdas for EXIF extraction and technical validation, GPU workers for VLM inferencing and image quality analysis, replay jobs that reconstruct missing Intent, and autoscaling actions that wake the worker fleet when work appears. Execution is where work happens, but in a resilient system it must never be allowed to erase the record of what was supposed to happen.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oksd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oksd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!oksd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!oksd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!oksd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oksd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.png" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1272750,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_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_!oksd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!oksd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!oksd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!oksd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692ac6c4-2bbd-4cf4-918c-231d79c3515a_1024x1536.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>3. Why Reconciliation Matters</h2><p>The key insight behind TBIE is that a distributed system is not healthy merely because its components are running. Health depends on reconciliation. A system can be superficially alive while still being functionally stuck. A database row may say <code>pending_vlm_enrichment</code> while no SQS message exists. A queue may be empty while worker work is still pending in truth. A control plane may be scheduled while unable to read the signals it needs to act.</p><p>Reconciliation is the process of bringing Truth, Intent, and Execution back into alignment. In the TBIE model, reconciliation is not a background nicety; it is the core operating principle. Systems should not rely on humans noticing a stale queue and manually fixing it. They should be able to repair the missing relationship between truth and work on their own.</p><p>This is why the distinction between a pipeline and a reconciliation system matters. A pipeline assumes a mostly linear progression from input to output. A reconciliation system assumes that progression can be interrupted, delayed, partially completed, or invalidated by failure. It therefore builds explicit mechanisms to recover the intended outcome rather than merely continue from the last known step.</p><h2>4. Event-Driven Reconciliation in Parjanya v2.0</h2><p>Parjanya initially used a scheduled polling model. A timer would wake the replay Lambda periodically, the Lambda would scan for pending work, and if appropriate it would emit SQS messages and trigger GPU autoscaling. This worked, but it introduced avoidable latency, wasted invocations, and operational ambiguity. The system could not react immediately when Truth changed, and operators had to reason about whether the queue was empty because the system had genuinely caught up or because the next poll had not yet occurred.</p><p>The move to DynamoDB Streams changed that architecture fundamentally. Now, when a workflow row reaches <code>pending_vlm_enrichment</code>, the stream emits an event immediately. An event source mapping filters for relevant writes, batches records briefly, and invokes the replay Lambda. The Lambda discovers missing or retriable work, emits Intent into SQS, and kicks the GPU ASG when necessary. This turns reconciliation from periodic discovery into event-driven reaction.</p><p>The result is a lower-latency, more honest architecture. Truth changes, the control plane notices, Intent is created, and Execution follows. The system no longer waits for a timer to rediscover what should already be known.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UytF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UytF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!UytF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!UytF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!UytF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UytF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1350557,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.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_!UytF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!UytF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!UytF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!UytF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1559a0-6e4c-4e90-8de3-5c9c2ab3dc0c_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>5. Parjanya v2.0 as a TBIE Case Study</h2><p>Parjanya&#8217;s architecture maps neatly onto TBIE. S3 holds immutable uploads and preview artifacts. DynamoDB holds workflow state, curation metadata, and hashes. SQS holds replayable intent. Lambdas handle validation, replay, and orchestration. GPU workers perform inference and write enriched state back to DynamoDB. Autoscaling follows queue pressure and worker demand.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MUPC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MUPC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!MUPC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!MUPC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!MUPC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MUPC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1380189,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.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_!MUPC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!MUPC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!MUPC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!MUPC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bd48945-f4e0-4744-b065-a4ffd041a8e4_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>What makes the case study valuable is not the existence of those components, but the failure modes they exposed. Parjanya demonstrated that many production issues are really reconciliation issues in disguise. Some failures were caused by deleting intent too early. Others were caused by truth existing without intent. Some were caused by the wrong bucket being referenced correctly. Others were caused by the control plane being unable to read queue state. Still others came from stale image tags, missing model files, CORS misconfiguration, or API schema drift. TBIE made those failures legible.</p><h3>5.1 Transient GPU failure should not destroy Intent</h3><p>One of the earliest and most important incidents involved GPU workers deleting SQS messages before the retry window had been exhausted. A worker could encounter a temporary S3 download failure or an out-of-memory condition, write a failure state, and still remove the only replayable message. At that point, Truth said the work had failed, but Intent no longer existed and the system had no automatic path to try again.</p><p>TBIE made the problem obvious. Execution had destroyed Intent prematurely. The fix was to return explicit execution outcomes: <code>retry</code>, <code>terminal_failure</code>, or <code>completed</code>. A retry preserves the message and lets visibility timeout and receive count determine whether the work should be attempted again. A terminal failure writes durable failed truth and then deletes the message. Success writes final truth and deletes the message. That separation preserves replayability while still allowing durable failure when necessary.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Give!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Give!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Give!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Give!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Give!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Give!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1280351,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.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_!Give!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Give!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Give!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Give!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175efbd2-4697-4ac2-adf5-2aa487057cdd_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>5.2 Truth can be pending while Intent never existed</h3><p>Another recurring failure mode was the mirror image of the first. Rows in DynamoDB would remain in a pending VLM state, but no corresponding queue message had been created. Queue depth fell to zero and the system appeared idle, yet the backlog still existed in Truth.</p><p>This is a reconciliation gap, not a worker bug. The response was to introduce replay mechanisms that scan for pending rows without Intent, regenerate queue messages, and kick the GPU fleet when work is emitted. In other words, the platform needed a control plane that could restore missing Intent from Truth automatically.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OvxU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OvxU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!OvxU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!OvxU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!OvxU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OvxU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/392bc444-cc09-431d-b543-564a70f69bce_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1258474,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.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_!OvxU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!OvxU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!OvxU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!OvxU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F392bc444-cc09-431d-b543-564a70f69bce_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>5.3 Replaying retryable failures requires resetting Truth deliberately</h3><p>Not every failure should be treated as terminal. Some failures, such as S3 download errors or temporary GPU OOM events, are retryable if the underlying condition is corrected. But a simple re-enqueue is not enough when the workflow row itself still contains partial or stale derived fields.</p><p>TBIE clarifies the difference between retry and replay. A retry is another attempt at the same execution. A replay is a deliberate reset to a pre-execution boundary, removal of stale derived state, and emission of fresh Intent. This distinction matters because the second form is a controlled reconstruction of the workflow, not merely another attempt on top of corrupted state.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wfgU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wfgU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!wfgU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!wfgU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!wfgU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wfgU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1351019,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.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_!wfgU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!wfgU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!wfgU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!wfgU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a70de2d-fe49-4f50-8342-44dcc1e7ea35_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>5.4 Wrong bucket, right key</h3><p>One of the most instructive incidents involved an SQS payload that pointed to a valid preview key but the wrong bucket. The worker repeatedly failed with S3 download errors, even though the preview existed. The issue was not flaky execution. It was deterministic misrouting.</p><p>This is a classic distributed systems failure: the object key is correct, but the address is wrong. TBIE makes that failure visible because Intent is not just &#8220;some work exists.&#8221; Intent must encode the correct target. The fix was to force preview keys to use the uploads bucket as the source of truth and to tighten eligibility so only objects suitable for GPU work are enqueued.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Mtk_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Mtk_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Mtk_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Mtk_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Mtk_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Mtk_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1292711,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.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_!Mtk_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Mtk_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Mtk_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Mtk_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f60d8d7-6784-41d7-88f8-90d8e26ce0bd_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>5.5 Policy changes should be handled as replay, not patching</h3><p>When the content policy changed to more strictly reject non-photographic content such as screenshots, banners, infographics, social cards, slides, illustrations, and mockups, the platform needed to reprocess historical images under the new rules. TBIE made the solution obvious: reset the affected Truth fields to a pre-VLM boundary, set the rows back to pending, and emit new Intent so GPU workers can re-grade under the revised policy.</p><p>This is one of the most powerful properties of replay-native systems. They allow policy evolution without manual data surgery. A change in judgment does not require a one-off correction script. It becomes a controlled reprocessing event with clear before-and-after semantics.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RabB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RabB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!RabB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!RabB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!RabB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RabB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1332578,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.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_!RabB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!RabB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!RabB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!RabB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f06ffab-14ca-4963-b48f-640ec28db035_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>5.6 Execution drift can occur below the application layer</h3><p>Parjanya also surfaced failures where the application code was correct but the execution environment was stale. One launch template continued to point to an old image tag. Cloud-init failed while pulling the nonexistent container image, and the GPU instance came up without ever starting the worker.</p><p>A separate incident involved an AMI missing the Python files required by a model that relied on remote code. The container started, but the model loader crashed because the local artifact was incomplete. These are both Execution-layer failures, but they occur at different depths: one at instance boot, the other at model runtime. TBIE is useful because it keeps both cases in the same conceptual category: the execution environment drifted away from the declared source of truth.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vLkz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vLkz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!vLkz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!vLkz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!vLkz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vLkz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1390122,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.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_!vLkz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!vLkz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!vLkz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!vLkz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcadebad4-114d-4157-b1f7-68197a4557c6_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>5.7 CORS and browser execution are part of the resilience story</h3><p>The ingestion path introduced another class of split-state failure. The backend could write a pending upload record and generate a presigned URL, but the browser&#8217;s PUT could still fail because the bucket CORS policy or endpoint routing was incorrect. In that case, Truth at the API layer looked correct while Execution at the browser layer never completed.</p><p>Later investigations revealed that multiple independent layers could be wrong at once. A bucket might reject wildcard origins under restricted public bucket settings while the client simultaneously used a global S3 endpoint that returned a redirect browsers would not follow on OPTIONS preflight. TBIE helps here by forcing the diagnostic question: is Intent missing, or is Execution unable to realize it? In this case, Intent existed. Execution was blocked by infrastructure and configuration drift.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j8uE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j8uE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!j8uE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!j8uE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!j8uE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j8uE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1385293,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.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_!j8uE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!j8uE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!j8uE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!j8uE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dfb5140-43a7-455a-9ad6-78206dd2cf54_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>5.8 The control plane itself can fail silently</h3><p>One of the most dangerous incidents in the system occurred when the replay Lambda lacked the permission it needed to read queue attributes. The function was still scheduled and invoked, but it could not inspect Belief and therefore crashed before it could emit Intent or kick the GPU ASG. From the outside, everything looked enabled. In reality, the control plane had gone blind.</p><p>This is a crucial TBIE lesson. The component that repairs work is itself a first-class reliability surface. If the control plane silently fails, then every other safety net becomes weaker. That is why control-plane observability must be stronger than ordinary worker observability.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NBZf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NBZf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!NBZf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!NBZf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!NBZf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NBZf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1352658,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.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_!NBZf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!NBZf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!NBZf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!NBZf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44fce6c3-6eed-41d7-8d38-952c19b4f570_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>5.9 Dynamic tenant discovery and queue retention are part of reconciliation</h3><p>As the platform grew, static tenant lists became a bottleneck. Reconciliation could not depend on manually editing Terraform every time a new tenant was onboarded. The control plane therefore moved toward dynamic tenant discovery from DynamoDB, with tenant registry markers written by the upload path and discovered by the replay Lambda at runtime.</p><p>Queue retention was another important operational detail. If the GPU fleet is scaled to zero for cost savings, Intent must survive long enough for work to be processed after a weekend or holiday gap. Retention policy is therefore part of resilience design, not a generic queue setting.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hek4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hek4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Hek4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Hek4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Hek4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hek4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c618b31-0389-4543-9035-c9ada6781450_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1417519,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.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_!Hek4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Hek4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Hek4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Hek4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c618b31-0389-4543-9035-c9ada6781450_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>6. Operational Model and Runbook Thinking</h2><p>TBIE becomes truly useful only when it changes how incidents are diagnosed.</p><p>By the time Parjanya matured into an event-driven reconciliation system, the debugging approach itself had changed. Operators no longer began by asking whether &#8220;the queue is healthy&#8221; or whether &#8220;the GPU workers are running.&#8221; Those signals mattered, but they were no longer treated as authoritative.</p><p>Instead, every investigation began with a simpler and much more precise question:</p><p>Is the system waiting because Intent is missing, or is Intent present but Execution cannot realize it?</p><p>That distinction dramatically narrowed the search space during incidents.</p><p>If Truth showed a growing backlog while Intent remained near zero, the issue was usually in reconciliation: replay Lambda failure, queue emission failure, stale tenant discovery, or control-plane blindness.</p><p>If Intent existed but Execution failed repeatedly, the problem shifted toward realization: bucket routing, IAM permissions, runtime drift, stale launch templates, model incompatibility, or endpoint mismatch.</p><p>The architecture became easier to reason about because TBIE transformed debugging from improvisation into classification.</p><h2>7. Guardrails and Maintenance as Part of the Architecture</h2><p>Parjanya&#8217;s history shows that resilient systems are built by converting incidents into guardrails. Transient worker failures should not destroy intent. Replay logic should reset truth cleanly before re-emitting work. Dependency drift should be prevented with lockfiles and build assertions. CORS origin drift should be rejected at plan time. Tenant discovery should be dynamic rather than manually maintained. Launch templates should refresh when image tags change. Model artifacts and container versions should be treated as a compatibility pair. API contracts and frontend types should not be allowed to drift silently. Queue retention should match the actual outage window, not an idealized one.</p><p>This is the practical meaning of reliability engineering. Incidents become permanent controls. The architecture evolves by accumulating constraints, validations, and replay paths that encode what the system has already learned.</p><h2>8. Implications for AI Platform Design</h2><p>TBIE generalizes beyond Parjanya. Any AI platform that spans storage, metadata, asynchronous work, GPU execution, and policy evolution can benefit from the same model. The key is to stop thinking of the system as a one-way pipeline and instead treat it as a reconciliation loop that continuously restores alignment between durable truth and intended work.</p><p>That shift affects architecture choices. Queues become journals of intent rather than temporary transport. Replay becomes a first-class product capability rather than an ops workaround. Autoscaling becomes a consequence of work existing, not a heuristic guess. Model packaging becomes part of execution correctness. Browser upload behavior becomes part of the end-to-end reliability model. And policy change becomes a replay event rather than a manual repair task.</p><h1>When the System Hangs at 02:00 AM</h1><p>At 02:00 AM, the queue may look empty while customers are still waiting for images to process. GPU instances may exist while no workers are actually running. A replay Lambda may still appear scheduled while silently crashing on every invocation. Dashboards may continue showing green infrastructure while the control plane itself has already gone blind.</p><p>This is where TBIE stopped being an architectural abstraction and became an operational model.</p><p>The first step was no longer restarting workers or increasing autoscaling limits. The first step became identifying which reconciliation boundary had failed.</p><p>The investigation usually began with Truth.</p><p>Was DynamoDB accumulating rows in <code>pending_vlm_enrichment</code>? If so, the platform still believed work should exist, regardless of what the queue appeared to show. Truth backlog became the first signal because Truth is the authoritative record of unfinished work.</p><p>The next step was Intent.</p><p>Did SQS actually contain replayable work items? A high Truth backlog combined with near-zero queue depth usually indicated a reconciliation failure rather than an execution failure. In those cases, the replay Lambda itself became suspect. Either the control plane had stopped emitting Intent, or it had lost the ability to discover the work that needed to exist.</p><p>That distinction mattered enormously because the operational response changed completely depending on the answer.</p><p>If Intent existed but the backlog still did not move, attention shifted toward Execution health. GPU worker logs became critical. Sometimes the workers were healthy but repeatedly failing with deterministic download errors caused by bucket routing drift. Sometimes GPU instances launched successfully while containers never started because a stale launch template pointed to a nonexistent image tag. In other cases, the instance booted correctly but the model loader crashed because required runtime artifacts were missing from the AMI.</p><p>One of the most revealing operational signals turned out to be complete silence.</p><p>An empty GPU log group was rarely a good sign. More often, it meant execution had failed before the application layer even started. Cloud-init failures, image pull failures, IAM denial during bootstrap, or launch-template drift frequently surfaced first as absence rather than explicit failure.</p><p>The replay Lambda introduced another category of silence.</p><p>If queue visibility remained unchanged while pending Truth continued growing, the control plane itself became the focus. One of the most dangerous incidents in the system occurred when the replay Lambda lost permission to read queue attributes. The function was still scheduled. It was still being invoked. But it crashed before emitting Intent or triggering autoscaling. From the outside, everything looked operational while reconciliation had effectively stopped.</p><p>That incident permanently changed the operational philosophy of the platform.</p><p>Worker failures became treated as recoverable noise.</p><p>Control-plane blindness became treated as a systemic risk.</p><p>Eventually, the debugging process itself evolved into a TBIE classification exercise:</p><ul><li><p>Truth backlog revealed whether unfinished work existed.</p></li><li><p>Intent backlog revealed whether reconciliation was functioning.</p></li><li><p>Queue visibility revealed whether work was flowing.</p></li><li><p>GPU log silence revealed bootstrap or execution drift.</p></li><li><p>Replay Lambda silence revealed control-plane failure.</p></li><li><p>IAM checks validated whether orchestration still had authority to act.</p></li><li><p>Launch-template validation confirmed whether execution environments still matched declared infrastructure state.</p></li></ul><p>The system stopped being debugged as &#8220;a pipeline.&#8221;</p><p>It began being debugged as a continuously reconciling distributed system.</p><p>That distinction changed how incidents were understood, how recovery was automated, and ultimately how the platform itself evolved.</p><h2>9. Conclusion</h2><p>Parjanya v2.0 demonstrates that resilient AI infrastructure depends on more than good models or fast workers. It depends on a clear model for distinguishing what is true, what is believed, what work is intended, and what execution can actually accomplish. TBIE provides that model.</p><p>The value of TBIE is not just conceptual. It changes how systems are built, how retries are designed, how control planes are monitored, how infrastructure drift is prevented, and how policy changes are reapplied. Most importantly, it turns production failure from a confusing mystery into a structured reconciliation problem.</p><p>That is why the right mental model for modern AI infrastructure is not merely &#8220;build a pipeline.&#8221; It is &#8220;build a system that can continuously reconcile truth and intent until intended work is actually realized.&#8221;</p><h2>Appendix A. Maintenance Checklist</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i9vf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i9vf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!i9vf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!i9vf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!i9vf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i9vf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1561610,&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://blog.phagyul.ai/i/199145206?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.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_!i9vf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!i9vf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!i9vf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!i9vf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82143e30-f210-459b-91b3-8475d948ce8f_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That checklist is not a substitute for architecture. It is how architecture remains trustworthy over time.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Context Engineering and Context Debt]]></title><description><![CDATA[TL;DR: I noticed Haiku 4.5 being spawned as a subagent during an Opus 4.7 session.]]></description><link>https://blog.phagyul.ai/p/context-engineering-and-context-debt</link><guid isPermaLink="false">https://blog.phagyul.ai/p/context-engineering-and-context-debt</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Wed, 20 May 2026 06:06:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dA7S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dA7S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dA7S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!dA7S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!dA7S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!dA7S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dA7S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1687837,&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://jagadeeshrampam.substack.com/i/198514119?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.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_!dA7S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!dA7S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!dA7S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!dA7S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea4dfbb-67e2-4a62-af94-c33dac8db92a_1774x887.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="pullquote"><p><strong>TL;DR:</strong> I noticed Haiku 4.5 being spawned as a subagent during an Opus 4.7 session. That observation opened a data investigation that revealed ~77% of my token spend was context accumulation waste, not productive reasoning. This is the framework I built to fix it &#8212; and the problem has a name: <strong>Context Debt </strong>and the fix is:<strong> Context Engineering </strong>.</p></div><h2>1. The Observation That Started This</h2><p>A few weeks ago I noticed something in my Claude Code session trace: Haiku 4.5 was being invoked as a subagent while my main session was running on Opus 4.7.</p><p><strong>My first instinct was: </strong><em><strong>is this personalisation? Has Claude learned my patterns? Is this a new adaptive router?</strong></em></p><p>It was none of those things. But chasing the answer led me into a deep audit of my actual usage data &#8212; and what I found changed how I think about AI session economics entirely.</p><p>The short answer: Claude Code has a built-in subagent architecture where the main orchestrator (Opus 4.7 in my case) delegates read-only codebase work to the <strong>Explore subagent</strong>, which runs on Haiku 4.5 by default. It is deterministic product behaviour, not personalisation. The model matching is happening at the subagent dispatch boundary, not through learned routing.</p><p>But the longer answer &#8212; what I found when I actually pulled my usage data &#8212; is the more important story.</p><div><hr></div><h2>2. What the Data Actually Showed</h2><p>Running <code>/cost</code> in my Claude Code terminal revealed the real picture, however it is only 3% of usage, 33 sessions, complete details are found using <code>ccusage</code>, still showing the important metrics:</p><pre><code>Favorite model:  Opus 4.7        Total tokens: 22.0M
Sessions: 33                     Longest session: 7d 2h 33m

&#9679; Opus 4.7  (53.3%)   In: 118.2k  &#183; Out: 11.6M
&#9679; Opus 4.6  (18.2%)   In: 118.3k  &#183; Out: 3.9M
&#9679; Haiku 4.5 (20.6%)   In: 363.5k  &#183; Out: 4.2M
&#9679; Sonnet 4.6  (7.9%)  In:  63.0k  &#183; Out: 1.7M</code></pre><p>Combined Opus usage: <strong>71.5%</strong> of all tokens.</p><p>Sonnet &#8212; the model I publicly advocated as the benchmark &#8212; was only <strong>7.9%</strong> of my actual usage.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:197172333,&quot;url&quot;:&quot;https://jagadeeshrampam.substack.com/p/sonnet-46-became-my-new-benchmark&quot;,&quot;publication_id&quot;:7361555,&quot;embedding_publication_id&quot;:null,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:null,&quot;title&quot;:&quot;Sonnet 4.6 Became My New Benchmark for Building an Infra-Heavy VLM Platform&quot;,&quot;truncated_body_text&quot;:&quot;A few months ago, I wrote about why I believed in a Haiku-first strategy: start with the cheapest and fastest model possible, then escalate only when the task genuinely becomes harder. That idea still makes sense in principle.&quot;,&quot;date&quot;:&quot;2026-05-11T04:33:51.017Z&quot;,&quot;like_count&quot;:0,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;handle&quot;:&quot;jagadeeshrampam&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2fbd24c4-e9ca-4d07-9320-d1c105eb38c8_1085x1085.jpeg&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;profile_set_up_at&quot;:&quot;2023-11-17T15:21:07.496Z&quot;,&quot;reader_installed_at&quot;:&quot;2023-11-16T16:33:25.907Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:7512312,&quot;user_id&quot;:12091074,&quot;publication_id&quot;:7361555,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:true,&quot;publication&quot;:{&quot;id&quot;:7361555,&quot;name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;subdomain&quot;:&quot;jagadeeshrampam&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Techie, explorer and photographer &quot;,&quot;logo_url&quot;:null,&quot;author_id&quot;:12091074,&quot;primary_user_id&quot;:12091074,&quot;theme_var_background_pop&quot;:&quot;#FF6719&quot;,&quot;created_at&quot;:&quot;2025-12-23T11:09:54.434Z&quot;,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Jagadeesh Rampam&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false,&quot;logo_url_wide&quot;:null}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;status&quot;:{&quot;bestsellerTier&quot;:null,&quot;subscriberTier&quot;:1,&quot;leaderboard&quot;:null,&quot;vip&quot;:false,&quot;badge&quot;:{&quot;type&quot;:&quot;subscriber&quot;,&quot;tier&quot;:1,&quot;accent_colors&quot;:null},&quot;paidPublicationIds&quot;:[10845],&quot;subscriber&quot;:null}}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;,&quot;source&quot;:null}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://jagadeeshrampam.substack.com/p/sonnet-46-became-my-new-benchmark?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><span></span><span class="embedded-post-publication-name">Jagadeesh Rampam</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Sonnet 4.6 Became My New Benchmark for Building an Infra-Heavy VLM Platform</div></div><div class="embedded-post-body">A few months ago, I wrote about why I believed in a Haiku-first strategy: start with the cheapest and fastest model possible, then escalate only when the task genuinely becomes harder. That idea still makes sense in principle&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">4 months ago &#183; Jagadeesh Rampam</div></a></div><p>Running <code>ccusage session</code> revealed the concentration problem:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xN3S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xN3S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!xN3S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!xN3S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!xN3S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xN3S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1458269,&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://jagadeeshrampam.substack.com/i/198514119?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.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_!xN3S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!xN3S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!xN3S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!xN3S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9d90ab-331a-4391-af4c-9801d50fad77_1774x887.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Two sessions accounted for 50.9% of all costs.</strong></p><p>The small sessions with $0.16&#8211;0.22/M cost-per-token are my manual Haiku sessions &#8212; git commits, README updates, simple lookups. Haiku routing was working correctly there.</p><p>The two expensive sessions are a different story entirely. And the cost-per-million ratio is the key signal: at $0.53&#8211;0.63/M blended, those sessions were Opus-orchestrated with some subagent delegation, but the token volume itself was the problem &#8212; not the model choice.</p><div><hr></div><h2>3. Naming the Problem: Context Debt</h2><p>Before getting to solutions, I want to name what I observed, because it needs a name.</p><p><strong>Context Debt</strong> is the accumulation of tokens in a session that compound the cost of every future turn without adding proportional value to the reasoning quality of those turns.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:185498867,&quot;url&quot;:&quot;https://jagadeeshrampam.substack.com/p/from-diagnosing-ai-debt-to-durable&quot;,&quot;publication_id&quot;:7361555,&quot;embedding_publication_id&quot;:null,&quot;publication_name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;publication_logo_url&quot;:null,&quot;title&quot;:&quot;From diagnosing AI debt to durable fixes (Part-3)&quot;,&quot;truncated_body_text&quot;:&quot;This is Part 3 of the series on getting the best from Claude code. Part 1 on Why you should chose Haiku as Default model and escalate if needed; Part 2 introduced three practical practices &#8212; repo/component Claude.md files, prompt caching, and context engineering&quot;,&quot;date&quot;:&quot;2026-01-23T04:19:00.975Z&quot;,&quot;like_count&quot;:0,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:12091074,&quot;name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;handle&quot;:&quot;jagadeeshrampam&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2fbd24c4-e9ca-4d07-9320-d1c105eb38c8_1085x1085.jpeg&quot;,&quot;bio&quot;:&quot;Building rooted intelligence &#129504; &#127909; &#127793;&quot;,&quot;profile_set_up_at&quot;:&quot;2023-11-17T15:21:07.496Z&quot;,&quot;reader_installed_at&quot;:&quot;2023-11-16T16:33:25.907Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:7512312,&quot;user_id&quot;:12091074,&quot;publication_id&quot;:7361555,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:true,&quot;publication&quot;:{&quot;id&quot;:7361555,&quot;name&quot;:&quot;Jagadeesh Rampam&quot;,&quot;subdomain&quot;:&quot;jagadeeshrampam&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Techie, explorer and photographer &quot;,&quot;logo_url&quot;:null,&quot;author_id&quot;:12091074,&quot;primary_user_id&quot;:12091074,&quot;theme_var_background_pop&quot;:&quot;#FF6719&quot;,&quot;created_at&quot;:&quot;2025-12-23T11:09:54.434Z&quot;,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Jagadeesh Rampam&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false,&quot;logo_url_wide&quot;:null}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;status&quot;:{&quot;bestsellerTier&quot;:null,&quot;subscriberTier&quot;:1,&quot;leaderboard&quot;:null,&quot;vip&quot;:false,&quot;badge&quot;:{&quot;type&quot;:&quot;subscriber&quot;,&quot;tier&quot;:1,&quot;accent_colors&quot;:null},&quot;paidPublicationIds&quot;:[10845],&quot;subscriber&quot;:null}}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;,&quot;source&quot;:null}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://jagadeeshrampam.substack.com/p/from-diagnosing-ai-debt-to-durable?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><span></span><span class="embedded-post-publication-name">Jagadeesh Rampam</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">From diagnosing AI debt to durable fixes (Part-3)</div></div><div class="embedded-post-body">This is Part 3 of the series on getting the best from Claude code. Part 1 on Why you should chose Haiku as Default model and escalate if needed; Part 2 introduced three practical practices &#8212; repo/component Claude.md files, prompt caching, and context engineering&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">8 months ago &#183; Jagadeesh Rampam</div></a></div><p>It behaves like technical debt in one critical way: it is invisible when it is forming, and expensive when you finally notice it. Unlike technical debt, it has an <strong>immediate dollar cost</strong> that compounds within the same session.</p><p>Here is the mechanics:</p><pre><code>Turn 1:   Opus reads inference_config.yaml    &#8594; context: 3k tokens
Turn 10:  Opus reads vlm_pipeline.py          &#8594; context: 40k tokens
Turn 30:  Opus reads cuda_kernels/, manifests  &#8594; context: 180k tokens
Turn 50+: Every API call sends 180k input     &#8594; paying full price
          even if your prompt is 50 words</code></pre><p>At Opus pricing (~$15/M input tokens), 200 subsequent turns &#215; 180k context = 36M input tokens = <strong>$540 in input alone</strong>, before a single output token is generated.</p><p>This is what those two sessions were doing. It was not that Opus was the wrong model. It was that the session carried everything it had ever read into every subsequent turn &#8212; and paid Opus prices for all of it, repeatedly.</p><p>Three forces compound context debt:</p><p><strong>Prompt cache expiry.</strong> Claude caches the static prefix of your context for 5 minutes (up to 1 hour for some configurations). In a session spanning hours or days, that cache expired repeatedly. Each expiry means paying full Opus input price for the entire accumulated context again. My 7-day session paid full price for a 400k+ context many times over.</p><p><strong>Compaction tax.</strong> When context compacts (the default fires at ~95% capacity), Claude writes a summary and prepends it to all future turns. In a very long session with multiple compactions, those summaries stack &#8212; each subsequent turn carries all of them as mandatory context.</p><p><strong>Speculative file reads.</strong> Opus tends to read files &#8220;to understand the broader context&#8221; before answering, even when the current task doesn&#8217;t require them. In an ML infrastructure repo, this means model configs, environment files, pipeline definitions, deployment scripts, and CUDA configurations all end up in context &#8212; and stay there.</p><div><hr></div><h2>4. The Constraint I Cannot Engineer Away</h2><p>Before presenting the framework, an honest acknowledgment of constraints.</p><p>My primary workload is <strong>VLM (Vision-Language Model) inferencing, infra-heavy automation, and ML optimisation pipelines</strong>. For this work:</p><ul><li><p><strong>Minimum viable context is ~300k tokens</strong>. Multiple model configs, inference scripts, pipeline definitions, and infrastructure manifests need to be simultaneously present for coherent cross-file reasoning.</p></li><li><p>Sonnet 4.6 has only recently gained a 1M context window (now GA, worth testing for execution phases). But adaptive thinking &#8212; structurally required for deep VLM reasoning &#8212; was absent from Sonnet until recently and is still maturing.</p></li><li><p>For the reasoning-heavy phases of this work, <strong>Opus 4.7 at 1M context is the correct model</strong>. This is a technical requirement, not a preference.</p></li></ul><p>The insight that changes everything: <strong>the model being correct does not mean the context footprint needs to be what it currently is.</strong></p><p>Opus 4.7 is the right reasoning engine. Sending it 400k tokens of raw source code when it only needs 40k tokens of structured summaries is waste. That is the distinction the framework targets.</p><div><hr></div><h2>5. Context Engineering: The Framework</h2><p>Context Engineering is the practice of deliberately managing what enters an AI session&#8217;s context window, when it enters, and in what form &#8212; to maximise reasoning quality per token rather than total tokens.</p><p>It has four mechanisms.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BIAH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BIAH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BIAH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BIAH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BIAH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BIAH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1682280,&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://jagadeeshrampam.substack.com/i/198514119?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.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_!BIAH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BIAH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BIAH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BIAH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F926e27c3-ae8d-4942-bbfb-331d860110fc_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h3>Mechanism 1: Pre-Summarisation (Haiku as Reader)</h3><p>The default pattern:</p><pre><code>Opus opens session
Opus reads 30 files to orient itself
All 30 files sit in context for the rest of the session
Cost: 150k input tokens &#215; every subsequent turn</code></pre><p>The engineered pattern:</p><pre><code>Before session opens:
  @ml-context-loader reads all 30 files (Haiku, separate context)
  Returns: 12k token structured dependency map

Opus main session receives:
  The 12k map, not the 150k raw files
  Opus never directly holds the source files
Cost: 12k input tokens &#215; every subsequent turn</code></pre><p>The work output is identical. The context footprint is ~12x smaller.</p><p><strong>Subagent configuration</strong> (<code>~/.claude/agents/ml-context-loader.md</code>):</p><pre><code>---
name: ml-context-loader
description: Pre-read ML pipeline files, model configs, inference scripts,
  and VLM configurations before complex optimisation work. Returns a
  structured dependency map for the main session. Invoke this BEFORE
  starting any ML or infra work in the main session.
model: haiku
tools: Read, Grep, Glob
---
You read ML infrastructure files and produce a structured summary covering:

1. Model architecture and config paths
2. Inference pipeline entry points and key functions
3. CUDA/GPU configuration and memory constraints
4. Cross-file dependencies relevant to the stated task
5. Files that need to change to accomplish the goal

Return a structured map. Do not return raw file contents.
Maximum output: 15k tokens. Be precise and omit irrelevant files.</code></pre><p><strong>Paired subagent for infrastructure</strong> (<code>~/.claude/agents/infra-scanner.md</code>):</p><pre><code>---
name: infra-scanner
description: Scan infrastructure configs, Terraform files, CI/CD pipelines,
  deployment manifests, and environment configs before optimisation work.
  Returns dependency map and change surface for the stated task.
model: haiku
tools: Read, Grep, Glob, Bash
---
Read infra files and return:
- Resource dependencies and environment configs
- Critical paths that affect the stated task
- Files that need to change
- Current state of relevant resources

Compact output only. Omit files irrelevant to the task.</code></pre><div><hr></div><h3>Mechanism 2: Targeted Loading via CLAUDE.md</h3><p>Even with pre-summarisation, Opus will add raw files to context during execution if not explicitly instructed otherwise. CLAUDE.md is the right place to install session-level context discipline.</p><p><strong>Project-level </strong><code>.claude/CLAUDE.md</code><strong> additions:</strong></p><pre><code>## Context Discipline

Before reading any file, state why it is needed for the current task.
Never read files speculatively to "understand the broader context."

Use @ml-context-loader before starting any ML or infra work.
Use @infra-scanner before starting any infrastructure work.
Use @explorer for any file discovery or codebase search.

If a file has been summarised by a subagent this session, 
use that summary rather than re-reading the raw file.

Maximum 5 files in direct context at any point during implementation.
For architecture decisions, request a structured summary first.

When asked to fix a bug, read only the file containing the bug
and its direct imports. Do not read the broader codebase unless
the fix requires understanding something not in those files.</code></pre><p>This changes Opus&#8217;s default behaviour from breadth-first file reading to targeted loading. In practice, this alone reduces speculative reads by 50&#8211;60% in long sessions.</p><div><hr></div><h3>Mechanism 3: Session Chunking by Reasoning Type</h3><p>The most expensive sessions &#8212; the two that consumed 50.9% of total costs &#8212; mixed two fundamentally different cognitive modes in a single long-running context:</p><ul><li><p><strong>Reasoning mode</strong>: Architecture decisions, bottleneck analysis, choosing optimisation strategies. Needs Opus depth. Short turns, modest context.</p></li><li><p><strong>Execution mode</strong>: Implementing the decided approach across many files. Needs large context. Lighter per-turn reasoning.</p></li></ul><p>When mixed, the session context grows to serve both needs simultaneously &#8212; and every turn pays the full cost of the combined footprint.</p><p><strong>Separated:</strong></p><pre><code># Session 1: Architecture planning
# Opus, focused context (summary only), ~15&#8211;20 turns
claude --model opus
# Prompt: "Given this summary [paste ml-context-loader output],
#   design the memory optimisation strategy for the VLM dataloader.
#   Output a structured implementation plan."
# &#8594; Session ends with a plan document. Context: ~30k tokens throughout.

# Session 2: Implementation
# Sonnet 4.6 at 1M (or Opus if VLM-specific reasoning needed)
# Longer, but following a decided plan &#8212; execution, not discovery
claude --model sonnet
# Prompt: "Implement this plan [paste plan].
#   Start with [specific file]. Read only the files listed in the plan."
# &#8594; Context grows with implementation files, but no re-discovery overhead.
</code></pre><p>The Opus session stays short because it worked from a summary, not raw files. The implementation session can run on Sonnet 4.6 at 1M context if the per-turn reasoning does not require Opus depth &#8212; which it often does not, once the architecture decision is made.</p><p><strong>The practical test for session split:</strong> If your current turn is <em>deciding something</em>, you are in reasoning mode. If your current turn is <em>doing something already decided</em>, you are in execution mode. Different sessions.</p><div><hr></div><h3>Mechanism 4: Cache Warming on Re-entry</h3><p>The single most expensive moment in a long session is returning after a break.</p><p>Prompt cache TTL is 5 minutes by default for most Claude Code request types (up to 1 hour in some configurations). When you step away for 30 minutes and return to a 300k-token context, the first turn back pays full Opus input price for all 300k tokens. If your session had 20 such re-entries across a workday, you paid for that 300k context twenty times.</p><p><strong>Before taking any break longer than a few minutes:</strong></p><pre><code>/compact</code></pre><p>This forces a clean compaction summary before the cache goes cold. The next turn back pays for a 5&#8211;10k summary re-warm, not a 300k context re-warm.</p><p><strong>Prevent the problem structurally</strong> by setting aggressive autocompaction:</p><p>In <code>.claude/settings.json</code>:</p><pre><code>{
  "env": {
    "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "60"
  }
}</code></pre><p>Compacting at 60% context capacity means the session never accumulates a context large enough to be expensive to re-warm. The compaction summary costs a few thousand tokens once. The alternative is paying full input price for a massive context every time the cache expires.</p><div><hr></div><h2>6. The Escalation Model</h2><p>With context engineering in place, the tier routing becomes:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kf33!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kf33!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.png 424w, https://substackcdn.com/image/fetch/$s_!kf33!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.png 848w, https://substackcdn.com/image/fetch/$s_!kf33!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.png 1272w, https://substackcdn.com/image/fetch/$s_!kf33!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kf33!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.png" width="1456" height="801" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/edcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:801,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1388322,&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://jagadeeshrampam.substack.com/i/198514119?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.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_!kf33!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.png 424w, https://substackcdn.com/image/fetch/$s_!kf33!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.png 848w, https://substackcdn.com/image/fetch/$s_!kf33!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.png 1272w, https://substackcdn.com/image/fetch/$s_!kf33!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcd0a13-7a1f-4148-98ec-f2ee9babb65a_1691x930.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>The key principle:</strong> Tier selection is determined by reasoning depth required per turn, not by task complexity overall. A complex ML task still has Haiku turns (reading files), Sonnet turns (writing implementations), and Opus turns (designing the approach). The same task should not require every turn to be Opus.</p><p><strong>Environment defaults</strong> that enforce this without manual switching:</p><pre><code># In ~/.zshrc or ~/.bashrc

# Subagents default to Sonnet, not parent model
export CLAUDE_CODE_SUBAGENT_MODEL="claude-sonnet-4-6"

# Haiku slot pinned explicitly
export ANTHROPIC_DEFAULT_HAIKU_MODEL="claude-haiku-4-5-20251001"</code></pre><div><hr></div><h2>7. Complete Subagent Stack</h2><p>For teams adopting this framework, the full subagent configuration:</p><p><code>~/.claude/agents/explorer.md</code> &#8212; Universal read-only search</p><pre><code>---
name: explorer
description: Search files, grep for symbols, read code structure, find
  usages, locate definitions. Use for any read-only investigation
  before editing. Never use for file modification.
model: haiku
tools: Read, Grep, Glob, Bash
---
You are a fast read-only code explorer. Search thoroughly and return
a concise structured summary. Never modify files. Optimise for finding
the minimum set of files relevant to the stated question.</code></pre><p><code>~/.claude/agents/git-helper.md</code> &#8212; Repository operations</p><pre><code>---
name: git-helper
description: Handle git commits, branch management, README updates,
  changelog entries, and documentation formatting. Use for all
  repository hygiene tasks.
model: haiku
tools: Bash, Read, Write
---
You handle git operations and documentation updates efficiently.
Use conventional commits format. Commit messages: type(scope): description.</code></pre><p><code>~/.claude/agents/code-writer.md</code> &#8212; Standard implementation</p><pre><code>---
name: code-writer
description: Implement features, write new functions, refactor existing
  code, add tests. Use for code generation and editing tasks that
  do not require architectural reasoning.
model: sonnet
tools: Read, Write, Edit, Bash, Glob, Grep
---
You are a focused implementation engineer. Read the minimum required
files before editing. Make one logical change per invocation.
Follow the plan provided; do not redesign unless asked.</code></pre><p><code>~/.claude/agents/ml-context-loader.md</code> &#8212; ML pre-summarisation <em>(See Mechanism 1 above)</em></p><p><code>~/.claude/agents/infra-scanner.md</code> &#8212; Infrastructure pre-summarisation <em>(See Mechanism 1 above)</em></p><p><code>~/.claude/agents/architect.md</code> &#8212; High-stakes reasoning only</p><pre><code>---
name: architect
description: Design system architecture, resolve complex multi-file bugs,
  make technology decisions, plan major refactors requiring cross-system
  understanding. Only invoke when deep reasoning is genuinely required.
  Receives summaries, not raw files.
model: opus
tools: Read, Grep, Glob
---
You make high-level decisions from structured summaries.
Think deeply before proposing changes.
Output a structured plan that code-writer can execute step by step.
Request specific raw files only when the summary is insufficient.</code></pre><div><hr></div><h2>8. Before and After: The Numbers</h2><p>Based on actual session data from this audit:</p><p><strong>The two expensive sessions ($625.72 combined API equivalent):</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ElK9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ElK9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.png 424w, https://substackcdn.com/image/fetch/$s_!ElK9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.png 848w, https://substackcdn.com/image/fetch/$s_!ElK9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.png 1272w, https://substackcdn.com/image/fetch/$s_!ElK9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ElK9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.png" width="1456" height="792" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:792,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1012020,&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://jagadeeshrampam.substack.com/i/198514119?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.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_!ElK9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.png 424w, https://substackcdn.com/image/fetch/$s_!ElK9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.png 848w, https://substackcdn.com/image/fetch/$s_!ElK9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.png 1272w, https://substackcdn.com/image/fetch/$s_!ElK9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ba8ec3-4625-4c53-a194-a62d1a3465bf_1700x925.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Output tokens are unchanged because the actual work product &#8212; the code written, the analysis produced &#8212; is identical. The saving is entirely in the context overhead that was being sent to the Opus API on every turn without contributing to reasoning quality.</p><p><strong>Across all sessions:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jxSv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jxSv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!jxSv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!jxSv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!jxSv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jxSv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1185778,&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://jagadeeshrampam.substack.com/i/198514119?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.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_!jxSv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!jxSv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!jxSv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!jxSv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05baa4d-c6ef-4ab7-a67f-46f822d25a9e_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>9. What Is Still Missing (Community Ask)</h2><p>This framework works within current Claude Code capabilities, but several gaps remain that limit how far it can go without manual configuration:</p><p><strong><a href="https://github.com/anthropics/claude-code/issues/44976">GitHub #44976 &#8212; Auto model routing by task type</a>.</strong> Currently, there is no native content-aware router in the main session. The routing that exists (Explore &#8594; Haiku) operates at the subagent dispatch boundary only. Automatic routing based on turn type &#8212; planning turns to Opus, execution turns to Sonnet &#8212; requires manual setup or explicit model switching. This feature request, if shipped, would make context engineering automatic rather than configured.</p><p><strong><a href="https://github.com/anthropics/claude-code/issues/43869">GitHub #43869 &#8212; Subagent model routing bugs</a>.</strong> On some Max plan configurations, subagents silently run on the parent session&#8217;s model despite explicit per-agent configuration. If your Haiku-configured subagents appear to cost Opus rates, this ticket is the reference. Check <code>env | grep CLAUDE_CODE_SUBAGENT_MODEL</code> and verify Haiku is actually firing.</p><p><strong>JSONL token counts are unreliable.</strong> The <code>ccusage</code> tool reads from JSONL files where input tokens are undercounted by 100&#8211;174x due to a streaming placeholder issue. For accurate token accounting, use <code>/cost</code> inside Claude Code (reads from the statusbar, which is accurate) and treat <code>ccusage</code> cost estimates as relative comparisons only.</p><p><strong>Sonnet 4.6 at 1M + adaptive thinking.</strong> Both are now GA but recently so. For workloads requiring 300k+ context but not frontier VLM reasoning, Sonnet 4.6 at 1M is worth testing as a drop-in replacement for Opus in execution sessions. One session test against a known task will answer whether the quality holds for your specific workload.</p><div><hr></div><h2>10. Best Practices Summary</h2><p><strong>Before starting any ML or infra session:</strong></p><ul><li><p>Run <code>@ml-context-loader</code> or <code>@infra-scanner</code> first</p></li><li><p>Start with the plan document from a prior architecture session, not a blank slate</p></li><li><p>Launch on Sonnet unless you know the first turn needs Opus-depth reasoning</p></li></ul><p><strong>During a session:</strong></p><ul><li><p><code>/compact</code> before any break longer than 5 minutes</p></li><li><p>Never read files speculatively &#8212; enforce this in CLAUDE.md</p></li><li><p>Split sessions when you shift from designing to implementing</p></li></ul><p><strong>For VLM and large-context ML work specifically:</strong></p><ul><li><p>Opus 4.7 at 1M is still the correct model for reasoning-heavy phases</p></li><li><p>The saving is in context footprint, not model choice</p></li><li><p>Pre-summarise with Haiku; Opus only sees the structured output</p></li></ul><p><strong>On model selection:</strong></p><ul><li><p>Default: Sonnet 4.6 (set <code>CLAUDE_CODE_SUBAGENT_MODEL="claude-sonnet-4-6"</code>)</p></li><li><p>Start sessions with <code>claude --model sonnet</code> unless the first task earns Opus</p></li><li><p>Use <code>opusplan</code> for sessions that need Opus for planning and Sonnet for execution</p></li></ul><p><strong>On measuring progress:</strong></p><ul><li><p>Use <code>/cost</code> for accurate token and model-split data</p></li><li><p>Use <code>ccusage session --breakdown</code> to track model mix per session over time</p></li><li><p>Watch cost-per-million-tokens ratio: $0.20/M = healthy Haiku/cache mix, $1.00+/M = context debt accumulating</p></li></ul><div><hr></div><h2>Closing Thought</h2><p>The observation that started this &#8212; Haiku 4.5 being spawned during an Opus 4.7 session &#8212; turned out to be Anthropic&#8217;s own answer to the problem I had been creating. The built-in subagent architecture already encodes the right instinct: read cheap, reason expensive, never conflate the two.</p><p>Context Debt is what happens when that separation breaks down at the session level. Context Engineering is the practice of maintaining it deliberately.</p><p>The framework is not about using cheaper models. It is about using the right model for each cognitive operation &#8212; and never making the expensive model carry the weight of the cheap one&#8217;s job.</p><div class="pullquote"><p><em>Data sourced from personal Claude Code usage: 33 sessions, 22M tokens, May 2026 audit.</em> <em>All </em><code>ccusage</code><em> costs are API-equivalent estimates; actual charges reflect flat Max subscription pricing.</em> <em>GitHub issues referenced: <a href="https://github.com/anthropics/claude-code/issues/43869">#43869</a>, <a href="https://github.com/anthropics/claude-code/issues/44976">#44976</a>, <a href="https://github.com/anthropics/claude-code/issues/10993">#10993</a>, <a href="https://github.com/anthropics/claude-code/issues/43083">#43083</a>.</em></p></div><p><strong>Related posts:</strong></p><ul><li><p><a href="https://jagadeeshrampam.substack.com/p/the-hidden-runtime-failure-behind">The Hidden Runtime Failure Behind Claude&#8217;s Recent Regression</a></p></li><li><p><a href="https://jagadeeshrampam.substack.com/p/when-adaptive-thinking-goes-off-the">When Adaptive Thinking Goes Off the Rails</a></p></li><li><p><a href="https://substack.com/home/post/p-197172333">Sonnet Becomes My New Benchmark</a></p></li><li><p><a href="https://substack.com/home/post/p-183758575">Why you should chose Haiku as Default model and escalate if needed</a></p></li><li><p><a href="https://substack.com/home/post/p-193306186">Building with Opus 4.6</a></p></li></ul><p><strong>Additional references</strong>:</p><ul><li><p><a href="https://github.com/anthropics/claude-code/issues/27665?utm_source=chatgpt.com">GitHub #27665 &#8212; Intelligent model routing / 93.8% Opus usage issue</a></p></li><li><p><a href="https://github.com/anthropics/claude-code/issues/43326?utm_source=chatgpt.com">GitHub #43326 &#8212; Auto-select model and effort level based on task complexity</a></p></li><li><p><a href="https://github.com/anthropics/claude-code/issues/44077?utm_source=chatgpt.com">GitHub #44077 &#8212; Skill model field not propagated to Agent sub-invocations</a></p></li><li><p><a href="https://github.com/anthropics/claude-code/issues/45228?utm_source=chatgpt.com">GitHub #45228 &#8212; SendMessage ignores model specified at Agent creation</a></p></li><li><p><a href="https://github.com/anthropics/claude-code/issues/50574?utm_source=chatgpt.com">GitHub #50574 &#8212; Auto model switch</a></p></li></ul><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[From Score Engine to Rule Engine: Why I Rebuilt the Decision Layer]]></title><description><![CDATA[I did not set out to replace a scoring engine with a rule engine.]]></description><link>https://blog.phagyul.ai/p/from-score-engine-to-rule-engine</link><guid isPermaLink="false">https://blog.phagyul.ai/p/from-score-engine-to-rule-engine</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Thu, 14 May 2026 11:27:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UKjF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UKjF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UKjF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!UKjF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!UKjF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!UKjF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UKjF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1399582,&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://jagadeeshrampam.substack.com/i/197643272?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.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_!UKjF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!UKjF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!UKjF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!UKjF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5df5ef7-0eb5-4b90-88c2-f0f4439a82d6_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I did not set out to replace a scoring engine with a rule engine. I set out to make the system cheaper, easier to explain, and less fragile as I was not keen on moving to g5.xlarge or g6.xlarge due to prompt sizes increased and would be lot of churn in terms of architectural and infra changes, comes with re testing every functionality and the increase in the costs both the dev costs as well as instances cost even more if non-availability of spot and on-demand, currently using 75/25 for spot and OD for g4.mdn.xlarge (and 2xlarge).</p><p>What I eventually learned was that the original design had an architectural flaw: it asked a single opaque model score to do too many jobs at once. It had to decide whether an image was technically valid, whether it was worth sending to the expensive VLM path, whether it should be accepted or rejected, and how to justify that decision later. That worked until it did not. So I split the pipeline into two deterministic layers: <strong>a Tier-0 technical validator before the model, and a rule engine after the model. That change dropped cost, improved explainability, and made policy iteration much faster.</strong></p><h2>The system I started with</h2><p>Before Parjanya v2.0 architecture v5.3, the pipeline was basically this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QEyd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QEyd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!QEyd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!QEyd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!QEyd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QEyd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1343778,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jagadeeshrampam.substack.com/i/197643272?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.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_!QEyd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!QEyd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!QEyd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!QEyd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e9cd82b-803e-459b-8566-5080243de900_1536x1024.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p>The problem was not that the model was &#8220;bad.&#8221; The problem was that I had turned a rich decision into a number. Two images with the same score could be fundamentally different: one might be a sharp wildlife shot with a minor distortion, while another might be a soft-focus landscape with no clear subject. The number hid the nuance. Prompt changes also shifted the score distribution, which meant calibration drift could silently change the policy. And when someone asked why an image was rejected, a floating-point score was not a useful answer.</p></blockquote><h2>What I changed</h2><p>I made two structural changes.</p><div class="pullquote"><p>First, I added a <strong>Tier-0 technical validator</strong>. This is a deterministic gate that runs before any expensive VLM work. It checks whether the image can be decoded, whether the dimensions are suspicious, whether the frame is blank, whether exposure is blown or crushed, and whether the image is a duplicate using multi-hash dedup. It runs on a small ARM64 Lambda, finishes in sub-second time, and costs about $0.0000002 per image.</p><p>Second, I changed the VLM output contract. Instead of asking the VLM for a single quality score, I asked it to emit <strong>structured cues</strong>: subject label, subject dominance, composition signals, distortion types, and prose. Then I fed those cues into a deterministic <strong>recuration rule engine</strong> that makes the final accept/review/reject decision and writes out a human-readable reason.</p></div><h2>How the new decision layer works</h2><p>The rule engine is deliberately boring in the best possible way. It is not trying to be clever. It is trying to be consistent.</p><p>Here is the decision logic in plain language:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iX8O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iX8O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!iX8O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!iX8O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!iX8O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iX8O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1460630,&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://jagadeeshrampam.substack.com/i/197643272?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.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_!iX8O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!iX8O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!iX8O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!iX8O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6fbb22-ff4e-48c3-bc1c-dd2491e8a673_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Every verdict also gets a version tag and a reason string, so I can audit what happened later. That is a huge shift from the old system, where the final answer was essentially &#8220;the score was 0.41.&#8221;</p><h2>Why this mattered operationally</h2><p>The first benefit was cost.</p><p>Here is the cost comparison I care about most:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H3pU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H3pU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.png 424w, https://substackcdn.com/image/fetch/$s_!H3pU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.png 848w, https://substackcdn.com/image/fetch/$s_!H3pU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.png 1272w, https://substackcdn.com/image/fetch/$s_!H3pU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H3pU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.png" width="1456" height="867" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:867,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1251545,&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://jagadeeshrampam.substack.com/i/197643272?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.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_!H3pU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.png 424w, https://substackcdn.com/image/fetch/$s_!H3pU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.png 848w, https://substackcdn.com/image/fetch/$s_!H3pU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.png 1272w, https://substackcdn.com/image/fetch/$s_!H3pU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cda5a4b-d9a4-4c99-88dc-9557566f317e_1625x968.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>On my typical tenant workload, GPU spend still dominates the bill, so every image I keep out of the GPU queue is real leverage. I also found one non-obvious cost: at single-tenant scale, about half of the per-drain cost was NAT Gateway egress, not GPU. In the measured v25 drain, NAT cost was actually larger than GPU cost. That means the rule engine improved the decision layer, but infrastructure tuning still matters separately.</p><p>The second benefit was iteration speed.</p><p>I moved the rule engine through several versions in days, not weeks. The workflow became: edit the rule file, test it on canaries, inspect the reasons, then run the full re-curation if it looked good. No GPU redeploy. No prompt-engine rebuild. No waiting for model infrastructure to churn. In practice, that made policy iteration feel like software engineering again instead of model ops. The v25 drain took 7 hours 41 minutes end to end, but the rule-engine pass over 3,427 rows took less than a minute.</p><p>The third benefit was explainability.</p><p>I finally had a decision layer that could say things like:</p><ul><li><p>&#8220;reject &#8212; subject-critical motion blur&#8221;</p></li><li><p>&#8220;reject &#8212; 3 slight defects stack&#8221;</p></li><li><p>&#8220;review &#8212; weak subject dominance; technically clean&#8221;</p></li></ul><p>That may sound small, but it changes everything when a user asks why something was rejected. A reason string is much more useful than a numeric score.</p><p>The fourth benefit was robustness to prompt drift.</p><p>When the IQA prompt changed from v16 to v17, the score distribution shifted. Under the old design, that meant threshold recalibration and potential policy drift. Under the new design, the rule engine sat on top of structured fields whose meaning stayed stable across prompt versions. The model could change in ways that improved extraction without forcing me to rethink the whole decision layer.</p><h2>The measured validation run</h2><p>The clearest proof came from the v25 rescore.</p><p>I had 2,426 images drained through the pipeline, and then 3,427 rows reprocessed by the rule engine. This was not a synthetic benchmark. It was the first large enough live run to give me defensible numbers.</p><h3>Pipeline results</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zu3n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zu3n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!zu3n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!zu3n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!zu3n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zu3n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1216621,&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://jagadeeshrampam.substack.com/i/197643272?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.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_!zu3n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!zu3n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!zu3n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!zu3n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F341c914f-1513-4fd5-8e17-1bcce8dc2318_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>What stood out to me was not just that the run completed, but that it completed cleanly. There was no message loss, the DLQ stayed at zero, and the autoscaler shut down correctly after the queue emptied.</p><h3>Rule-engine results</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d9ne!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d9ne!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.png 424w, https://substackcdn.com/image/fetch/$s_!d9ne!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.png 848w, https://substackcdn.com/image/fetch/$s_!d9ne!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!d9ne!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d9ne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.png" width="1448" height="1086" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1086,&quot;width&quot;:1448,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1007870,&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://jagadeeshrampam.substack.com/i/197643272?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.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_!d9ne!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.png 424w, https://substackcdn.com/image/fetch/$s_!d9ne!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.png 848w, https://substackcdn.com/image/fetch/$s_!d9ne!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!d9ne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5509e318-0d61-4cfe-b754-5afc7f625327_1448x1086.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The most interesting transitions were:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x8O1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x8O1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!x8O1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!x8O1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!x8O1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x8O1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1145924,&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://jagadeeshrampam.substack.com/i/197643272?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.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_!x8O1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!x8O1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!x8O1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!x8O1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98da88-ea1c-45ff-a7bd-0282b1000bcb_1774x887.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That last part mattered to me because it showed the rule engine was not trying to force certainty where none existed. It preserved uncertainty instead of masking it.</p><h2>Why this architecture works</h2><p>This pattern is not new in spirit. It is a cascade: a cheap stage rejects obvious failures, and the expensive stage only handles what survives. That reduces inference cost and keeps the scarce GPU path for cases that actually need it. The broader literature supports the same idea, especially for VLM and moderation workloads.</p><p>For me, the more important pattern was <strong>extract-then-decide</strong>. The VLM is the extractor. The rule engine is the decider. Once I separated those roles, the system became easier to reason about. The model could be probabilistic and flexible. The policy could remain deterministic and auditable.</p><h2>What I watch for now</h2><p>I did not trade away all the hard problems. I just moved them into better places.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aPTQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aPTQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!aPTQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!aPTQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!aPTQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aPTQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1380029,&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://jagadeeshrampam.substack.com/i/197643272?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.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_!aPTQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!aPTQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!aPTQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!aPTQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a213593-5229-41f2-aa22-f7f116fdc1a9_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That last item is still open: infrastructure cost can easily dominate the apparent model cost, so I do not want to fool myself into thinking the architecture alone solved everything.</p><h2>What is next</h2><p>The next steps are pretty clear to me. Dedup is still shipped but not yet used as a hard gate in production. The rule engine will likely get a v5 cleanup once the remaining fallback paths are collapsed. And I want a dashboard that breaks out cost by Tier-0 reject reason, because it would be useful to know exactly how much pure margin I am saving when corrupt files, blank frames, and blown exposures are filtered early.</p><h2>The takeaway</h2><p>I did not move from &#8220;AI&#8221; to &#8220;rules.&#8221; I moved from one opaque score to a more honest pipeline.</p><p>Now the model extracts structure, the rule engine makes the decision, and the cheap gate keeps obvious failures away from the GPU. That gave me lower cost, faster iteration, and a system I can actually explain to another human without hand-waving. For a production image pipeline, that is the architecture I trust more.</p><p>One thing I appreciated only after moving to the rule engine was how much the <em>user experience</em> improved once the system stopped behaving like a black-box scorer.</p><p>Previously, the output was essentially a number hidden behind a threshold. After the re-curation architecture, every image started carrying an explainable pipeline trail: technical validation status, VLM enrichment state, structured distortion analysis, composition signals, subject analysis, and finally a deterministic curation verdict with explicit reasoning. The gallery stopped feeling like &#8220;an AI guessed a score&#8221; and started feeling like a traceable review system.</p><p>In the image below, for example, the pipeline clearly shows the two-stage flow: Tier-0 technical validation first, followed by VLM enrichment and structured analysis. The system identifies slight sharpness and focus issues, explains <em>where</em> they occur (&#8220;subject lacks critical sharpness on head and eye area&#8221;), records composition attributes like framing and depth layers, and still accepts the image because the final rule evaluation determined the defects were minor enough relative to subject structure and overall composition quality.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5zJq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5zJq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.png 424w, https://substackcdn.com/image/fetch/$s_!5zJq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.png 848w, https://substackcdn.com/image/fetch/$s_!5zJq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.png 1272w, https://substackcdn.com/image/fetch/$s_!5zJq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5zJq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.png" width="1434" height="3822" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3822,&quot;width&quot;:1434,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3241058,&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://jagadeeshrampam.substack.com/i/197643272?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.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_!5zJq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.png 424w, https://substackcdn.com/image/fetch/$s_!5zJq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.png 848w, https://substackcdn.com/image/fetch/$s_!5zJq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.png 1272w, https://substackcdn.com/image/fetch/$s_!5zJq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c779f3b-535c-409e-97f3-3de7b36ed534_1434x3822.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That distinction matters. Under the old scoring engine, this image could easily have landed near a threshold boundary and become another opaque <code>0.62</code> vs <code>0.58</code> decision. Under the new architecture, the reasoning is visible, deterministic, and debuggable.</p><p>The biggest realization for me was this: the rule engine did not make the system <em>less intelligent</em>. It made the intelligence easier to operationalize.</p><p>The VLM still does the hard perceptual work &#8212; understanding composition, defects, subject prominence, and scene semantics. But the final decision layer is no longer probabilistic glue hidden behind one floating-point number. It is now an auditable policy system built on top of structured perception.</p><p>That separation ended up becoming the real architectural shift.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Sonnet 4.6 Became My New Benchmark for Building an Infra-Heavy VLM Platform]]></title><description><![CDATA[A few months ago, I wrote about why I believed in a Haiku-first strategy: start with the cheapest and fastest model possible, then escalate only when the task genuinely becomes harder.]]></description><link>https://blog.phagyul.ai/p/sonnet-46-became-my-new-benchmark</link><guid isPermaLink="false">https://blog.phagyul.ai/p/sonnet-46-became-my-new-benchmark</guid><dc:creator><![CDATA[Phagyul AI Systems Pvt Ltd]]></dc:creator><pubDate>Mon, 11 May 2026 04:33:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!OkJ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OkJ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OkJ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!OkJ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!OkJ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!OkJ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OkJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1841548,&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://jagadeeshrampam.substack.com/i/197172333?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.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_!OkJ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!OkJ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!OkJ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!OkJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb255522-dac5-4f82-bedf-427ae147535f_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A few months ago, I wrote about why I believed in a <strong>Haiku-first strategy</strong>: start with the cheapest and fastest model possible, then escalate only when the task genuinely becomes harder. That idea still makes sense in principle.</p><p>But over the last few weeks, while working deeply on my <strong>VLM control plane / IQA platform</strong>, I realized something important:</p><p>The benchmark itself had changed. Probably, the models are sitting across 4.5, 4.6 and 4.7 versions and found it hard to compare (Haiku 4.5 vs Sonnet 4.6 vs Opus 4.7 1M), I meant, gap is widened!</p><p>For my current workload, <strong>Sonnet 4.6</strong> has become the model I now measure everything against.</p><p>Not because it is the smartest model Anthropic offers. Not because it is the cheapest. But because it currently sits at the most practical intersection of:</p><ul><li><p>reasoning quality</p></li><li><p>long-context reliability</p></li><li><p>infra-heavy debugging</p></li><li><p>ML-heavy orchestration</p></li><li><p>coding consistency</p></li><li><p>operational cost</p></li><li><p>and sustained throughput</p></li></ul><p>That combination matters a lot when you are building systems where the model is not simply &#8220;answering questions,&#8221; but continuously operating across orchestration, debugging, inferencing workflows, infrastructure decisions, and large-context reasoning.</p><h2>The original Haiku-first thesis still holds</h2><p>I still believe the core idea behind the earlier post was correct:</p><blockquote><p>Default to the cheapest model that can reliably complete the task.</p></blockquote><p>Anthropic&#8217;s pricing still makes that logic compelling.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7P9Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7P9Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!7P9Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!7P9Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!7P9Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7P9Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1191306,&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://jagadeeshrampam.substack.com/i/197172333?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.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_!7P9Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!7P9Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!7P9Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!7P9Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f73aeda-5d04-4521-8fa4-4dc387d79763_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>At scale, these economics matter enormously.</p><p>If you are running:</p><ul><li><p>agentic workflows</p></li><li><p>multi-step debugging</p></li><li><p>recursive orchestration</p></li><li><p>long-context analysis</p></li><li><p>or VLM-heavy pipelines</p></li></ul><p>&#8230;output-token costs become very real very quickly.</p><p>That is exactly why Haiku originally made so much sense.</p><h2>But my workload changed</h2><p>The problem is not that Haiku became &#8220;bad.&#8221; (also the gap across the models become evident due to version differences, Haiku is still at 4.5 with 200k context, whereas Sonnet and Opus at 4.6 and 4.7 with 1M Context)</p><p>The problem is that my workload evolved into something much more infra-heavy and ML-heavy.</p><p>The VLM control plane is no longer just lightweight orchestration or simple extraction work. The workflows now involve:</p><ul><li><p>larger context retention</p></li><li><p>deeper architectural reasoning</p></li><li><p>distributed infra debugging</p></li><li><p>inferencing orchestration</p></li><li><p>stateful workflows</p></li><li><p>code + infra + ML reasoning in the same session</p></li><li><p>long-running debugging loops</p></li><li><p>and increasingly large operational context</p></li></ul><p>This is where Sonnet 4.6 started to outperform Haiku dramatically in practical usefulness.</p><h2>Why Sonnet 4.6 became my benchmark</h2><p>Anthropic positions Sonnet 4.6 as the &#8220;best combination of intelligence, speed, and cost,&#8221; and honestly, that aligns closely with my own experience.</p><p>Sonnet 4.6 currently provides:</p><ul><li><p>1M-token context window</p></li><li><p>adaptive thinking</p></li><li><p>fast latency</p></li><li><p>significantly improved coding quality</p></li><li><p>stronger instruction following</p></li><li><p>much better long-context coherence</p></li></ul><p>Anthropic also mentioned that in Claude Code testing:</p><ul><li><p>users preferred Sonnet 4.6 over Sonnet 4.5 roughly 70% of the time</p></li><li><p>and even preferred it over Opus 4.5 in many workflows</p></li></ul><p>That honestly tracks with what I have seen.</p><p>Sonnet 4.6 feels much more stable in:</p><ul><li><p>sustained coding sessions</p></li><li><p>infra debugging</p></li><li><p>architectural iteration</p></li><li><p>and orchestration-heavy workflows</p></li></ul><p>without becoming economically painful the way Opus can become.</p><h2>Haiku 4.5: still useful, but no longer my default</h2><p>This is probably the most important nuance in the entire post.</p><p>Haiku 4.5 is still:</p><ul><li><p>extremely fast</p></li><li><p>extremely cheap</p></li><li><p>very capable for its price tier</p></li><li><p>excellent for parallelized execution</p></li><li><p>strong for extraction/tagging/routing</p></li><li><p>surprisingly good on coding benchmarks</p></li></ul><p>Anthropic reports:</p><ul><li><p>73.3% on SWE-bench Verified</p></li><li><p>40.21% / 41.75% on Terminal-Bench</p></li></ul><p>Those are genuinely strong results.</p><p>But benchmark scores alone do not determine operational usefulness.</p><p>In my own experience, Haiku 4.5 now feels degraded for my specific workload.</p><p>Not degraded universally.</p><p>Degraded for this class of infra-heavy, ML-heavy systems work.</p><p>What I started noticing:</p><ul><li><p>unnecessary follow-up questions</p></li><li><p>command thrashing locally</p></li><li><p>context drift during debugging</p></li><li><p>inefficient iteration loops</p></li><li><p>loss of architectural continuity</p></li><li><p>excessive operational churn</p></li></ul><p>Sometimes it felt like the model was spending more effort &#8220;doing activity&#8221; than actually advancing the task.</p><p>That was the turning point for me.</p><h2>Sonnet became the operational center of gravity</h2><p>So the strategy evolved.</p><p>I no longer think in terms of:</p><blockquote><p>&#8220;Haiku everywhere unless proven otherwise.&#8221;</p></blockquote><p>Now the stack looks more like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hvb8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hvb8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Hvb8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Hvb8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Hvb8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hvb8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1723654,&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://jagadeeshrampam.substack.com/i/197172333?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.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_!Hvb8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Hvb8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Hvb8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Hvb8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d2b0741-9b21-488d-bf34-c0b20da547f2_1536x1024.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This feels significantly more stable operationally.</p><h2>Where Opus still matters</h2><p>I still escalate aggressively to Opus for:</p><ul><li><p>architectural redesigns</p></li><li><p>distributed systems debugging</p></li><li><p>ML-heavy reasoning</p></li><li><p>difficult infra changes</p></li><li><p>large-context synthesis</p></li><li><p>high-stakes production decisions</p></li></ul><p>This is where the Opus models still separate themselves.</p><p>Anthropic&#8217;s published numbers are notable:</p><ul><li><p>Opus 4.6: 81.42% SWE-bench Verified</p></li><li><p>90.2% BigLaw Bench</p></li><li><p>strong long-context retrieval</p></li><li><p>better reasoning across hundreds of thousands of tokens</p></li></ul><p>Opus 4.7 improves further:</p><ul><li><p>13% improvement on a 93-task coding benchmark</p></li><li><p>solved 4 tasks neither Sonnet 4.6 nor Opus 4.6 could solve</p></li><li><p>3&#215; more production-task resolutions on Rakuten-SWE-Bench</p></li><li><p>21% fewer errors on OfficeQA Pro</p></li></ul><p>You can actually feel some of these improvements during long debugging sessions.</p><p>Especially:</p><ul><li><p>reduced context drift</p></li><li><p>better continuity</p></li><li><p>fewer reasoning collapses</p></li><li><p>stronger architectural consistency</p></li></ul><h2>Adaptive thinking changes the workflow significantly</h2><p>One under-discussed improvement is adaptive thinking.</p><p>Sonnet 4.6 supports it.<br>Opus 4.6 supports it.<br>Opus 4.7 uses it exclusively.</p><p>This matters because:</p><ul><li><p>the model dynamically allocates reasoning effort</p></li><li><p>easier tasks complete faster</p></li><li><p>harder tasks receive deeper reasoning automatically</p></li></ul><p>For infra-heavy workflows, this is a huge operational improvement.</p><p>Especially when the same session moves across:</p><ul><li><p>infra</p></li><li><p>application logic</p></li><li><p>orchestration</p></li><li><p>ML behavior</p></li><li><p>and debugging</p></li></ul><p>without explicit model switching every few minutes.</p><h2>Something interesting I noticed about Haiku switching automatically</h2><p>One thing I still need to investigate further:</p><p>I occasionally noticed Claude seemingly switching into Haiku behavior automatically during sessions.</p><p>I initially thought this happened only at the beginning of sessions, but after more usage I suspect it can happen mid-session as well.</p><p>Anthropic&#8217;s Claude Code docs actually support this possibility:</p><ul><li><p>model switching can happen dynamically</p></li><li><p>subagents can use Haiku automatically</p></li><li><p>planning/execution layers may use different models internally</p></li></ul><p>That would explain some of the behavior I observed:</p><ul><li><p>sudden increases in unnecessary questioning</p></li><li><p>lightweight command loops</p></li><li><p>simplified reasoning paths</p></li><li><p>or execution-style interactions appearing inside longer workflows</p></li></ul><p>I do not think this is inherently bad.<br>It actually makes sense architecturally.</p><p>But on infra-heavy workflows, it can sometimes become noticeable.</p><h2>The timing of this shift matters for me personally</h2><p>This transition is happening at an important moment.</p><p>I am currently preparing:</p><ul><li><p>dev + prod environment separation</p></li><li><p>launch readiness</p></li><li><p>infrastructure stabilization</p></li><li><p>ML inferencing orchestration</p></li><li><p>and final architectural refinement</p></li></ul><p>ahead of launch in roughly two weeks.</p><p>That timing matters because the recent Anthropic infrastructure and limit improvements are actually having a practical operational effect.</p><p>Anthropic recently:</p><ul><li><p>removed dedicated 1M-context rate limits for supported models</p></li><li><p>expanded higher-usage limits</p></li><li><p>improved capacity availability</p></li><li><p>and publicly discussed large-scale compute partnerships</p></li></ul><p>I do not want to get into commercial details.</p><p>But practically speaking:</p><ul><li><p>peak-hour friction has reduced significantly</p></li><li><p>longer debugging sessions feel more reliable</p></li><li><p>large-context sessions are more usable</p></li><li><p>and the additional headroom gives much more leverage for coding and debugging</p></li></ul><p>That matters a lot when your workflows involve:</p><ul><li><p>long-context infra debugging</p></li><li><p>VLM inferencing orchestration</p></li><li><p>architecture synthesis</p></li><li><p>and recursive engineering sessions</p></li></ul><h2>Bottom line</h2><p>My original Haiku-first idea still solid and would try working on enhancing further in future versions. (Plan is to leverage, multiple models across the frontier models, both models like Claude, codex and free versions like Gemma4, Qwen3.6 etc.)</p><p>But the center of gravity moved.</p><p>Today:</p><ul><li><p>Haiku 4.5 is my narrow execution layer</p></li><li><p>Sonnet 4.6 is my operational benchmark</p></li><li><p>Opus 4.6 is my deep reasoning escalation</p></li><li><p>and Opus 4.7 is the model I reserve for the hardest architectural and ML-heavy problems</p></li></ul><p>The real lesson is not:</p><blockquote><p>&#8220;Always use the smartest model.&#8221;</p></blockquote><p>And it is also not:</p><blockquote><p>&#8220;Always optimize for cost.&#8221;</p></blockquote><p>The real lesson is:</p><blockquote><p>The best model is the one that remains operationally useful under your actual workload.</p></blockquote><p>For my current stack, Sonnet 4.6 is now that benchmark.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TmO1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TmO1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!TmO1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!TmO1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!TmO1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TmO1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1699341,&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://jagadeeshrampam.substack.com/i/197172333?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.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_!TmO1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.png 424w, https://substackcdn.com/image/fetch/$s_!TmO1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.png 848w, https://substackcdn.com/image/fetch/$s_!TmO1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.png 1272w, https://substackcdn.com/image/fetch/$s_!TmO1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40acf8aa-fb4a-4298-b107-15b3508973f8_1774x887.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>References &amp; Further Reading</h2><h3>Anthropic Documentation &amp; Official Notes</h3><ol><li><p><a href="https://docs.anthropic.com/en/docs/about-claude/models?utm_source=chatgpt.com">Anthropic Claude Models Overview</a><br>Official model capabilities, context windows, adaptive thinking, latency tiers, and supported features for Haiku, Sonnet, and Opus.</p></li><li><p><a href="https://docs.anthropic.com/en/docs/about-claude/pricing?utm_source=chatgpt.com">Anthropic Pricing Documentation</a><br>Current pricing for Haiku 4.5, Sonnet 4.6, Opus 4.6, Opus 4.7, prompt caching, batch processing, and 1M-context usage.</p></li><li><p><a href="https://docs.anthropic.com/en/docs/claude-code/costs?utm_source=chatgpt.com">Claude Code &#8212; Costs &amp; Model Usage Patterns</a><br>Useful for understanding model switching, subagents, orchestration strategies, and practical guidance on when to use Haiku vs Sonnet vs Opus.</p></li></ol><h3>My Related Notes &amp; Blogs</h3><ol><li><p><a href="https://open.substack.com/pub/jagadeeshrampam/p/why-you-should-chose-haiku-as-default?r=775j6&amp;utm_medium=ios&amp;utm_source=chatgpt.com">Why You Should Choose Haiku as Default</a><br>My earlier thesis on why a Haiku-first strategy originally made sense economically and operationally.</p></li><li><p><a href="https://substack.com/@jagadeeshrampam/note/c-251941055?utm_source=chatgpt.com">Opus 4.7 &#8212; Initial Practical Observations</a><br>Early notes on context retention, hallucinations, workflow behavior, and operational observations while testing Opus 4.7.</p></li><li><p><a href="https://substack.com/@jagadeeshrampam?utm_source=chatgpt.com">Jagadeesh Rampam &#8212; Substack Archive</a><br>Broader writing on infra-heavy systems, AI engineering workflows, AWS architecture, ML systems, and long-context operational patterns.</p></li></ol><h3>Engineering &amp; Long-Context Best Practices</h3><ol><li><p><a href="https://platform.openai.com/docs/guides/prompt-engineering?utm_source=chatgpt.com">OpenAI &#8212; Prompt Engineering Best Practices</a><br>Strong reference for practical orchestration, structured prompting, decomposition, and reliability strategies across long workflows.</p></li><li><p><a href="https://aws.amazon.com/architecture/well-architected/?utm_source=chatgpt.com">AWS Well-Architected Framework</a><br>Essential reading for scalability, operational excellence, cost optimization, reliability, and architectural trade-offs in infra-heavy systems.</p></li><li><p><a href="https://sre.google/workbook/table-of-contents/?utm_source=chatgpt.com">Google SRE Workbook</a><br>One of the best operational references for debugging culture, monitoring, production reliability, incident management, and long-running system operations.</p></li></ol><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://parjanya.phagyul.ai/signup" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png" width="1456" height="189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://parjanya.phagyul.ai/signup&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mmQN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 424w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 848w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1272w, https://substackcdn.com/image/fetch/$s_!mmQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c1df74-81d2-4a18-a37c-147f89b13cc3_2015x261.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div>]]></content:encoded></item></channel></rss>