<?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[Breaking Change]]></title><description><![CDATA[writing about building through breaking change]]></description><link>https://www.breakingchange.blog</link><image><url>https://substackcdn.com/image/fetch/$s_!FZVU!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3185eefe-1cb5-42b9-ab41-99a0cf8916b6_1254x1254.png</url><title>Breaking Change</title><link>https://www.breakingchange.blog</link></image><generator>Substack</generator><lastBuildDate>Fri, 30 Oct 2026 14:52:17 GMT</lastBuildDate><atom:link href="https://www.breakingchange.blog/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Breaking Change]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[breakingchange@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[breakingchange@substack.com]]></itunes:email><itunes:name><![CDATA[Michelle Bu]]></itunes:name></itunes:owner><itunes:author><![CDATA[Michelle Bu]]></itunes:author><googleplay:owner><![CDATA[breakingchange@substack.com]]></googleplay:owner><googleplay:email><![CDATA[breakingchange@substack.com]]></googleplay:email><googleplay:author><![CDATA[Michelle Bu]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Shanghai travelogue]]></title><description><![CDATA[Where my agent ended up with nothing to do.]]></description><link>https://www.breakingchange.blog/p/shanghai-travelogue</link><guid isPermaLink="false">https://www.breakingchange.blog/p/shanghai-travelogue</guid><dc:creator><![CDATA[Michelle Bu]]></dc:creator><pubDate>Wed, 30 Sep 2026 14:47:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!z9JA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I traveled to Shanghai last week for our first ever Stripe Tour in China (more on Tour itself on LinkedIn soon!). It was my first visit to China since the pandemic, and it was surreal to witness the Shanghai that has emerged through multiple breaking changes: zero-covid policies, the ubiquity of the super apps, the housing collapse, electric vehicles, and now AI. The culture felt surprisingly familiar in many ways (people were direct, talkative, and showed care via excess), just in a completely different environment that everyone had quickly settled into.</p><div><hr></div><p>The week before my trip, Muse (Meta&#8217;s personal AI agent) launched. I spent my minutes between meetings testing its limits &#8211; paying Oakland city taxes, challenging it to find the perfect cat and/or baby toy (trick question &#8211; it&#8217;s a cardboard box or a sheet of paper), and researching socks for my trip (does no one else get sock-related packing anxiety?). In true 2026 AI fashion, I felt the AGI in the happiest paths (and raved to all my friends) and felt the slop in the saddest paths (and ranted to all my friends).</p><p>I was excited for Muse to help me navigate China, but it consistently got stuck. The agent buddies I&#8217;d come to rely on could not penetrate a closed ecosystem of super apps. In one instance, I&#8217;d asked Muse to get me special exhibition tickets for a new exhibit at the Museum of Art Pudong (<em><a href="https://www.instagram.com/le19m_at_large/">la Galerie du 19M</a></em>), but it got stuck when WeChat was required to continue.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hELy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hELy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.png 424w, https://substackcdn.com/image/fetch/$s_!hELy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.png 848w, https://substackcdn.com/image/fetch/$s_!hELy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.png 1272w, https://substackcdn.com/image/fetch/$s_!hELy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hELy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.png" width="273" height="330.09490333919155" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:688,&quot;width&quot;:569,&quot;resizeWidth&quot;:273,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hELy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.png 424w, https://substackcdn.com/image/fetch/$s_!hELy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.png 848w, https://substackcdn.com/image/fetch/$s_!hELy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.png 1272w, https://substackcdn.com/image/fetch/$s_!hELy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd6eaff-1a05-48f1-b261-0cbf61ce7774_569x688.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>China leap-frogged past the era of websites straight into <strong>authenticated mobile experiences</strong>. The mobile implications are relatively well-known to folks at this point (though still consistently surprising to witness &#8211; wdym our beautiful Stripe websites aren&#8217;t valued or even <em>looked at</em> in China? &#128546;). But with AI, I felt the downstream impact of everything requiring <em>authentication</em>. Authentication meant there was no way for ChatGPT to search-tool its way to the top dishes for me on Dianping, and no way for Muse&#8217;s computer use capabilities to book a reservation on WeChat.</p><p>Traveling in Shanghai in 2026 is a tale of forced adaptation. I <em>had</em> to download Alipay to pay and to get the best deals. Shops would not accept my crisp 2019 paper RMB. I <em>had</em> to use Didi. Taxis would not stop for my flailing arm. I <em>had</em> to download and learn how to use WeChat&#8217;s partially localized interface not just to chat, but also to sign up for the 19M tickets.</p><p>However, once I downloaded every super app and learned a few new Chinese terms, the experience was so seamless that I forgot all about my AI friends. Every restaurant had its most popular dishes listed. Local recommendations via collective intelligence felt smarter and faster to access than recommendations via artificial intelligence. Humans at hotels and restaurants responded ~instantly to my translated English requests on WeChat. Cars in any shape or size (though almost exclusively EVs) came in under five minutes via whatever super app I currently had open. I could even pay a little extra to incentivize cars to take my request. The super apps had thought of everything, and I stopped finding things I wanted to delegate to AI.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z9JA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z9JA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png 424w, https://substackcdn.com/image/fetch/$s_!z9JA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png 848w, https://substackcdn.com/image/fetch/$s_!z9JA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png 1272w, https://substackcdn.com/image/fetch/$s_!z9JA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z9JA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png" width="1456" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1630948,&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://www.breakingchange.blog/i/218096480?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.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_!z9JA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png 424w, https://substackcdn.com/image/fetch/$s_!z9JA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png 848w, https://substackcdn.com/image/fetch/$s_!z9JA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.png 1272w, https://substackcdn.com/image/fetch/$s_!z9JA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F153670af-fbbf-497d-9363-7fd0ecd0ea5d_1733x907.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><figcaption class="image-caption"><em>[AI generated] An agent doesn&#8217;t know how to navigate these apps.</em></figcaption></figure></div><p>Even the 19M tickets made no sense for an agent to retrieve on my behalf because <em>there was simply no friction to reduce</em>. I scanned a WeChat QR code to buy a ticket, scanned another code upon entry to queue for the exhibition, then they scanned <em>my</em> code in exchange for a physical bracelet for seamless admittance into the exhibit. Each step was obvious and fast enough that AI would not have helped.</p><p>In all of these cases there was no straying from the hyper-efficient golden path. The path was so well-paved I never needed an agent, but it only went where the super apps had already decided to go. There was no way to blaze a new trail, not even with our most capable personal agents.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00fe6223-0ddc-436a-8d93-b151a841a2d6_1320x2868.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a18d88f-b957-42dc-850d-8023c30fb9a6_1320x2868.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/63567713-d54d-4de9-a1e3-017245c51e78_1320x2868.png&quot;}],&quot;caption&quot;:&quot;Dianping in WeChat, via a WeChat message; Call a car straight from Dianping; Every car you could possibly call can be called at the same time (via Dianping, all within WeChat)!&quot;,&quot;alt&quot;:&quot;Dianping in WeChat, via a WeChat message; Call a car straight from Dianping; Every car you could possibly call can be called at the same time (via Dianping, all within WeChat)!&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/108d928d-9774-4e02-a1f1-6747acf3e51c_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>These experiences stood out to me because during Tour, when I spent time with Chinese businesses, founders, and VCs, the topic of opportunities to innovate came up in multiple conversations. In each case, I eagerly demoed Muse, and spoke about the many inefficiencies AI could help us solve. Many were confused. &#8220;What inefficiencies do you mean?&#8221; I explained how AI influencers on X were booking travel and finding refund and savings opportunities in their inboxes! They remained confused because booking a train ticket, claiming savings, or getting a refund are already instant one-tap, one-QR, or one-WeChat activities within their super apps.</p><p>Others I talked to felt validated in their ambition to sell beyond China. AI companies were building to sell globally from day one, and many were eyeing the US specifically. One VC I spent a while with on this topic followed up with a <a href="https://mp.weixin.qq.com/s/Qlzrw9x96oOsnCn6aE21sQ">Chinese article</a> that explains why Americans are obsessed with Muse: &#8220;The reason is simple: the friction of living in the United States is too high.&#8221; (&#8220;&#21407;&#22240;&#24456;&#31616;&#21333;&#65292;&#32654;&#22269;&#29983;&#27963;&#30340;&#25705;&#25830;&#25104;&#26412;&#22826;&#39640;&#20102;&#12290;&#8221;)</p><div><hr></div><p>It&#8217;ll be interesting to see how adaptation to AI will play out in China. In some ways, it feels much more incremental than what we&#8217;re experiencing in the US. It&#8217;s yet another new technology that will be layered into the super apps, in an environment where friction has already been heavily sanded down.</p><p>On the other hand, fragmentation of how technology is adopted in the US has forced open ecosystem strategies from many businesses (including at Stripe, where we have to interoperate with not just many generations of payment methods, but also many generations of software our users rely on). This benefits AI agents, which can then make experiences feel integrated even while the underlying systems and processes remain fragmented.</p><p><strong>I suspect the rise of personal AI agents isn&#8217;t just a product of better models. It&#8217;s also a product of friction.</strong> I wonder if on the other side of the personal AI agent race to remove all our frictions, the average consumer experience will start to feel more like China&#8217;s, at least on the surface. Underneath, though, instead of a few super apps competing amongst each other to optimize where the path goes, it&#8217;ll be our own agents, cutting through the thickets of fragmentation and blazing new paths.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ygnG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ygnG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png 424w, https://substackcdn.com/image/fetch/$s_!ygnG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png 848w, https://substackcdn.com/image/fetch/$s_!ygnG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png 1272w, https://substackcdn.com/image/fetch/$s_!ygnG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ygnG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png" width="1456" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1614088,&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://www.breakingchange.blog/i/218096480?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.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_!ygnG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png 424w, https://substackcdn.com/image/fetch/$s_!ygnG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png 848w, https://substackcdn.com/image/fetch/$s_!ygnG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png 1272w, https://substackcdn.com/image/fetch/$s_!ygnG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba9fc93c-944d-49dd-8ec2-ee681dcf2f4a_1733x907.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>[AI generated] An agent addresses fragmentation and blazes a new path.</em></figcaption></figure></div>]]></content:encoded></item><item><title><![CDATA[Building a t-shirt factory factory]]></title><description><![CDATA[An informal benchmark for how well developer tools work when no one is reading the docs anymore.]]></description><link>https://www.breakingchange.blog/p/building-a-t-shirt-factory-factory</link><guid isPermaLink="false">https://www.breakingchange.blog/p/building-a-t-shirt-factory-factory</guid><dc:creator><![CDATA[Michelle Bu]]></dc:creator><pubDate>Tue, 15 Sep 2026 14:06:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8ec45bb0-c196-4db4-bdf5-1b65e898eacc_1024x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>I work at Stripe, so I&#8217;ve built many unserious t-shirt shops over the years.</span></p><p><span>There was shirt.codes, where you could buy a code snippet with proper syntax highlighting on a t-shirt. There was emoji.fish, where you put a pile of emoji on a t-shirt. And there was my personal favorite, </span><strong><a href="https://datetime.store/"><span>datetime.store</span></a></strong><span>, where you could buy the current Unix timestamp in milliseconds on a t-shirt. (It&#8217;s a good conversation starter. &#8220;What&#8217;s that number on your shirt?&#8221; &#8220;Oh, it&#8217;s just the Unix timestamp in milliseconds when I bought this shirt.&#8221; &#8220;...&#8221;)</span></p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88d2d4eb-e78b-400c-bc36-4a7755630c3d_1614x1454.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37f32c91-d03b-485a-ad8b-6c0238968add_1320x1464.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/292e2158-b128-49ad-a5c1-3682e26c0937_918x1114.png&quot;}],&quot;caption&quot;:&quot;(1) shirt.codes, featuring American Apparel shirts, now EOLed; (2) emoji.fish, featuring Twitter style emoji, also EOLed; (3) datetime.store, featuring Unix timestamp in milliseconds (not EOLed)&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec12b444-8fa9-4218-a17f-ac96ce894a89_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>I spent time building these because using our APIs was the only way I could understand how to make them better.</p><p><span>Unlike toy applications, real t-shirt shops aren&#8217;t built around the one API integration you happen to be dogfooding. A real t-shirt shop sells and prints real t-shirts and ships them to real humans. Real humans mean customer support and refunds, and real t-shirts mean materials, printing, and shipping. The shop&#8217;s backend also has to manage multiple state machines and orchestrate across first- and third-party systems.</span></p><p><span>A t-shirt shop is a useful minimal testable unit of e-commerce.</span></p><p><span>In the year 2026, no one is following a quickstart guide on a website anymore, so my approach to using our product must change, too. The questions we&#8217;re agonizing over are now of the shape, &#8220;how well do our developer tools work for our users&#8217; agents?&#8221; And, &#8220;are those agents using our newest integration paths, or are they stuck on code snippets from decade-old Stack Overflow posts in their training data?&#8221;</span></p><p><span>So, let&#8217;s make a factory for t-shirt shops (a t-shirt factory factory?). Let&#8217;s use the simplest prompt and runner we can get away with and see how far each model can get on building their own shop without a human in the loop:</span></p><div class="callout-block" data-callout="true"><p><span>Build and deploy a fully functioning t-shirt store. The shirts you sell should have an original theme that people will want to buy. Because we&#8217;re using DTG (direct-to-garment) technology, take advantage of that and go with a concept that is fully customized for the customer.</span></p><p><span>Select and integrate an appropriate payment provider. Customers must be able to pay for their order, and shirts should only be ordered after payment succeeds.</span></p><p><span>After you complete the build and deploy, let me know how I can test it, any gaps that you know of, and what I need to do next to bring it to production.</span></p></div><p><span>They couldn&#8217;t get very far.</span></p><p><span>Specifically, they could not get past hosting or t-shirt printing signup flows without a human in the loop. Because the intent of this informal benchmark isn&#8217;t to evaluate provider selection, I set up Vercel and Prodigi (the only t-shirt printer I found with an excellent sandbox mode) in advance, and provided the API key and auth prior to each run. I added this to my prompt:</span></p><div class="callout-block" data-callout="true"><p><span>What&#8217;s available to you:</span></p><p><span>* Vercel CLI should be logged in. Deploy to a new, run-specific Vercel project</span></p><p><span>named </span><code>$BENCHMARK_VERCEL_PROJECT</code><span>.</span></p><p><span>* You can use the Prodigi Print API to print and ship shirts. A Prodigi sandbox API key is available as </span><code>$PRODIGI_API_KEY</code><span>.</span></p></div><p><span>With this addition to the prompt, all models were able to build and deploy what they considered to be a complete t-shirt shop without asking me for help. We&#8217;ll get to how complete they actually were.</span></p><p><span>You&#8217;ll notice that I did not prompt any models to use Stripe. I only asked them to select and integrate a payment provider. Despite that, all runs that completed with a payments integration chose Stripe, and Astra, Fable, Opus, and Sonnet were able to figure out how to acquire a Stripe sandbox and test key by themselves via the Stripe CLI!</span></p><p><span>If you&#8217;re a developer tools provider, you should offer a limited sandbox environment to agents before you require a human. Even if not </span><em><span>all</span></em><span> models can find it yet, I suspect they will soon be able to, and will </span><em><span>prefer</span></em><span> developer tools that don&#8217;t require human action :).</span></p><p><span>Okay, so the models self-reported successfully building t-shirt shops. But are they functional, and perhaps more importantly, </span><em><span>compelling</span></em><span>?</span></p><h3><strong><span>An LLM integrates with not one, but two APIs</span></strong></h3><p><span>Between September 7 and September 10, 2026, I gave seven models the prompt above and ran each three times at high reasoning effort. I scored each run on:</span></p><ol><li><p><strong><span>Integration correctness</span></strong><span>: whether the two API integrations (payments, t-shirt printing) were built correctly by inspecting the code and manually testing the resulting application</span></p></li><li><p><strong><span>Design correctness</span></strong><span>: whether a printable (i.e., correct image, correct resolution, transparent background) design was created</span></p></li><li><p><strong><span>End-to-end testing</span></strong><span>: whether the model tested the integrations end-to-end themselves (i.e., a successful Stripe payment and a successful Prodigi order appear in the relevant sandboxes after each run)</span></p></li></ol><p><span>(1) and (2) must both pass for the t-shirt shop to be considered a</span><strong><span> functional t-shirt shop</span></strong><span>.</span></p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/5Ql02/2/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ec0eba3-bbcf-4bd3-8e95-635085c55b65_1220x678.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5064144d-9945-42ea-a1b5-46cce96fd96e_1220x678.png&quot;,&quot;height&quot;:343,&quot;title&quot;:&quot;Created with Datawrapper&quot;,&quot;description&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/5Ql02/2/" width="730" height="343" frameborder="0" scrolling="no" loading="lazy"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p><span>Only 7 out of 21 runs produced a functional t-shirt shop. That means if you deploy one of these shops without further iteration and testing, it&#8217;s more likely than not to be broken in some way. Worse, it may have a silent defect.</span></p><p><span>The defects arose either at the handoff between the two API integrations, when Stripe says a payment succeeded and the code calls out to Prodigi to print a t-shirt, or when handling API failures.</span></p><p><span>For example, in one of Sonnet&#8217;s runs, the application reads from </span><em><span>session.shipping_details</span></em><span>, a field we moved to </span><em><span>collected_information.shipping_details</span></em><span>, as a breaking change in our 2025 Basil major version. Whether that field exists depends on the API version of the webhook endpoint, which is a separate setting from the version the Stripe client pins. (For what it&#8217;s worth, this surprises humans, too.) Every model that pinned an API version only pinned it in the client, so 2026 Dahlia payloads were being processed by webhook handlers written against a pre-Basil API shape. In its webhook handler, Sonnet falls back to the customer&#8217;s </span><em><span>billing</span></em><span> address when it can&#8217;t find shipping details, which means the payment succeeds and the t-shirt ships to the wrong address.</span></p><p><span>Another example: one of Fable&#8217;s runs treats Prodigi </span><em><span>CreatedWithIssues</span></em><span> outcomes as successes, so the customer thinks their order went through even if Prodigi can&#8217;t print it.</span></p><p><strong><span>These defects are dangerous because they don&#8217;t fail loudly.</span></strong><span> A vibe-coder who isn&#8217;t inspecting the code may not realize something is wrong until the support emails and chargebacks show up. </span>And having the models do their own testing isn&#8217;t enough. In the nine runs where models successfully tested the happy path end to end, three were still broken. Across all three runs, Sol, Terra, and Luna could not figure out how to get a Stripe sandbox or test key, so they did not test their applications.</p><p><span>No one should be writing these integrations by hand anymore. I&#8217;ve seen humans introduce worse bugs, and more of them. But if you&#8217;re building an application that involves the exchange of goods or services, no matter which model you&#8217;re using, there&#8217;s plenty of room for your coding agent to introduce subtle defects. You should manually verify the end-to-end flow in production and ask your agent friend to triple-check that its code handles a variety of edge cases.</span></p><h3><strong><span>An LLM decides which frameworks to use</span></strong></h3><p><span>If you&#8217;re a framework maintainer or a company that offers APIs, then, like me, you&#8217;re probably worried about agents generating code straight from their training data.</span></p><p><span>Below are the lowest React, Next.js, and Stripe versions used across three runs. All runs either used Next.js/React or no framework. The models&#8217; choice of framework is likely influenced by my desire to deploy to Vercel in the prompt. All runs that completed a payments integration integrated with Stripe even though Stripe was not mentioned in the prompt.</span></p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/wl1qL/1/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/09f2901e-6c60-4617-90e1-bac15015fcf2_1220x710.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1bff1ab1-3be8-4f7d-a31e-7f0c10d94d84_1220x710.png&quot;,&quot;height&quot;:361,&quot;title&quot;:&quot;Created with Datawrapper&quot;,&quot;description&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/wl1qL/1/" width="730" height="361" frameborder="0" scrolling="no" loading="lazy"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p><span>Of note, Sonnet chose unsupported / EOLed frameworks like React 18 and Next.js 14. Its stripe-node 16 is also many major versions behind. Stripe, React, and Next.js are frozen in amber to many of these models.</span></p><p><span>Sure enough, across 21 runs, the models searched the web for React or Next.js exactly once and for Stripe 15 times. Prodigi, which they&#8217;d never seen before, they searched for 62 times.</span></p><div class="callout-block" data-callout="true"><p><strong><span>How do I feel about this, with my Stripe hat on?</span></strong></p><p><span>Even though it&#8217;s annoying when models build outdated Stripe integrations based on their training data, Stripe is of course fortunate to be in this position. Coding agents reach for Stripe because they know us. Our docs and developer-friendly reputation are as deeply embedded in their weights as those pesky 2024-era API versions that we have to nudge them away from via </span><a href="https://stripe.dev/blog/ai-steering-experiments"><span>steering experiments</span></a><span>.</span></p><p><span>One example of a </span><em><span>good</span></em><span> deeply embedded integration pattern is Stripe metadata. All runs chose to use Stripe&#8217;s metadata to store order details. Adding metadata on all API objects was a design choice we made back in 2013. Not all APIs have this, but it&#8217;s extremely useful for developers that want to get started quickly, and it&#8217;s cool to see that now agents are benefiting from it. They would rather stash order details on a Stripe object than stand up a database. (Relatable.)</span></p></div><h3><strong><span>An LLM designs a compelling t-shirt</span></strong></h3><p><span>All that plumbing matters for building a robust production application, but robustness does not imply </span><em><span>fashion</span></em><span>. The most important aspect of an unserious t-shirt shop is (uncontroversially, I hope) the t-shirt design.</span></p><p><span>So, the final test that I ran with my own two eyes and heart is whether I think the t-shirt shop </span><em><span>concept</span></em><span> is any good at all. Would I wear one of these designs?</span></p><p><span>Some models had nerdy and creative ideas, but they made for rather odd designs. And the solid backgrounds wouldn&#8217;t print well.</span></p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d27f6371-dcc8-438b-a133-d8f319658e3f_832x1030.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa4c3bdd-085f-4274-a883-f6a728ffb8d6_1667x1999.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8d493c6-af8a-4883-b580-0a07cbe6331a_698x928.png&quot;}],&quot;caption&quot;:&quot;Fable and Opus read a lot of books&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/319c8f7e-ba91-4e58-a87d-d8a7d1f8930f_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>Some models were clearly trying to show off their image gen capabilities.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dba130c5-3442-458a-a2a4-85a9c72a3578_1024x1536.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/860da1a0-9460-41d9-9357-1e0d81e6fd54_1024x1536.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95824075-f32a-4707-a1fb-450e684afe3f_600x754.png&quot;}],&quot;caption&quot;:&quot;Astra and Sol show off a little&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f835c76c-d118-4be8-826e-4c591c5d16e1_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p><span>And some models (Luna, Sonnet) tried really hard, but just couldn&#8217;t come up with a plausible t-shirt.</span></p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b932c16c-e9a6-4e49-8e22-78ef0d617db8_586x690.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b8add75-796b-47cb-b902-126fd588a9e5_1999x1999.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b582c91-ad1f-4b87-b49e-5734689edfe6_1596x1999.png&quot;}],&quot;caption&quot;:&quot;Luna and Sonnet try to make SVG art&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f21e606e-22fe-45b9-bfb7-70242e3b6eea_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p><span>In their defense, I suppose these models have never </span><em><span>experienced</span></em><span> a t-shirt. Across all of my tests, including runs beyond the 21 that make up this informal benchmark, I only liked two of the sites enough to do the rest of the work to bring them to production:</span></p><ul><li><p><a href="https://httpgoods.com"><span>HTTP Goods (by Fable)</span></a><span> sells HTTP status code t-shirts with multiple design treatments.</span></p></li><li><p><a href="https://automata.supply">Automata Supply <span>(by Opus)</span></a><span> sells cellular-automaton shirts with a builder for generating your own patterns. This is the only t-shirt shop concept that truly took advantage of the ability to print unique, one-of-one t-shirts with direct to garment technology.</span></p></li></ul><p><span>I was so inspired by Opus&#8217;s idea that I built a small riff on its cellular-automaton t-shirt shop: </span><a href="https://seedstate.store">SEEDSTATE (by mchl)</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P3Mq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P3Mq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png 424w, https://substackcdn.com/image/fetch/$s_!P3Mq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png 848w, https://substackcdn.com/image/fetch/$s_!P3Mq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png 1272w, https://substackcdn.com/image/fetch/$s_!P3Mq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!P3Mq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png" width="1456" height="804" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:804,&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;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!P3Mq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png 424w, https://substackcdn.com/image/fetch/$s_!P3Mq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png 848w, https://substackcdn.com/image/fetch/$s_!P3Mq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png 1272w, https://substackcdn.com/image/fetch/$s_!P3Mq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eae278a-16d5-49e0-98cb-0c6b14bc9a92_2048x1131.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><span>As someone who </span><em><span>does</span></em><span> experience t-shirts, I think I prefer my version :). T-shirt shops remain a minimal testable unit of e-commerce, and in true singularity fashion, my unserious t-shirt shop production has hockey-sticked.</span></p><h3><strong><span>An LLM (and by extension, a human) encounters friction</span></strong></h3><p><span>Today, coding agents are still unreliable at building a fully functional t-shirt shop and bringing it to production. There&#8217;s a lot we (Stripe) can do to help them: they don&#8217;t fully understand API versioning, they can&#8217;t always find our sandboxes, they can&#8217;t set launch-blocking configuration (like terms of service links or branding settings) without going to a UI, and they can&#8217;t (or won&#8217;t) retrieve live keys (some of them, understandably, don&#8217;t want a live secret key in their transcript). </span></p><p><span>&#8220;Using the product&#8221; in the year 2026 means spending zero time in the docs or an IDE, and all of my time clicking around, swapping out API keys, and entering 2FA codes on behalf of my agents. </span>Any friction we reduce for agents is friction we&#8217;ll reduce for humans as well. What I&#8217;m testing now is whether I need to be involved in the fiddly bits of building the t-shirt shop at all.</p><h3><strong>Resources</strong></h3><ul><li><p><a href="https://github.com/michelle/endless-tshirt-shops"><span>Repo</span></a><span>, where you can see my descent into t-shirt factory factory madness as well as earlier attempts.</span></p></li><li><p><a href="https://michelle.github.io/endless-tshirt-shops/"><span>Results viewer</span></a><span>, where you can view every run; note the scoring criteria I used in this post have evolved from the criteria in this viewer.</span></p></li><li><p>I kept a friction log while bringing <a href="https://seedstate.store">SEEDSTATE</a> to production. A copy can be found <a href="https://docs.google.com/document/d/1NyXRtObySSF_8kL4skxtb1-gjcS_pPRvPIWfFwVktfs/edit?tab=t.0">here</a>.</p></li></ul>]]></content:encoded></item></channel></rss>