<?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[Byte-Sized Design]]></title><description><![CDATA[Master system design concepts, engineering fundamentals, and interview basics. Weekly summaries, post-mortems, and advice for 43,000+ engineers.]]></description><link>https://read.bytesizeddesign.com</link><image><url>https://substackcdn.com/image/fetch/$s_!UMZA!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b64927-5de1-4edc-a245-b9b486e07503_1024x1024.png</url><title>Byte-Sized Design</title><link>https://read.bytesizeddesign.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 29 Oct 2026 04:45:12 GMT</lastBuildDate><atom:link href="https://read.bytesizeddesign.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Byte-Sized Design]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[bytesizeddesign@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[bytesizeddesign@substack.com]]></itunes:email><itunes:name><![CDATA[Byte-Sized Design]]></itunes:name></itunes:owner><itunes:author><![CDATA[Byte-Sized Design]]></itunes:author><googleplay:owner><![CDATA[bytesizeddesign@substack.com]]></googleplay:owner><googleplay:email><![CDATA[bytesizeddesign@substack.com]]></googleplay:email><googleplay:author><![CDATA[Byte-Sized Design]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[🧠 Meta's Smartest Agent Was the Problem. The Dumb One Fixed It]]></title><description><![CDATA[One agent with all the knowledge hallucinated in production. A router that does zero domain work plus 14 specialists cut column onboarding from days to under an hour.]]></description><link>https://read.bytesizeddesign.com/p/meta-thin-orchestrator-agent-router</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/meta-thin-orchestrator-agent-router</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Wed, 28 Oct 2026 02:40:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a71ebad2-d253-4bef-a0bd-0ecd23a9f097_1456x816.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#9889; TLDR</h2><p>Meta built one AI agent that knew everything about onboarding a data column into its recommendation pipelines: three repos, three languages, up to six pipeline stages, config schemas, codegen rules, population patterns for ten-plus data sources. It worked in demos. In production it started hallucinating, applying one subsystem&#8217;s naming conventions to another and using the wrong codegen pattern for the wrong data source.</p><p>The fix was to take knowledge away from the central agent. What replaced it:</p><ul><li><p>A 1,300-line orchestrator that does zero domain work. It classifies intent, gathers fields, runs reliability checks, and routes</p></li><li><p>14 specialist subagents, each loaded with only its own domain and nothing else</p></li><li><p>Workflow templates, which are fixed state machines that sequence those 14 agents differently for each of 20+ use cases</p></li></ul><p>Column config prep went from three to four days by hand, to about a day with an earlier config-driven system, to under an hour. Around two-thirds of the system&#8217;s changes land without significant human edits.</p><p>The rule underneath, which transfers to any agent system: for every component, decide whether it&#8217;s making a routing decision or a reasoning decision. Routing is deterministic and gets code. Reasoning gets an LLM, inside the smallest context that can do the job. Meta&#8217;s orchestrator follows seven steps per request and exactly one of them calls a model.</p><h2>&#129760; More context, worse agent</h2><p>The pipeline is config-as-code. Python configs drive C++ code generation, which feeds data processing services, which populate analytics systems. One new column means coordinated edits across configuration registries, backend services, and pipelines, in the right order, kept in sync.</p><p>The first version was the obvious one. One agent, one giant prompt, every schema and rule and pattern loaded. It had everything it needed, and past some context size that became the problem. Knowledge from one subsystem leaked into decisions about another. The agent had plenty of information and was mixing it up.</p><p>A second attempt, still single-agent, got to 70 to 80 percent success, with a catch: an engineer had to hand-write a custom system prompt for each specific job. Take the handholding away and success fell to 10 to 20 percent. A system that only works when a human pre-chews the prompt per task is a system where the human is doing the orchestration.</p><p>Meta cites a Mount Sinai preprint on the same effect in a different domain: orchestrated multi-agent systems held 65.3% accuracy at 80-task batches where single agents fell to 16.6%, with up to 65x less token usage, attributed to task isolation preventing context interference. Different field, same shape of failure.</p><p>If you&#8217;ve read the <a href="https://bytesizeddesign.substack.com/p/agents-are-microservices-that-think">agents-are-microservices edition</a>, this is the monolith problem. A single agent with 40 tools and a 6,000-token system prompt degrades the way a 400,000-line app does. Every capability you add makes every other one slightly worse.</p><h2>&#128678; A router that refuses to think</h2><p>The replacement has two layers, and the split between them is the whole idea.</p><p><strong>The orchestrator</strong> is deterministic and does no domain work at all. It never reasons about code, never generates a config, never touches the codebase. For every request it runs the same seven steps:</p><ol><li><p>Read the relevant subagent&#8217;s instruction file</p></li><li><p>Check whether the target already exists, to prevent duplicates</p></li><li><p>Gather required fields from the user</p></li><li><p>Auto-discover what can be inferred (repo type, existing configs)</p></li><li><p>Reliability gate: active warnings, required reviewers</p></li><li><p><strong>Delegate to the subagent with full context</strong></p></li><li><p>Handle results, surface errors, confirm success</p></li></ol><p>Steps 1 through 5 and step 7 are plain code. Step 6 is the only place a model reasons, and it does so inside a subagent that has only its own domain loaded.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zlnZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zlnZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!zlnZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!zlnZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!zlnZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!zlnZ!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png" width="1200" height="629.6703296703297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:163071,&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://read.bytesizeddesign.com/i/222432585?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zlnZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!zlnZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!zlnZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!zlnZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512fe683-20ce-4b39-a801-fd62293ade17_2400x1260.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></figure></div><p></p><p><strong>The 14 subagents</strong> are each a complete domain expert with isolated context. A schema agent knows the configuration registries. A population agent knows how to generate code for each of the ten data sources. A validation agent knows build systems and quality checks. No single agent sees the whole picture, which is what stops the cross-contamination that killed v1. The population agent for data source A has never seen data source B&#8217;s patterns, so it can&#8217;t apply them by mistake.</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/meta-thin-orchestrator-agent-router">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[📉 98% GPU Utilization and a 6x Speedup Left on the Table]]></title><description><![CDATA[A Qwen 27B fine-tune showed 98% GPU utilization and ran 6x slower than it should. Two fixes from Databricks: install the fused kernels, pack the batches.]]></description><link>https://read.bytesizeddesign.com/p/98-percent-gpu-utilization-6x-speedup</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/98-percent-gpu-utilization-6x-speedup</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Tue, 20 Oct 2026 16:16:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/640dd3c5-a2ac-416d-9f1d-2fa35e473bd4_1456x816.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#9889; TLDR</h2><p>A fine-tune of Qwen 27B on Databricks&#8217; AI Runtime took 7 hours 44 minutes with the GPUs reporting 98% utilization. After two changes it took 1 hour 17 minutes. Same model, same data, same hardw&#8230;</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/98-percent-gpu-utilization-6x-speedup">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[🚪 Uber Put 5,000 Tools in Front of Its Agents. Every One Ships Switched Off.]]></title><description><![CDATA[800+ MCP servers behind one gateway, drafted by a crawler and approved by humans]]></description><link>https://read.bytesizeddesign.com/p/uber-mcp-gateway-5000-tools-switched-off</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/uber-mcp-gateway-5000-tools-switched-off</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Thu, 15 Oct 2026 05:32:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pRlk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#9889; TLDR</h2><p>Uber has 800+ MCP servers and 5,000+ tools sitting behind a single gateway, with hundreds of teams building agents on top. Almost none of the work was about models. The questions that actually slowed them down were boring platform questions:</p><ul><li><p>Who owns this tool, and is it safe to expose?</p></li><li><p>How does an agent find the right one among 5,000?</p></li><li><p>Who checks authorization when the caller is an agent acting for a human?</p></li><li><p>How do you give agents access to thousands of existing services without asking every team to write new code?</p></li></ul><p>Their answer is one microservice that sits between every agent and every backend. A registry catalogs the tools, a proxy runs them, and a crawler drafts every tool definition from the Protobuf and Thrift schemas Uber already has. Nothing is exposed until a human owner turns it on.</p><p>If you remember one thing: this is the API gateway problem again, with a twist. The client is a model, and a model has a token budget. Hand it 5,000 tool definitions and it has spent most of its context before it starts working.</p><h2>&#129521; The problem turned out to be plumbing</h2><p>Hundreds of teams at Uber started building agents around the same time. The early ones worked, because an agent that can hit a live service and do something for a user is a lot more useful than one that can only chat.</p><p>Then it spread, and you can guess what happened:</p><ul><li><p>Every team built its own integrations, duplicating infrastructure and fragmenting the tooling</p></li><li><p>Tools were hard to discover and harder to run reliably</p></li><li><p>Each integration was welded to one service or one agent framework</p></li><li><p>Security and observability depended on whoever wrote the glue</p></li></ul><p>If you were around for the first few years of microservices you&#8217;ve seen this list before. It&#8217;s roughly 2014, a month before somebody proposes an API gateway. <a href="https://bytesizeddesign.substack.com/p/agents-are-microservices-that-think">Agent architectures have the same problem one level down</a>, with the boxes renamed.</p><h2>&#128506;&#65039; Two planes</h2><p>The gateway has two halves:</p><ul><li><p><strong>MCP Registry (control plane).</strong> The source of truth for which servers and tools exist, who owns them, and whether they&#8217;re enabled</p></li><li><p><strong>Proxy Gateway (data plane).</strong> Takes an MCP call, translates it to HTTP, gRPC, or TChannel, forwards it, and converts the response back into an MCP result</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_!pRlk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pRlk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!pRlk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!pRlk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!pRlk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pRlk!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png" width="1200" height="629.6703296703297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:103589,&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://read.bytesizeddesign.com/i/220481821?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pRlk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!pRlk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!pRlk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!pRlk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24b6f9e9-3abd-4385-a4ff-0ffe0644e651_2400x1260.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></p><p>The whole design rests on one bet: the fastest tool you can give an agent is an API you already run. Uber has thousands of services behind HTTP, gRPC, and TChannel. Asking those teams to rewrite anything for agents would have stalled every roadmap in the company, so the gateway adapts to the services and the services stay as they are.</p><p>I think that&#8217;s right, and I think most teams get it backwards. When MCP shows up, the instinct is to go write MCP servers. You already have the schemas. Wrap them.</p><h2>&#128375;&#65039; Discovery is automatic. Exposure is a decision.</h2><p>Nobody hand-wrote 5,000 tool definitions. A crawler drafts them.</p><p>AutoCrawler runs on <a href="https://cadenceworkflow.io/">Cadence</a>. A cron job kicks it off, it scans the IDL registry and some internal service signals for new services, new APIs and schema changes, and for each service or API group it finds it:</p><ol><li><p>Upserts a virtual MCP server for the service</p></li><li><p>Parses the Protobuf or Thrift files for method names, request and response schemas, and doc comments</p></li><li><p>Asks an LLM to write agent-friendly tool descriptions from those schemas and comments</p></li><li><p>Translates the schemas into MCP-compatible JSON-RPC 2.0</p></li><li><p>Registers the tools in the registry, switched off</p></li></ol><p>Hand-built servers take a second path. Anything written on MCPFx (Uber&#8217;s framework for native MCP servers) emits a heartbeat metric. The crawler sees a new heartbeat, calls <code>listTools</code>, and registers a virtual proxy server with whatever came back. Also switched off.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G4GR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G4GR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!G4GR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!G4GR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!G4GR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G4GR!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png" width="1200" height="629.6703296703297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:84611,&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://read.bytesizeddesign.com/i/220481821?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G4GR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!G4GR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!G4GR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!G4GR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9b0a7e-2e12-44ac-8813-f37f022f4d4a_2400x1260.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 disabled-by-default part is the decision I&#8217;d copy first. A tool stays dark until the owning team has read the generated definition, fixed whatever the LLM got wrong, and enabled it. After that, any edit to a tool description shows up as a config diff the owner has to approve, and they can roll back to the previous version.</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/uber-mcp-gateway-5000-tools-switched-off">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[🚦 Spotify Doubled Its Engineering Output. The Bottleneck Just Moved.]]></title><description><![CDATA[Spotify's merged changes doubled with AI and code quality held. Review, testing, and ops strained instead. A five-part scorecard for measuring AI's real impact.]]></description><link>https://read.bytesizeddesign.com/p/spotify-doubled-merged-code-bottleneck-moved</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/spotify-doubled-merged-code-bottleneck-moved</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Thu, 24 Sep 2026 16:38:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/48aad7ce-b4f6-4c7b-8d11-35bdf0072f00_1456x816.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#9889; TLDR</h2><p>17,000 merged changes in August, up from roughly 8,100 a year earlier. That is Spotify&#8217;s engineering org after a year of AI coding tools, spread across nearly 3,000 production services handling 11 to 12 million backend requests per second.</p><p>The part most people skip past:</p><ul><li><p>Their incident reviews have found no AI-authored code acting as a material direct contributor to a major incident so far</p></li><li><p>The strain showed up after the merge, in review, testing, rollout, observability, and rollback</p></li><li><p>Change volume grew faster than the controls that verify change</p></li></ul><p>AI moved the constraint downstream. Writing the change got cheap, and proving the change is safe became the expensive step.</p><p>This edition walks through one Spotify incident from June that has nothing to do with AI, because it happens to be a perfect physical model of what a 2x change rate does to a delivery pipeline. Then a five-part scorecard you can take to your next staff meeting, since acceptance rate and &#8220;percent of code written by AI&#8221; will tell you almost nothing about any of this.</p><h2><strong><a href="https://www.svix.com/?utm_source=byte-sized-design&amp;utm_medium=newsletter&amp;utm_campaign=third-placement">Svix: Become event-driven in a day</a></strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.svix.com/?utm_source=byte-sized-design&amp;utm_medium=newsletter&amp;utm_campaign=third-placement" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NZcI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp 424w, https://substackcdn.com/image/fetch/$s_!NZcI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp 848w, https://substackcdn.com/image/fetch/$s_!NZcI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp 1272w, https://substackcdn.com/image/fetch/$s_!NZcI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NZcI!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp" width="1056" height="554.1098901098901" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1056,&quot;bytes&quot;:39752,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:&quot;https://www.svix.com/?utm_source=byte-sized-design&amp;utm_medium=newsletter&amp;utm_campaign=third-placement&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://read.bytesizeddesign.com/i/216469968?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NZcI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp 424w, https://substackcdn.com/image/fetch/$s_!NZcI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp 848w, https://substackcdn.com/image/fetch/$s_!NZcI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp 1272w, https://substackcdn.com/image/fetch/$s_!NZcI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e4aadc1-820f-4411-a84e-964e74468d49_1456x764.webp 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>Your customers want to make their agent workflows event-driven, so don&#8217;t lose deals trying to implement webhooks yourself.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.svix.com/?utm_source=byte-sized-design&amp;utm_medium=newsletter&amp;utm_campaign=third-placement&quot;,&quot;text&quot;:&quot;Start sending webhooks today!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.svix.com/?utm_source=byte-sized-design&amp;utm_medium=newsletter&amp;utm_campaign=third-placement"><span>Start sending webhooks today!</span></a></p><div><hr></div><h2>&#127916; June 24: a queue with four things wrong at once</h2><p>More than 500,000 songs, videos, podcasts, and audiobooks enter Spotify&#8217;s processing systems every day. Video podcasts go through a transcoding fleet with a medium-priority queue for new episodes and a low-priority queue for updates to existing ones. Normal processing time is minutes, and on June 24 it became hours. Here is the timeline, in UTC:</p><ul><li><p><strong>13:30</strong> Early alerts fire. Nobody reads them as a fleet-wide capacity problem</p></li><li><p><strong>15:00</strong> A spike in video podcast deliveries pushes transcoding close to its ceiling</p></li><li><p><strong>16:35</strong> A scheduled batch job gets stopped to free capacity</p></li><li><p><strong>17:31</strong> First creator report of a stuck episode</p></li><li><p><strong>17:34</strong> Queue-backlog alerts cross threshold and formal incident response starts</p></li><li><p><strong>20:49</strong> A fix ships for a resource scheduling bug</p></li><li><p><strong>00:14</strong> An additional processing cluster comes online</p></li><li><p><strong>01:02</strong> Queues clear</p></li></ul><p>Roughly four hours between the first alert and a declared incident, and about eleven and a half between the first alert and an empty queue. Many creators found out from their audiences before they heard from Spotify.</p><p>Nothing in the incident report involves AI, and the word never appears in it. Four ordinary engineering problems stacked on the same afternoon:</p><ul><li><p><strong>Thin headroom.</strong> The transcoding fleet had too little spare capacity to absorb a large delivery spike</p></li><li><p><strong>A competing batch job.</strong> A routine re-processing run for existing episodes was eating capacity during peak submissions</p></li><li><p><strong>A quality win that cost compute.</strong> A recent change delivered better video at lower bitrates. Each episode now took more processing, and the capacity plan still assumed the old cost</p></li><li><p><strong>A scheduler bug.</strong> After a migration to more powerful hardware, a resource scheduling bug left compute underused and cut throughput by about 10%</p></li></ul><p>Any one of these is survivable. A 10% throughput loss on a fleet with 40% headroom is a line item in a weekly review. Put all four on the same afternoon and arrivals exceed service rate, which is the only condition a queue needs to grow without bound.</p><p>The monitoring gap is another story. The 13:30 alerts were symptom alerts, and they fired correctly. What was missing was a signal that said &#8220;arrival rate is about to exceed service rate for the whole fleet.&#8221; <a href="https://bytesizeddesign.substack.com/p/how-twitch-caught-invisible-failures">Twitch hit the same class of problem</a> with failures their dashboards technically recorded and nobody could interpret. Alerts that detect pain are cheap. Alerts that explain capacity are the ones worth building, and <a href="https://bytesizeddesign.substack.com/p/the-engineers-guide-to-observability">the observability guide</a> covers how to get there.</p><p>My one criticism of the engineering: the transcoding quality change should have gone through capacity review. Any change that raises per-item processing cost is a capacity change, whatever the ticket says. Spotify&#8217;s fix list suggests they agree. They added about 67% more transcoding capacity, fixed the scheduler, and committed to planning for steady state, burst, and recovery separately, with creator uploads always ahead of background work and backpressure extended through the pipeline.</p><h2>&#128257; Now swap episodes for pull requests</h2><p>The mapping below is mine, and it&#8217;s an analogy. AI had no role in June 24. The shape of the failure is what transfers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xl4N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xl4N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!Xl4N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!Xl4N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!Xl4N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xl4N!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png" width="1200" height="629.6703296703297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:99489,&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://read.bytesizeddesign.com/i/216469968?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Xl4N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!Xl4N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!Xl4N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!Xl4N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8259404-93bb-447b-9ed6-8a6c0339c44f_2400x1260.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></figure></div><p>Your delivery pipeline is also a queue with a fixed-ish service rate. Changes arrive, wait for review, wait for CI, wait for a rollout slot, and bake in production while someone watches a dashboard.</p><pre><code><code>  design -&gt; implement -&gt; review -&gt; test -&gt; deploy -&gt; observe -&gt; operate
               ^            ^________________________________________^
        AI made this             capacity here is mostly unchanged
        stage ~2x cheaper</code></code></pre><p>Line the June 24 factors up against a year of AI-assisted development:</p><ul><li><p><strong>The delivery spike</strong> is merged changes going from ~8,100 to ~17,000</p></li><li><p><strong>Higher per-item cost</strong> is PR size and code complexity, both of which are creeping upward at Spotify. A bigger diff takes longer to review, the same way a higher-quality transcode takes longer to encode</p></li><li><p><strong>The competing batch job</strong> is automated fleet-wide change. Spotify&#8217;s Fleet Management tooling finished a Java migration across backend services in three days. It also shipped an automated dependency upgrade that passed every check and still failed in production with user impact</p></li><li><p><strong>Thin headroom</strong> is your reviewers, your CI fleet, and your canary slots, all sized for last year&#8217;s arrival rate</p></li><li><p><strong>Symptom-level monitoring</strong> is the AI usage dashboard. It tells you the tools are busy</p></li></ul><p>That dependency upgrade is the cleanest example in the whole September write-up. Authoring the change cost close to nothing. The checks were the entire safety case, and the checks were wrong. The response was all downstream: stronger safeguards, more rollback capacity, and scheduling automated changes during the owning team&#8217;s working hours so a human is awake when it lands.</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/spotify-doubled-merged-code-bottleneck-moved">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[🧱 Your Multi-Agent Architecture Is a 2016 Microservices Diagram With the Boxes Renamed]]></title><description><![CDATA[The parts that still work, the three places it breaks, and one heuristic for right now]]></description><link>https://read.bytesizeddesign.com/p/agents-are-microservices-that-think</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/agents-are-microservices-that-think</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Sat, 12 Sep 2026 17:56:36 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f74485bd-4134-4391-9b04-f0f32e1efab7_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#9889; TLDR</h2><p>Every multi-agent architecture diagram published this year looks like a microservices diagram with the boxes renamed. Planner, researcher, coder, reviewer, arrows between them, a gateway on top.</p><p>The resemblance is earned, because both take a monolith (one giant prompt, one giant service) and split it into narrow units that talk over defined interfaces.</p><p>Half the microservices playbook transfers cleanly:</p><ul><li><p>Contracts between units</p></li><li><p>Failure isolation</p></li><li><p>Explicit orchestration</p></li><li><p>Tracing</p></li></ul><p>The other half breaks, because the physics of the call changed:</p><ul><li><p>A service hop: ~1 ms, free, same answer every time</p></li><li><p>An agent hop: 2 to 20 seconds, a full inference pass, different answer on retry</p></li></ul><p>Circuit breakers, idempotent retries, and shared-nothing state were all designed around the first set of numbers. Copy them wholesale and you get a system that is expensive when it works and undebuggable when it fails.</p><p>No settled best practice exists yet. This is the version I would defend in a design review this week.</p><p>One thing both agree on: the units have to talk over a contract, and the moment that contract has to reach a customer&#8217;s system, it becomes a webhook. Today&#8217;s sponsor has spent years making that hop work!</p><div><hr></div><h2><strong><a href="https://www.svix.com/?utm_source=byte-sized-design&amp;utm_medium=newsletter&amp;utm_campaign=second-placement">Svix: Become event-driven in a day</a></strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.svix.com/?utm_source=byte-sized-design&amp;utm_medium=newsletter&amp;utm_campaign=second-placement" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mdMy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!mdMy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!mdMy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!mdMy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mdMy!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.png" width="1200" height="629.6703296703297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:219407,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://www.svix.com/?utm_source=byte-sized-design&amp;utm_medium=newsletter&amp;utm_campaign=second-placement&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://read.bytesizeddesign.com/i/215396292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!mdMy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!mdMy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!mdMy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!mdMy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c9f1051-a799-4c78-9312-65ef36c2c0e8_2400x1260.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>Your customers want to make their agent workflows event-driven, so don&#8217;t lose deals trying to implement webhooks yourself.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.svix.com/?utm_source=byte-sized-design&amp;utm_medium=newsletter&amp;utm_campaign=second-placement&quot;,&quot;text&quot;:&quot;Start Sending Webhook Today!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.svix.com/?utm_source=byte-sized-design&amp;utm_medium=newsletter&amp;utm_campaign=second-placement"><span>Start Sending Webhook Today!</span></a></p><div><hr></div><p></p><h2>&#127959;&#65039; The parallel is real</h2><p>Start with the half that transfers.</p><p><strong>The monolith problem is identical.</strong> A single agent with 40 tools and a 6,000-token system prompt degrades the way a 400,000-line Rails app does. Every capability you add makes every other one slightly worse, and nobody can predict which change broke which behavior. Splitting into narrow agents, each with a handful of tools and a prompt that fits on one screen, is the same relief valve as splitting services.</p><p><strong>Interfaces over shared state is the second transfer.</strong> In 2024, most agent-to-agent handoffs were free text pasted into the next prompt. That is two services sharing a database table. Works fine until one side changes the shape and the other side silently misreads it.</p><p><strong>MCP is filling the OpenAPI and gRPC role.</strong> A typed tool contract, a discovery mechanism, and a transport. It stopped being one vendor&#8217;s project in December 2025, when Anthropic donated it to the Linux Foundation&#8217;s Agentic AI Foundation with AWS, Google, Microsoft, and OpenAI as founding members. Over 10,000 published servers at the time.</p><p>Treat an MCP server like a service boundary:</p><ul><li><p>Version the contract</p></li><li><p>Own it as a team</p></li><li><p><a href="https://bytesizeddesign.substack.com/p/building-secure-scalable-remote-mcp">Put real auth in front of it</a></p></li></ul><p>One gap remains, because MCP only standardizes agent-to-tool. Agent-to-agent contracts (what a worker returns, in what schema, with what confidence) are still whatever your framework does by default, and the default is prose. Write the schema yourself, because nobody else will. A worker that returns <code>{"findings": [...], "confidence": 0.7, "sources": [...]}</code> can be validated, cached, and replaced. Three paragraphs of prose can only be pasted into the next prompt.</p><div><hr></div><p><strong>&#128227; Show the community what you built!</strong></p><p>Over 43,000 engineers read this newsletter every week, and a lot of you are building things on the side: CLIs, SaaS tools, open-source libraries, courses, the app you shipped at 2am. I want more of that in front of the people who would actually use it.</p><ul><li><p><strong>Banner/Top placement:</strong> a dedicated block right here, after the TLDR, with a thematic lead-in written by me ($200) . One sponsor per edition</p></li><li><p><strong>Small placement:</strong> new this month. If you&#8217;ve Built a tool, an app, a course, or an open-source project? One line, a link, and a small image for a fraction of the sponsorship price ($40) . Made for indie builders and small teams</p></li></ul><p>Reply to this email or write to <a href="mailto:bytesizeddesigninfo@gmail.com">bytesizeddesigninfo@gmail.com</a> and I will send over rates and open dates.</p><div><hr></div><h2>&#128165; Containment when the failing unit can talk</h2><p>The microservices instinct is right: one flaky agent should degrade one capability, and the task should finish anyway. The mechanics differ, because an agent fails in more ways than a service does. It can:</p><ul><li><p>Time out</p></li><li><p>Return garbage that parses</p></li><li><p>Return correct-looking output that ignored the instruction</p></li><li><p>Loop on a tool call forever, with every individual call succeeding</p></li></ul><p>Three containment mechanisms that survive the translation, in the order I would add them:</p><p><strong>1. Budgets before timeouts.</strong> A wall-clock timeout catches a hung inference. It misses the worker happily making its 40th tool call. Give every invocation a hard cap on tool calls and tokens, enforced by the harness rather than the prompt. When the budget trips, the orchestrator gets a structured &#8220;exhausted&#8221; result it can route around instead of a partial answer it will trust.</p><p><strong>2. Fallback routing in the model dimension.</strong> Services fall back to a replica. Agents get a second axis:</p><ul><li><p>Fall back to a cheaper model tier with a stricter prompt</p></li><li><p>Fall back to a smaller tool set</p></li><li><p>Fall back to a deterministic path (an extractive summary instead of a generated one)</p></li></ul><p>Design the degraded path before you need it, the same way you would design read-only mode for a database outage.</p><p><strong>3. Retries with a ceiling, only on classified failures.</strong> The <a href="https://bytesizeddesign.substack.com/p/understanding-retry-storms-what-they">retry storm</a> math is worse here because each retry is a full inference pass. Amplification bills you in dollars and seconds instead of connections.</p><ul><li><p>Retry on transport errors and rate limits</p></li><li><p>Do not retry &#8220;the output failed my validator&#8221; without changing something: the prompt, the model, or the inputs</p></li><li><p>Same call, same context, and you are paying to roll the dice again (more on why below)</p></li></ul><h2>&#129517; Pick an orchestration pattern on purpose</h2><p>Nobody ships microservices without a load balancer and service discovery. Nobody should ship multiple agents without deciding who is in charge. Three patterns cover most production systems today.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SDh_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SDh_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!SDh_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!SDh_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!SDh_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SDh_!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png" width="1200" height="629.6703296703297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:152376,&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://read.bytesizeddesign.com/i/215396292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SDh_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!SDh_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!SDh_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!SDh_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c63e33-c52b-4275-a73f-7d87d6c00a4a_2400x1260.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>(Router: one classifier fans a request to exactly one specialist. Orchestrator-worker: one capable model decomposes a task, dispatches to cheap parallel workers, and synthesizes. Supervisor: one model loops with a set of agents, re-planning after each result.)</p><p><strong>Router.</strong> A cheap classifier reads the request and forwards it to exactly one specialist, one hop with no synthesis step.</p><ul><li><p>Use for: support triage, intent routing in a product assistant, any case where the categories are known and the work per category is self-contained</p></li><li><p>Router model: your cheapest one, a fine-tuned classifier, or a regex if the categories are clean enough</p></li><li><p>Common mistake: letting the router &#8220;help&#8221; by adding context. It should classify and get out of the way</p></li></ul><p><strong>Orchestrator-worker.</strong> One capable model decomposes the task, dispatches subtasks to workers, and synthesizes the results. Workers are stateless, parallel, and can run on a different model than the orchestrator.</p><p>This is where the cost story lives:</p><ul><li><p>Orchestrator-tier and worker-tier models from the same vendor sit 5x to 15x apart on per-token price</p></li><li><p>In a decomposed task, most tokens are worker tokens</p></li><li><p>The number circulating in vendor write-ups this year is a 40 to 60 percent cost reduction versus running everything on the frontier model. Those write-ups are selling something, but the mechanism is sound</p></li><li><p>Anthropic&#8217;s public data point: an Opus lead with Sonnet subagents beat single-agent Opus by 90.2 percent on their research eval. The same post reports multi-agent runs burn ~15x the tokens of a chat interaction, which is the other half of that ledger</p></li></ul><p>Two rules for making it pay:</p><ul><li><p>Workers get a schema, an example, and a budget. Nothing else</p></li><li><p>The orchestrator sees results, never raw worker transcripts, or your context bill grows with every worker you add</p></li></ul><p><strong>Supervisor.</strong> A loop rather than a fan-out. One model holds the plan, calls an agent, reads the result, revises the plan, calls the next one.</p><ul><li><p>Sequential and stateful. The supervisor&#8217;s context accumulates every result</p></li><li><p>Use for: long-horizon tasks where step N depends on step N-1 (coding agents, migration tooling, multi-stage pipelines)</p></li><li><p>Wrong for: anything parallelizable. It turns a 4-second fan-out into a 40-second chain</p></li></ul><p>Most teams reach for supervisor first because it is easiest to reason about, then discover their task was a fan-out with a synthesis step and they have been paying sequential latency for nothing. Draw the dependency graph of your subtasks before you pick:</p><ul><li><p>Wide and shallow: orchestrator-worker</p></li><li><p>A chain: supervisor</p></li><li><p>One node: router, or no multi-agent system at all</p></li></ul><h2>&#128269; Nobody can trace this yet</h2><p>Distributed tracing is what made microservices operable. Fifteen years of Dapper, Zipkin, Jaeger, and OpenTelemetry mean a request ID follows a call through 30 services and the flame graph tells you which one ate the latency. <a href="https://bytesizeddesign.substack.com/p/the-engineers-guide-to-observability">The observability guide</a> covers the mechanics.</p><p>Agents need a stranger kind of trace. Latency per hop is the easy part. The questions that matter during an incident:</p><ul><li><p>Which agent decided to call this tool?</p></li><li><p>Based on what context?</p></li><li><p>Why did it pick that argument?</p></li></ul><p>A span that says <code>execute_tool: search_orders, 340ms</code> is useless when the bug is that the orchestrator hallucinated a customer ID two hops earlier.</p><p>The tooling is behind:</p><ul><li><p>As of this summer, every <code>gen_ai.*</code> attribute, span, and metric in the OpenTelemetry registry is still marked &#8220;Development&#8221;</p></li><li><p>The agent conventions (<code>invoke_agent</code>, <code>execute_tool</code>) and the MCP conventions were split into their own repository in June, with no tagged release as of mid-July</p></li><li><p>Vendors instrument against them anyway, so the schema you adopt today has a fair chance of changing under you</p></li><li><p>Datadog&#8217;s own <a href="https://bytesizeddesign.substack.com/p/how-datadog-taught-an-ai-to-investigate">AI incident investigator</a> needed bespoke instrumentation to make its reasoning auditable, and that is a company whose product is observability</p></li></ul><p>What to do in the meantime: log the full prompt and full output of every agent hop, keyed by a trace ID that flows through the whole task, into cheap storage with a short retention window. Crude and large, and the only thing that lets you replay a failed run. Anthropic&#8217;s research team landed in the same place: full production tracing was what let them diagnose failures, because runs are non-deterministic between attempts even with identical prompts.</p><p>Watch the OTel GenAI repo for a stable tag. Until then, own your schema and expect to migrate it.</p><h2>&#128680; Where the analogy breaks</h2><p>Forward the next three sections to whoever on your team is drawing the diagram.</p><h2>&#128184; The cost inversion</h2><p>Microservices decomposition is cheap at the seams. A gRPC hop is around a millisecond, so the architecture question is purely about ownership and blast radius.</p><p>An agent hop is a full inference pass with the entire subtask context re-encoded as input tokens:</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/agents-are-microservices-that-think">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[🔌 Stripe's Proxy Was Opening Hundreds Of Thousands Of Connections]]></title><description><![CDATA[A Go proxy, one connection per host, and 3,000 days of latency saved every day]]></description><link>https://read.bytesizeddesign.com/p/stripe-replaced-envoy-mesh-proxy</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/stripe-replaced-envoy-mesh-proxy</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Tue, 08 Sep 2026 15:36:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rD4s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a790b1-f82c-45b3-8da3-3d9e9f75c59d_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#129300;TL;DR</h2><p>Stripe ran Envoy for almost ten years, then replaced it with their own Go proxy, mesh-proxy. The payoff:</p><ul><li><p>~50% less CPU under high load, ~50% lower latency</p></li><li><p>~3,000 days of inter-service latency sa&#8230;</p></li></ul>
      <p>
          <a href="https://read.bytesizeddesign.com/p/stripe-replaced-envoy-mesh-proxy">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How AssemblyAI Collapsed Four Vendors Into A single API Key]]></title><description><![CDATA[TLDR A production voice feature in 2026 typically ships with four vendor relationships: a transcription API, a PII redaction step somebody built in a sprint, an LLM provider, and a compliance review stretched across all of it.]]></description><link>https://read.bytesizeddesign.com/p/how-assemblyai-collapsed-needing-four-vendors-to-summarize-a-phone-call</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/how-assemblyai-collapsed-needing-four-vendors-to-summarize-a-phone-call</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Fri, 28 Aug 2026 21:47:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c3fb4979-03b9-469a-a77c-5a70a4a52d82_600x300.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>TLDR</h2><p>A production voice feature in 2026 typically ships with four vendor relationships: a transcription API, a PII redaction step somebody built in a sprint, an LLM provider, and a compliance review s&#8230;</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/how-assemblyai-collapsed-needing-four-vendors-to-summarize-a-phone-call">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[GitHub's 8-Hour Outage Was Mostly Retries]]></title><description><![CDATA[One sidecar hit its ceiling. The clients did the other seven hours.]]></description><link>https://read.bytesizeddesign.com/p/github-outage-retry-storm-postmortem</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/github-outage-retry-storm-postmortem</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Wed, 19 Aug 2026 02:47:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jQzP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.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_!jQzP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jQzP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!jQzP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!jQzP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!jQzP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jQzP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:137178,&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://read.bytesizeddesign.com/i/211801451?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.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_!jQzP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!jQzP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!jQzP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!jQzP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9883a61-3b73-499a-9206-b70d96f74cf3_2400x1260.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>TLDR</h2><p>August 17. GitHub went sideways for 7 hours 47 minutes.</p><ul><li><p>~20% error rate on web and API traffic</p></li><li><p>~50% on archive and raw content downloads</p></li><li><p>Issues, Pull Requests, Actions, Copilot, SAML/OIDC, SCIM, and Team Sync all degraded</p></li><li><p>Copilot Token Service went from 7,000-9,000 RPS to 70,000-100,000 RPS</p></li></ul><p>One Istio sidecar pod in Central US hit its concurrency ceiling and failed to autoscale. That took down four HAProxy nodes, which took down the gateway auth path. Most of GitHub was back by 16:36 UTC and Actions by around 18:03. Copilot limped until 21:02, because a latent retry bug in VS Code turned a slow endpoint into a load generator running on millions of laptops.</p><p>The capacity problem was mitigated in the afternoon. The <a href="https://bytesizeddesign.substack.com/p/understanding-retry-storms-what-they">retry storm</a> it set off ran for another five hours.</p><h2>The sidecar nobody was scaling on</h2><p>Istio puts a proxy sidecar next to every service pod, and all traffic flows through it. You get mTLS and routing without touching application code. You also get a second set of concurrency limits per pod, sitting somewhere entirely different from the application&#8217;s.</p><p>The autoscaling policy watched the host service. When Central US hit a new traffic peak, the sidecar saturated first. The autoscaler read host metrics, saw headroom, and left the deployment alone.</p><p>A pod that cannot accept connections and cannot be replaced by more pods sheds load. Whatever sits in front of it eats the difference.</p><h2>The cascade, in order</h2><ol><li><p>Sidecar saturates, autoscaler does nothing.</p></li><li><p>Refused connections pile onto HAProxy in Central US.</p></li><li><p>Four HAProxy nodes exhaust their flow limits, one after another.</p></li><li><p>Those four front the gateway auth path, so auth latency climbs.</p></li><li><p>Callers waiting on a fast dependency start treating slow responses as failures.</p></li><li><p>Retry logic engages, and the auth path now gets more traffic than it did before it broke.</p></li></ol><p>Auth is the worst place in a system to lose capacity, because nearly every request touches it. GitHub knows this one well already: a <a href="https://bytesizeddesign.substack.com/p/how-a-43-second-network-issue-led">43-second network partition in 2018</a> cost them 24 hours of degradation, and the trigger was similarly small next to the blast radius.</p><h2>Recovery required breaking things harder</h2><p>Some failing traffic was moved out to Northern Virginia and served successfully there while the Central US network failure was debugged. Regional failover did its job for the bulk of user requests. The retry behavior travelled with the clients, so Northern Virginia inherited the herd along with the load.</p><p>The Central US fix is the interesting one. Pausing HAProxy on the saturated nodes, all four simultaneously, produced immediate broad recovery.</p><p>Staggering that pause would have pushed load onto whichever node was still accepting traffic and kept the saturation alive. A feedback loop has to be broken everywhere at once, which is an uncomfortable thing to do at 16:00 UTC on a Monday with 20% of your traffic already failing.</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/github-outage-retry-storm-postmortem">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Linear Skipped the Agent Frameworks and Wrote Their Own Harness]]></title><description><![CDATA[Shallow tools, just-in-time skills, and a defensible case for a custom harness]]></description><link>https://read.bytesizeddesign.com/p/linear-skipped-agent-frameworks-custom-harness</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/linear-skipped-agent-frameworks-custom-harness</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Mon, 10 Aug 2026 17:59:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Y6Hx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb3b94ec-eb9d-4e73-83d7-02141b45f28c_1400x820.svg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#9889;TLDR</h2><p>Linear Agent, the assistant that lives inside Linear, does most of its valuable work in ways nobody scripted, and that premise cuts against engineering instinct. The engineering effort went into&#8230;</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/linear-skipped-agent-frameworks-custom-harness">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How AI Agents Actually Talk to Each Other]]></title><description><![CDATA[And why "MCP vs A2A" is a fight that doesn't exist]]></description><link>https://read.bytesizeddesign.com/p/how-ai-agents-actually-talk-to-each</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/how-ai-agents-actually-talk-to-each</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Thu, 06 Aug 2026 06:31:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UMZA!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b64927-5de1-4edc-a245-b9b486e07503_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TLDR</strong><br>Three protocols. One of them isn&#8217;t really in the race anymore. MCP shipped in November 2024 and now has more than 10,000 servers. A2A shipped in April 2025. ACP shipped a month earlier, in March &#8230;</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/how-ai-agents-actually-talk-to-each">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Engineers Are Still Saying No For A Reason That Stopped Being True]]></title><description><![CDATA[Saying no used to be free. GitHub is noticing that for one class of change, the debate now costs more than just building the thing.]]></description><link>https://read.bytesizeddesign.com/p/your-sprint-planning-meeting-costs</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/your-sprint-planning-meeting-costs</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Mon, 20 Jul 2026 18:07:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UMZA!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b64927-5de1-4edc-a245-b9b486e07503_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>TLDR</h2><p>There is a shift happening across the industry, and GitHub&#8217;s engineering blog put a name on it last week: engineering&#8217;s oldest reflex is now misfiring on a specific class of work.</p><p>The argument goe&#8230;</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/your-sprint-planning-meeting-costs">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Your Homegrown System Was Right in 2018. It's a Liability Now.]]></title><description><![CDATA[Millions of batch jobs, migrated in 4 weeks, and nobody noticed]]></description><link>https://read.bytesizeddesign.com/p/netflix-deleted-their-batch-scheduler</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/netflix-deleted-their-batch-scheduler</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Mon, 13 Jul 2026 17:15:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!W-4H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>TLDR</h2><p>Netflix wrote Compute Managed Batch (CMB) in 2018 because nothing in the Kubernetes ecosystem did what they needed. Hierarchical tenants. Fair sharing. Capacity reservations. Priority queues. They built all of it themselves.</p><p>Seven years later, <a href="https://kueue.sigs.k8s.io/">Kueue</a> does all of that, plus the features CMB never shipped. So Netflix ripped out CMB&#8217;s queuing and scheduling logic and replaced it with Kueue. Millions of batch jobs moved over. The production migration took 4 weeks. Users did nothing and noticed nothing.</p><p>The interesting part is not the swap. It is how they decided when to stop maintaining their own thing, and how they migrated without ever exposing a new API to customers.</p><div><hr></div><h2>What CMB Actually Was</h2><p>CMB is a managed batch layer sitting on top of <a href="https://medium.com/netflix-techblog/titus-the-netflix-container-management-platform-is-now-open-source-f868c9fb5436">Titus</a>, Netflix&#8217;s container platform. Users submit jobs that run to completion. CMB queues them, orders them by priority, and enforces capacity per tenant.</p><p>The tenant model is a tree. Internal tenants are branches, they exist to group things and hold capacity for their subtree. Leaf tenants are where work actually lands, and only leaves have queues. An org might run one tenant for everything, or mirror its entire team structure in the tree.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W-4H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W-4H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp 424w, https://substackcdn.com/image/fetch/$s_!W-4H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp 848w, https://substackcdn.com/image/fetch/$s_!W-4H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp 1272w, https://substackcdn.com/image/fetch/$s_!W-4H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W-4H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp" width="1456" height="599" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:599,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47240,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://read.bytesizeddesign.com/i/206883814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W-4H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp 424w, https://substackcdn.com/image/fetch/$s_!W-4H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp 848w, https://substackcdn.com/image/fetch/$s_!W-4H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp 1272w, https://substackcdn.com/image/fetch/$s_!W-4H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb54e16c-5e95-48a4-a7d2-325467a555b4_2048x842.webp 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>Capacity came in two flavors:</p><p><strong>Reserved.</strong> A leaf tenant with a reservation partitions that capacity out of the hierarchy. Nobody else can take it. That guarantees throughput.</p><p><strong>Shared.</strong> The Compute team runs a global burst pool. Any tenant can pull from it. It is fair-shared across tenants.</p><p>Here is the flaw, and it is the flaw that eventually forced the rewrite. CMB fair-shared the pool <strong>at admission only</strong>. There was no preemption. Once a job was admitted, it ran to completion no matter how the demand picture changed underneath it. A tenant that got in early held its slice until it finished. Fair sharing that only applies at the door is not fair sharing. It is a queue with extra vocabulary.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WbCw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WbCw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp 424w, https://substackcdn.com/image/fetch/$s_!WbCw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp 848w, https://substackcdn.com/image/fetch/$s_!WbCw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp 1272w, https://substackcdn.com/image/fetch/$s_!WbCw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WbCw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp" width="1100" height="1615" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1615,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62870,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://read.bytesizeddesign.com/i/206883814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WbCw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp 424w, https://substackcdn.com/image/fetch/$s_!WbCw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp 848w, https://substackcdn.com/image/fetch/$s_!WbCw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp 1272w, https://substackcdn.com/image/fetch/$s_!WbCw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e8d9ff-2bef-42c9-aeac-3d1d149d4bc5_1100x1615.webp 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></p><p>The other cost was structural. CMB sat far away from the actual Kubernetes clusters. Titus federates jobs across cells, so CMB talked to one endpoint and stayed blissfully unaware of cluster topology. Great for simplicity. Terrible when you want to build preemption, because preemption is a scheduler-level concern and CMB was several abstraction layers above the scheduler. Every new feature meant re-implementing something Kubernetes already had a place for.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DNr8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DNr8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp 424w, https://substackcdn.com/image/fetch/$s_!DNr8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp 848w, https://substackcdn.com/image/fetch/$s_!DNr8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp 1272w, https://substackcdn.com/image/fetch/$s_!DNr8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DNr8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp" width="1100" height="609" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:609,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48286,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://read.bytesizeddesign.com/i/206883814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DNr8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp 424w, https://substackcdn.com/image/fetch/$s_!DNr8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp 848w, https://substackcdn.com/image/fetch/$s_!DNr8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp 1272w, https://substackcdn.com/image/fetch/$s_!DNr8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f77ee86-06fc-4f2c-ac80-a5cc9aca2dce_1100x609.webp 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></p><div><hr></div><h2>Why Kueue and Not the Others</h2><p>Netflix looked at YuniKorn and Volcano too. Both replace the pod scheduler. That was the disqualifier.</p><p>Titus has its own scheduling profiles. Swapping out kube-scheduler means fragmenting job placement, and fragmented placement means worse bin-packing, which means burning money on idle capacity. If you have ever watched a fleet run at 40% utilization because two schedulers disagreed about where things go, you know exactly what this costs. Netflix has <a href="https://read.bytesizeddesign.com/p/how-snap-cut-compute-costs-by-65">written before about how much compute efficiency is worth</a> at this scale.</p><p>Kueue does not touch pod scheduling. It sits above it and decides <em>whether</em> a job gets admitted, then hands the pods to the existing scheduler. That single design choice made it the only option that composed with what Netflix already ran.</p><p>The rest of the case was straightforward:</p><ul><li><p>Multi-tenant quota over heterogeneous hardware, which is table stakes when your fleet is a zoo of instance types</p></li><li><p>Works on <code>v1.Pod</code> and <code>batch/v1.Job</code>, and also on <code>RayJob</code> / <code>RayCluster</code> for the ML workloads coming down the pipe</p></li><li><p>Native preemption, all-or-nothing scheduling, topology-aware scheduling. All the things CMB wanted and never got</p></li><li><p>Real adoption momentum, which matters more than feature checklists over a five year horizon</p></li></ul><div><hr></div><h2>The Migration: Change Nothing the User Can See</h2><p>They called it Netflix Batch. Three tenets, and the first one is the one worth stealing:</p><ol><li><p><strong>Zero lift for CMB users.</strong> Completely transparent.</p></li><li><p>No regression in container launch rate or max throughput.</p></li><li><p>Replace CMB queuing and scheduling with Kueue.</p><p></p></li></ol>
      <p>
          <a href="https://read.bytesizeddesign.com/p/netflix-deleted-their-batch-scheduler">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[OpenAI's bug that hid inside a 100-picosecond window]]></title><description><![CDATA[How OpenAI stopped debugging like a doctor and started thinking like an epidemiologist and caught a race condition in the process.]]></description><link>https://read.bytesizeddesign.com/p/openais-bug-that-hid-inside-a-100</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/openais-bug-that-hid-inside-a-100</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Mon, 06 Jul 2026 19:05:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UMZA!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b64927-5de1-4edc-a245-b9b486e07503_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A crash that shouldn&#8217;t be possible.</p><p>A normal C++ function inside OpenAI&#8217;s Rockset service runs, finishes, and returns to garbage. Sometimes the saved return address on the stack is NULL. Sometimes the&#8230;</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/openais-bug-that-hid-inside-a-100">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Bug That Hid From Every Tool Cloudflare Had]]></title><description><![CDATA[Cloudflare found a race condition buried in one of Rust's most-deployed libraries, and the fix was four lines]]></description><link>https://read.bytesizeddesign.com/p/cloudflare-bug-that-hid-from-every-tool</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/cloudflare-bug-that-hid-from-every-tool</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Tue, 30 Jun 2026 17:31:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7XPh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ea24796-0c9a-4816-b626-6a241c2e7aa4_1999x1118.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>A quick update before we get into it.</strong></p><p>Last year, 230 of you took a survey about a tool to keep your system design knowledge sharp using real case studies like the ones we cover here, and to actually h&#8230;</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/cloudflare-bug-that-hid-from-every-tool">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The No-Nonsense Engineer’s Guide to Claude Skills]]></title><description><![CDATA[Every engineer on your team is using AI.]]></description><link>https://read.bytesizeddesign.com/p/the-no-nonsense-engineers-guide-to</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/the-no-nonsense-engineers-guide-to</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Wed, 24 Jun 2026 07:12:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UMZA!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b64927-5de1-4edc-a245-b9b486e07503_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every engineer on your team is using AI. Most of them are also re-explaining the same context from scratch every single session. Their stack, their conventions, their preferences, their constraints. &#8230;</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/the-no-nonsense-engineers-guide-to">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Netflix Engineers Never Ask "What Depends on This?" Anymore]]></title><description><![CDATA[How Netflix Killed the Worst Part of Being On-Call]]></description><link>https://read.bytesizeddesign.com/p/netflix-engineers-dependency-graph-oncall</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/netflix-engineers-dependency-graph-oncall</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Tue, 23 Jun 2026 07:45:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mIlz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff47d95f-44ae-4906-9c8e-68c4966e800e_799x747.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TLDR</strong></p><p>Netflix runs on thousands of microservices. When one breaks at 3am, the on-call engineer needs to know what depends on it, what it depends on, and whether the problem is local or upstream. That a&#8230;</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/netflix-engineers-dependency-graph-oncall">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How Discord Automates ScyllaDB Clusters at Scale]]></title><description><![CDATA[The framework that turned a 36-hour database operation into two hours of mostly waiting]]></description><link>https://read.bytesizeddesign.com/p/how-discord-automates-scylladb-clusters</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/how-discord-automates-scylladb-clusters</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Mon, 15 Jun 2026 06:30:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7de18428-f9ea-44c9-a59c-19905c15b0e0_3750x1500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TLDR</strong></p><p>Discord&#8217;s Persistence Infrastructure team runs every ScyllaDB cluster behind messages, channels, servers, and most of Discord&#8217;s user data. Dozens of clusters. Hundreds of nodes. Seven engineers.</p><p>For years, the tooling was a pile of Python and bash scripts that worked but required someone who remembered all the landmines. Standing up a full shadow cluster, a complete replica that mirrors production traffic so you can safety-test a new ScyllaDB release, took a day and a half of careful, sequential, do-not-screw-up-step-nine work.</p><p>They rebuilt it as the Scylla Control Plane (SCP): composable tasks, YAML-defined workflows, automatic retries, and resumable jobs. The same operation now takes under two hours, and most of that is the engineer doing something else while nodes bootstrap.</p><p>The interesting part isn&#8217;t that they automated database ops. It&#8217;s the specific shape of the automation, and three boring decisions that mattered more than any of the Rust.</p><div><hr></div><p><strong>Seven Engineers, Hundreds of Nodes</strong></p><p>ScyllaDB is Discord&#8217;s largest database by scope. We&#8217;ve covered how that data layer evolved before, <a href="https://read.bytesizeddesign.com/p/how-discord-indexes-trillions-of">How Discord Indexes Trillions of Messages</a> walked through the search side of the same infrastructure. The team that operates it is seven people.</p><p>That ratio sounds fine until you look at what &#8220;operating&#8221; actually means: rolling restarts after every config change, expanding clusters as servers fill up, rolling OS upgrades across hundreds of nodes with zero downtime, and validating every new ScyllaDB release on a shadow cluster before it touches production.</p><p>None of that is fire-and-forget. Each one demands careful sequencing, validation, and someone paying attention the entire time. We talked about why that kind of pre-production validation matters in <a href="https://read.bytesizeddesign.com/p/the-tech-leads-guide-to-load-testing">The Tech Lead&#8217;s Guide to Load Testing</a>, shadow clusters are basically load testing with real production traffic and real production stakes.</p><p>For years, Discord automated this the way most teams do: incrementally, under pressure, with no long-term plan. A Python script here, a bash script there. It worked. It also required deep institutional knowledge to run safely, and that&#8217;s the kind of debt that&#8217;s invisible until the one person who understands it is on vacation.</p><div><hr></div><p><strong>Three Ways the Old Scripts Failed</strong></p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/how-discord-automates-scylladb-clusters">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[MongoDB Taught Its Database to See the Future]]></title><description><![CDATA[How Atlas built a predictive auto-scaler that scales before your servers break a sweat]]></description><link>https://read.bytesizeddesign.com/p/mongodb-taught-its-database-to-see</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/mongodb-taught-its-database-to-see</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Mon, 01 Jun 2026 06:07:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Rx7L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b57a795-6630-4f5f-b44a-1f7016cba286_2580x1588.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>TLDR</h2><p>Reactive auto-scaling has a fundamental problem: by the time it kicks in, you&#8217;re already overloaded. The scaling operation itself takes several minutes. You&#8217;ve spent real money on degraded perfor&#8230;</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/mongodb-taught-its-database-to-see">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[When "Distributed Backup" Isn't Actually Distributed: Lessons From the Coinbase Outage]]></title><description><![CDATA[The May 2026 AWS thermal event, the latency-versus-resilience tradeoff that broke coinbase, and what happens when &#8220;distributed backup&#8221; isn&#8217;t actually distributed]]></description><link>https://read.bytesizeddesign.com/p/a-room-got-too-hot-and-coinbase-went</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/a-room-got-too-hot-and-coinbase-went</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Sat, 16 May 2026 19:15:36 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2ecc29c5-2ea0-4925-b36e-665d9d3d4e63_1440x757.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>TLDR</h2><p>23:50 UTC, Thursday, May 7 2026. A data center hall in Northern Virginia overheats. Cooling units in availability zone az4 give up. EC2 instances and EBS volumes start losing power inside the hour.</p><p>Coinbase goes dark. Seven hours. Trading, Prime, International, derivatives, balance updates, all gone. FanDuel goes down at 9pm ET right as Game 2 of Lakers-Thunder tips off. CME Direct logs go sideways for institutional traders.</p><p>Coinbase had multi-AZ on most of their stack. But not the matching engine. That one ran in a single zone, on purpose, for latency. They had a backup. The backup didn&#8217;t isolate from the failure the way it was supposed to.</p><p>This is a story about a tradeoff that finally got tested in production. And about the difference between high availability and disaster recovery, which is not the same thing, no matter how many architecture diagrams pretend otherwise.</p><div><hr></div><h2>What actually broke</h2><p>The root cause was not software. It was a building. Multiple chillers in a single data center hall failed. Temperatures climbed. AWS lost power to racks in availability zone use1-az4. EC2 instances and EBS volumes on those racks were physically damaged, not &#8220;marked unhealthy,&#8221; damaged.</p><p>AWS shifted traffic away from the zone, but recovery depended on getting cooling back online before they could safely bring damaged hardware up again. That took more than 20 hours. Cooling was stable at pre-event levels by 13:50 PT Friday afternoon.</p><p>This is the part of the story no architecture diagram makes visible. The internet still runs in buildings, and buildings can overheat.</p><p>If that framing sounds familiar, <a href="https://bytesizeddesign.substack.com/p/the-aws-october-20th-outage-dissection">the October 20, 2025 AWS outage</a> had the same shape from a different angle, 15 hours, 113 services, traced back to one empty DNS record. Different failure mode, same conclusion: at AWS&#8217;s scale, the failures that take down half the internet are rarely the ones you&#8217;d architect for.</p><div><hr></div><h2>The Coinbase tradeoff</h2><p>Here&#8217;s the part that matters for engineers.</p><p>Coinbase had multi-AZ. They said so plainly: most of their systems are designed to survive a single AZ failing. Most of them did.</p><p>The matching engine didn&#8217;t.</p><p>Rob Witoff, Head of Platform, was honest about why. The exchange runs in a single availability zone by design. Latency. Customer co-location. Real money on the line, measured in microseconds. Spreading it across zones would have meant accepting cross-AZ network hops on every order match. For an exchange that competes on speed, that is not a free trade.</p><p>So they made the call. Single AZ for the matching engine. And &#8212; this is the part everyone glosses over &#8212; they built a backup. A distributed copy of the exchange infrastructure, designed to take over if the primary zone died.</p><p>The backup did not work as expected.</p><p>Witoff was specific: &#8220;backup systems did not work as expected during the incident, extending the outage and forcing engineers to manually execute disaster recovery procedures.&#8221; Engineers had to develop, test, deploy, and validate a fix while the production system was on fire.</p><p>Kafka made it worse. Coinbase runs partitioned Kafka handling thousands of terabytes a day. That couldn&#8217;t fail over automatically either. It needed manual recovery. Balance streams lagged behind until replication caught up.</p><p>No data was lost. But seven hours of downtime is seven hours of downtime.</p><div><hr></div><h2>&#8220;Distributed backup&#8221; is not the same as &#8220;distributed&#8221;</h2><p>This is the lesson worth dwelling on.</p><p>A backup that depends on the same failure domain as the primary is not a backup. It is a copy.</p><p>Coinbase had a distributed copy of the exchange. But &#8220;distributed&#8221; without specifying what failure mode it survives is marketing. If your backup database lives in the same AZ as your primary, an AZ outage takes both. If your backup region depends on your primary region&#8217;s IAM control plane, a region outage takes both.</p><p>The principle generalizes brutally: <strong>your failover only works against failure modes you actually tested it against.</strong> Untested failover is not failover. It is a hypothesis.</p><p><a href="https://bytesizeddesign.substack.com/p/how-gitlab-lost-300gb-of-production">GitLab learned this the hard way in 2017</a>. When an engineer accidentally deleted 300GB of production data, they discovered their backup system had been broken for weeks. Five backup mechanisms. None of them worked. Different failure mode, same shape: a safety net that nobody had pulled on recently.</p><p>The Coinbase incident is the kinder version of the same story. Their backup existed. Their backup partially worked. But the bits that didn&#8217;t work showed up only under the specific conditions of the specific failure that actually happened, which is exactly the moment when you can&#8217;t afford to discover them.</p><p>If your DR plan has not been exercised in the last 90 days, treat it as untested.</p><div><hr></div><h2>High availability and disaster recovery are different problems</h2><p>Every time something like this happens, the postmortem comment section fills up with &#8220;they should have used multi-AZ.&#8221; This is half-right and entirely beside the point.</p><p>Multi-AZ is high availability. It protects you from a bad day in one zone. Coinbase already had it for most workloads.</p><p>Multi-region is disaster recovery. It protects you from a bad day in one region.</p><p>AWS treats availability zones as the failure domain for HA. They treat regions as independent on purpose. A thermal event in US-EAST-1 will not move your data to US-WEST-2 unless you have explicitly built that path, paid for the replication, tested the failover, and decided in advance who gets to push the button.</p><p>Most production systems need both. Most production systems have one.</p><p>The reason is cost. Cross-region replication is real money. Hot standby in a second region doubles your compute bill. And the day-to-day value of that spending is invisible, until the day the chillers fail, at which point the conversation stops being about budget and becomes about how fast you can recover.</p><p>This is the part where engineering leadership earns their salary. Resilience investments look expensive right up until the moment they look obvious.</p><div><hr></div><h2>How Coinbase actually recovered</h2><p>The recovery sequence is worth studying because it shows what disciplined incident response looks like under load.</p><p>When the matching engine came back, they did not just re-enable trading and let it rip. They staged it:</p><ol><li><p><strong>Cancel-only mode</strong> &#8212; let customers withdraw existing orders, but no new trades</p></li><li><p><strong>Auction mode</strong> &#8212; orders accumulate, no immediate matching, gives time to verify books are consistent</p></li><li><p><strong>Live trading</strong> &#8212; only after product-by-product health checks</p></li></ol><p>This is not glamorous. It is the engineering equivalent of bringing a power plant back online &#8212; slow, sequential, fully verified before each step. The temptation in a multi-hour outage is to fix the thing and flip the switch. Coinbase didn&#8217;t. They reconciled state first. No data was lost. That outcome is downstream of this discipline, not luck.</p><p>The public communication followed the same pattern. CEO Brian Armstrong posted within hours: &#8220;never acceptable.&#8221; Witoff followed with a technical thread giving the actual timeline, the actual root cause, the actual decision being revisited. No PR-speak. No &#8220;we are looking into it.&#8221; Specific.</p><p>That is what a <a href="https://bytesizeddesign.substack.com/p/writing-post-mortems-a-tech-leads">public post-mortem</a> looks like when the engineering org is the one writing it, not legal.</p><div><hr></div><h2>The SLA is not your business continuity plan</h2><p>One detail from the AWS side worth internalizing. The standard EC2 SLA pays out around 10% of monthly compute spend on impacted instances. That&#8217;s the entire compensation.</p><p>Lost revenue: not covered. Customer trust: not covered. Regulatory exposure: not covered.</p><p>The 2024 ITIC survey put hourly downtime cost above $300,000 for 90% of mid-to-large enterprises. 41% lose between $1M and $5M per hour. Trading and finance are higher still. Coinbase was down for seven hours during a quarter where they had also just announced a 14% workforce reduction and a $394M net loss. The 10% AWS service credit was not going to move that needle.</p><p>Your cloud provider&#8217;s SLA is a small refund. It is not insurance. It is not a business continuity plan. The continuity plan is something you build, fund, and test yourself, or you don&#8217;t have one.</p><div><hr></div><h2>Three things to do this week</h2>
      <p>
          <a href="https://read.bytesizeddesign.com/p/a-room-got-too-hot-and-coinbase-went">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How Slack Keeps a Team of AI Agents from Losing the Plot]]></title><description><![CDATA[Inside the three-channel context system behind slack's security investigations]]></description><link>https://read.bytesizeddesign.com/p/how-slack-keeps-a-team-of-ai-agents-smart</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/how-slack-keeps-a-team-of-ai-agents-smart</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Fri, 08 May 2026 07:42:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/aa6bf181-8aa3-478d-92e6-2c54c09c00c5_1861x1356.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>TLDR</h1><p>Hundreds of inference calls per investigation. Megabytes of agent output. A team of LLMs all working on the same alert, none of them sharing memory by default. That&#8217;s what Slack&#8217;s security investigation service has to wrangle every time an alert fires.</p><p>The agents don&#8217;t share a brain. The API is stateless. Stuff every transcript into every prompt and you blow the context window. Strip too much out and the agents drift, contradict each other, and stop sounding like a team.</p><p>Slack&#8217;s answer: stop pretending one shared context can do the job. Build three of them. Each agent reads the channel that fits its role.</p><p>It&#8217;s one of the cleanest examples I&#8217;ve seen of context engineering as a real discipline, not a vibe.</p><div><hr></div><h2>The setup</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SCCy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SCCy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp 424w, https://substackcdn.com/image/fetch/$s_!SCCy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp 848w, https://substackcdn.com/image/fetch/$s_!SCCy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp 1272w, https://substackcdn.com/image/fetch/$s_!SCCy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SCCy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp" width="842" height="1486" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1486,&quot;width&quot;:842,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:56902,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://read.bytesizeddesign.com/i/196873644?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SCCy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp 424w, https://substackcdn.com/image/fetch/$s_!SCCy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp 848w, https://substackcdn.com/image/fetch/$s_!SCCy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp 1272w, https://substackcdn.com/image/fetch/$s_!SCCy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ee6300-06a9-48cf-9552-72c8593870da_842x1486.webp 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>Slack runs security investigations with a team of agents. A <strong>Director</strong> orchestrates. A bunch of <strong>Experts</strong> go gather evidence using domain-specific tools. A <strong>Critic</strong> reviews what the Experts produced and flags the bits that don&#8217;t hold up.</p><p>Investigations move through phases. Each phase has rounds. There&#8217;s no fixed budget, the Director decides when to stop.</p><p>The dependency runs both ways. Each agent needs enough of the wider investigation to stay coherent with the team. But shove the full transcript into every prompt and two things happen: you hit the context window, and the agent starts drifting toward whatever the loudest voice in the history said. Confirmation bias dressed up as continuity.</p><p>Same problem every multi-agent system hits. They built three context channels to solve it.</p><div><hr></div><h2>Channel one: the Director&#8217;s Journal</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YUnS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YUnS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp 424w, https://substackcdn.com/image/fetch/$s_!YUnS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp 848w, https://substackcdn.com/image/fetch/$s_!YUnS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp 1272w, https://substackcdn.com/image/fetch/$s_!YUnS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!YUnS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp" width="1456" height="1061" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1061,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136440,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://read.bytesizeddesign.com/i/196873644?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YUnS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp 424w, https://substackcdn.com/image/fetch/$s_!YUnS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp 848w, https://substackcdn.com/image/fetch/$s_!YUnS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp 1272w, https://substackcdn.com/image/fetch/$s_!YUnS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bef376f-d75f-4446-91d0-87c46b837032_1536x1119.webp 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The Director keeps a journal. Not a chat log, but a structured one. Six entry types: decision, observation, finding, question, action, hypothesis. Every entry gets a phase, a round, a timestamp, a priority, and optional citations to evidence.</p><p>The journaling tool itself is dumb. It appends. The intelligence is in the prompt that tells the Director to use it constantly, and in the schema that forces every thought into a slot.</p><p>The Journal goes into every other agent&#8217;s prompt. It&#8217;s the spine. The Experts read it to understand what they&#8217;re being asked and why. The Critic reads it to understand what the Director was trying to prove.</p><p>Read enough Journal entries and you can watch the investigation think. One example from a real run: the Director starts by classifying an alert as a kernel module load, lists 4 expert domains it&#8217;ll need, notices the cgroup suggests a personal workstation, then realizes the alert is matching the <em>path</em> of a hook script rather than an actual modprobe call. By round five it&#8217;s preliminary-false-positive. By round seven it&#8217;s confirmed FALSE POSITIVE with all four Experts agreeing.</p><p>That progression is only legible because the Journal exists. Without it, you&#8217;d have a pile of disconnected expert outputs and no narrative.</p><p>This is the same shape of problem covered in a <a href="https://bytesizeddesign.substack.com/p/designing-ai-agents-that-think-in">previous edition on designing AI agents that think in real time</a>, different domain, but the structural answer is identical: give the orchestrator a working memory that everyone else can read.</p><div><hr></div><h2>Channel two: the Critic&#8217;s Review</h2>
      <p>
          <a href="https://read.bytesizeddesign.com/p/how-slack-keeps-a-team-of-ai-agents-smart">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>