<?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>Sun, 13 Sep 2026 22:52:13 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[🧱 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"><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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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"><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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>(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 saved every day</p></li><li><p>One connection per host, down from one per worker</p></li><li><p>New Ruby load balancing bought 15-20% more burst headroom</p></li></ul><p>Why rebuild at all??? Stripe targets 99.9995% reliability on infra carrying about 1.6% of global GDP. One API call fans out into many internal requests, so a few hundred microseconds in the data plane compounds fast.</p><p>The reason they left was connection count. The math is worth walking through even if you never touch a proxy.</p><p>Stripe can throw a team at making internal delivery this reliable. The same problem hits one hop out, when you&#8217;re pushing events to customers and their agents. Most teams start with a hand-rolled webhook sender, and it holds until retries, signing, idempotency, and fan-out turn it into a second product nobody wanted to own.</p><p>That&#8217;s where Svix (today&#8217;s sponsor) comes in.</p><div><hr></div><h2><strong><a href="https://link.svix.com/byte-siz-01">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://link.svix.com/byte-siz-01" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rD4s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a790b1-f82c-45b3-8da3-3d9e9f75c59d_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!rD4s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a790b1-f82c-45b3-8da3-3d9e9f75c59d_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!rD4s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a790b1-f82c-45b3-8da3-3d9e9f75c59d_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!rD4s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a790b1-f82c-45b3-8da3-3d9e9f75c59d_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rD4s!,w_2400,c_limit,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" width="1200" height="629.6703296703297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76a790b1-f82c-45b3-8da3-3d9e9f75c59d_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;:218513,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://link.svix.com/byte-siz-01&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://read.bytesizeddesign.com/i/214690378?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a790b1-f82c-45b3-8da3-3d9e9f75c59d_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_!rD4s!,w_424,c_limit,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 424w, https://substackcdn.com/image/fetch/$s_!rD4s!,w_848,c_limit,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 848w, https://substackcdn.com/image/fetch/$s_!rD4s!,w_1272,c_limit,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 1272w, https://substackcdn.com/image/fetch/$s_!rD4s!,w_1456,c_limit,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 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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://link.svix.com/byte-siz-01&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://link.svix.com/byte-siz-01"><span>Start sending webhooks today</span></a></p><div><hr></div><h2>&#128268; The connection math that broke Envoy</h2><p>Envoy runs one worker per CPU core, and under steady traffic each worker opens its own connection to every upstream it can reach. Connections scale with core count. Host count is irrelevant.</p><p>Two 8-core clients talking to two servers: every worker on both clients holds a connection to both servers, so each server carries 16 connections for just those two clients.</p><p>Now point that at a fleetwide service, say the pipeline ingesting tracing data from everything you run. It takes traffic from roughly every core in the fleet, so it holds roughly one connection per core company-wide. That&#8217;s hundreds of thousands. Discord hit the same class of problem from the other side when they <a href="https://bytesizeddesign.substack.com/p/how-discord-reduced-websocket-traffic">cut WebSocket traffic 40%</a> to keep connection overhead from swamping the gateway.</p><p>Two ways that bites:</p><ul><li><p>You size machines for connection count, not request load. Expensive for a service doing little real work.</p></li><li><p>Sockets pile up silently until one day there are too many, the service tips over, and you&#8217;re debugging an incident with no obvious cause.</p></li></ul><p>Stripe hit the second one.</p><h2>&#9888;&#65039; Every upgrade was a gamble</h2><p>Thousands of distinct services make Hyrum&#8217;s Law literal: with enough consumers, every behavior of the proxy is something a downstream depends on. A minor version bump ships a behavior change to all of them at once.</p><p>In 2024, an Envoy upgrade pulled in a new nghttp2 with a defense against the HTTP/2 rapid-reset attack. On default settings, that defense started rejecting legitimate traffic to one of Stripe&#8217;s services. A QA load test caught it before prod. Miss that catch and the first signal is real requests getting dropped, and one incident like that can spend the whole year&#8217;s reliability budget. Same reason <a href="https://bytesizeddesign.substack.com/p/netflix-is-chill-with-breaking-their">Netflix breaks their own services</a> on purpose: the regression you find in a load test is free.</p><p>That&#8217;s the standing tax of a shared proxy across a big, unusual fleet. You inherit every upstream change and find out in your own traffic whether it breaks you.</p><h2>&#128683; The feature they couldn&#8217;t ship</h2><p>Stripe&#8217;s Ruby services run on big, expensive machines. The team had a routing design to spread traffic more evenly across Ruby backends and shrink those machines. Building it into Envoy meant customizing past the point they&#8217;d maintain, so it sat on the shelf.</p><p>That&#8217;s the third, quietest cost of an adopted proxy: it caps what you can build in your own data plane. Every custom idea has to fit the extension points you&#8217;re given, and this one didn&#8217;t.</p><h2>&#128736;&#65039; What mesh-proxy does differently</h2><p>Mesh-proxy is Stripe&#8217;s Go replacement. It ships its own HTTP/1.1 and HTTP/2, talks straight to the service registry for discovery, and supports:</p><ul><li><p>Retries and hedging (fire a second request when the first is slow)</p></li><li><p>Rate limiting</p></li><li><p>Dynamic priority-based routing</p></li></ul><p>The core change is concurrency. Instead of one worker per core, mesh-proxy runs one read and one write goroutine per connection and multiplexes many requests over a single shared connection. Goroutines are cheap enough to spin up per connection without thinking about the cost. That flips the earlier math: one connection per host, where Envoy needed one per worker.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J79e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J79e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png 424w, https://substackcdn.com/image/fetch/$s_!J79e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png 848w, https://substackcdn.com/image/fetch/$s_!J79e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png 1272w, https://substackcdn.com/image/fetch/$s_!J79e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J79e!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png" width="1200" height="506.04395604395603" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:614,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:88033,&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/214690378?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.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_!J79e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png 424w, https://substackcdn.com/image/fetch/$s_!J79e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png 848w, https://substackcdn.com/image/fetch/$s_!J79e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png 1272w, https://substackcdn.com/image/fetch/$s_!J79e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18fc7f19-778f-4999-b6ca-6ea69333173c_1784x752.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Back to the two 8-core clients and two servers. After migrating, each client holds one connection per server, so each server carries two connections instead of sixteen. The tracing service that was drowning in sockets now fits on a smaller machine.</p><p>The tradeoff is real. Multiplexing over a shared connection means coordinating request state across goroutines, more work than letting each worker own its own. Stripe took that on because the connection savings paid for it.</p><p>They also dropped xDS (Envoy&#8217;s push-based config protocol) for reading the registry directly. Their Envoy setup generated more xDS updates than the topology actually changed, burning CPU and memory on every machine. One flooded service shows a step-drop in both the moment mesh-proxy rolled out.</p><h2>&#128200; What it bought them</h2><ul><li><p>Half the CPU under high load</p></li><li><p>~50% lower latency (that&#8217;s the 3,000-days-a-day figure)</p></li><li><p>The shelved Ruby load balancing shipped: 15-20% more headroom before a burst overwhelms a machine</p></li><li><p>A rewritten priority-routing system that unlocked changes across deployment and rate limiting</p></li></ul><p>Owning retries and hedging cuts both ways. Client-side retries are the classic path from a small hiccup to a <a href="https://bytesizeddesign.substack.com/p/understanding-retry-storms-what-they">retry storm</a> that takes the whole dependency down. With the retry budget in code Stripe&#8217;s own team reviews, they enforce it consistently. They also own getting it right.</p><h2>&#129300; The part I&#8217;d push back on</h2><p>Building in-house beat running battle-tested open source, and for Stripe that reads as true. It&#8217;s also the most expensive kind of true.</p><p>Look at the nghttp2 incident again. That upgrade existed because nghttp2&#8217;s maintainers built the rapid-reset defense, protecting against a protocol-level DDoS that hit the whole industry in 2023. Stripe got it as a free version bump. It broke them once, in QA, and they changed a config.</p><p>mesh-proxy has its own HTTP/2 now. When the next protocol-level HTTP/2 attack lands, and there&#8217;s always a next one, Envoy shops get a patch from people who do nothing but maintain that proxy. Stripe writes the patch. Every flow-control edge case and every future HTTP/2 CVE is theirs to find and fix, forever.</p><p>Defensible at 1.6% of global GDP and a 99.9995% target. Stripe has run this play before, including <a href="https://bytesizeddesign.substack.com/p/stripe-built-their-own-database-with">building their own database</a> instead of bending an existing one to their uptime number. The precondition is a team whose whole job is this one component, at a scale where 50% latency pays for that team many times over.</p><p>For almost everyone else it runs the other way. The connection math travels anywhere. The build decision is specific to Stripe&#8217;s scale and headcount: copy it without the scale and you get a worse Envoy only your team can debug. If your proxy is costing you money, measure how connections scale first, with cores or hosts, and whether a fleetwide service is quietly holding a socket for every core you own. That&#8217;s usually fixable in the proxy you already run.</p><h2>&#9989; What to check in your own mesh</h2><p>Before anyone pitches a rewrite, get three numbers:</p><ul><li><p><strong>Connections per upstream, and what they scale with.</strong> On a worker-per-core proxy, graph a fleetwide service&#8217;s open connections against fleet size rather than request rate. If the lines track, you have Stripe&#8217;s original problem right now.</p></li><li><p><strong>Config-update volume per machine.</strong> Push-based planes like xDS can send far more than the topology changed. Measure how much load is pure config churn you could delete.</p></li><li><p><strong>Where retry and hedging budgets live.</strong> Scattered across client libraries means nobody owns the total, and it only surfaces mid-outage.</p></li></ul><p>None of these need a new proxy. All three separate a data plane you understand from one that surprises you at 3am.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://stripe.dev/blog/building-a-data-plane-from-scratch-stripes-own-high-performance-distributed-proxy&quot;,&quot;text&quot;:&quot;Read More&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://stripe.dev/blog/building-a-data-plane-from-scratch-stripes-own-high-performance-distributed-proxy"><span>Read More</span></a></p><p></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"><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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>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"><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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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"><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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>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"><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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><h2>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"><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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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><item><title><![CDATA[HubSpot's 37-Minute Lesson in Why HTTP 200 Can Lie]]></title><description><![CDATA[The permission check that passed, the users who were locked out, and what monitoring for "availability" actually misses]]></description><link>https://read.bytesizeddesign.com/p/hubspots-37-minute-lesson-in-why</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/hubspots-37-minute-lesson-in-why</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Wed, 22 Apr 2026 16:34:15 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[<h3>TL;DR</h3><p>3:43 PM EST to 4:20 PM EST. 37 minutes. Every HubSpot customer lost the ability to click into contact, company, order, or project workflows in the UI. Deal-based and ticket-based workflows still worked. Every backend automation kept firing on schedule. No data lost. No execution missed.</p><p>And the whole thing flew under the radar because the endpoint that broke kept returning HTTP 200.</p><p>The incident monitoring didn&#8217;t catch it. The automated canary checks didn&#8217;t catch it. A 60-minute alert threshold meant the tests that <em>did</em> fail weren&#8217;t going to page anyone until well after customers had already flooded support.</p><p>This is a textbook case of the thing we keep writing about: your observability is only as good as what you&#8217;re actually measuring. If you&#8217;re measuring &#8220;did the server respond,&#8221; you&#8217;re going to miss every bug that makes the server respond <em>with the wrong answer.</em> HubSpot&#8217;s post-mortem is refreshingly direct about this, and there&#8217;s a clean lesson in it for anyone running permission systems, feature flags, or anything else where the shape of a correct response matters more than its existence.</p><p>If you&#8217;ve been around for <a href="https://bytesizeddesign.substack.com/p/cloudflares-july-2025-outage-the">the Cloudflare July 2025 outage breakdown</a> or the <a href="https://bytesizeddesign.substack.com/p/the-aws-october-20th-outage-dissection">AWS October 20th dissection</a>, this one will feel familiar. Different blast radius. Same category of failure.</p><div><hr></div><h3>So what actually happened?</h3><p>HubSpot was rolling out a permissions framework update. The goal was reasonable: replace a broad shared scope with narrower, object-type-specific scopes for contact, company, order, and project workflows. Tighter permissions, better isolation. Standard stuff.</p><p>The rollout had two pieces:</p><ol><li><p>Create the new permission scopes.</p></li><li><p>Promote the user role assignments that map those scopes to the right users.</p></li></ol><p>Piece one made it to production. Piece two didn&#8217;t.</p><p>The staging environment had both pieces, so staging worked. Production had scopes without role assignments, so production&#8217;s access-control system went looking for user-role mappings that didn&#8217;t exist. When it couldn&#8217;t find them, it did what permission systems are supposed to do: fail closed. Deny access.</p><p>From the access-control system&#8217;s perspective, this was correct behavior. Users were asking about permissions the system couldn&#8217;t verify, so the system returned a restrictive access level.</p><p>From the user&#8217;s perspective, their workflows vanished.</p><h3>The 200 that lied</h3><p>Here&#8217;s the part worth dwelling on. The access endpoint returned HTTP 200 the whole time. The server didn&#8217;t crash. It didn&#8217;t throw. It didn&#8217;t log an error. It just returned a technically-valid response that said &#8220;this user can barely do anything.&#8221; The frontend, doing its job, saw &#8220;barely anything&#8221; and hid the UI.</p><p>Most monitoring treats HTTP status codes as ground truth. 2xx is fine, 4xx is the client&#8217;s problem, 5xx pages the on-call. It&#8217;s a useful abstraction, and it&#8217;s wrong in exactly this scenario. The server is healthy. The payload is garbage.</p><p>We covered something very similar in <a href="https://bytesizeddesign.substack.com/p/how-twitch-caught-invisible-failures">how Twitch caught their invisible failures</a>&#8212;streams that terminated &#8220;successfully&#8221; from the server&#8217;s point of view while users saw nothing. Same failure mode, different domain. When correctness lives in the response body rather than the status line, your dashboards need to look inside the response.</p><h3>Why the canary didn&#8217;t save them</h3><p>HubSpot&#8217;s automated test suite <em>did</em> catch failures during the canary window. Those failures fired into a queue that was configured to wait 60 minutes before paging anyone.</p><p>Sixty minutes.</p><p>The deployment rolled out fully in 33 minutes. The entire incident lasted 37 minutes from first impact to rollback. The alerts would have arrived after the problem was already resolved.</p><p>Alert thresholds are a real tradeoff. Too tight and your on-call drowns in noise from flaky tests. Too loose and you get this. The right answer is rarely a single global threshold, it&#8217;s threshold <em>in context.</em> Failures during an active deployment window are categorically different from failures on a quiet Tuesday morning, and HubSpot is correctly calling that out in their remediation plan. Correlate the alerts with the deploys. Shrink the window to minutes during rollout.</p><p>This is the kind of instrumentation gap that shows up over and over in post-mortems. For more on how to actually write these documents well instead of just surviving them, <a href="https://bytesizeddesign.substack.com/p/writing-post-mortems-a-tech-leads">our tech lead&#8217;s guide to writing post-mortems</a> covers the framing that distinguishes a useful post-mortem from a corporate apology.</p><h3>The split-brain deployment</h3>
      <p>
          <a href="https://read.bytesizeddesign.com/p/hubspots-37-minute-lesson-in-why">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Slack Rebuilt Notifications for Millions of Users]]></title><description><![CDATA[Slack rebuilt its notification system from scratch, here's the architecture decision that made it possible without breaking millions of users.]]></description><link>https://read.bytesizeddesign.com/p/slack-rebuilt-notifications-for-millions</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/slack-rebuilt-notifications-for-millions</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Mon, 30 Mar 2026 01:14:20 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/dcac9027-7ac5-4833-ba12-f4db942ef784_1160x653.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Notification overload is one of the top three reasons users contact Slack support. Not security incidents. Not data loss. Ping anxiety.</p><p>That stat is embarrassing for a company whose product is literally communication. But what&#8217;s interesting isn&#8217;t the problem, it&#8217;s why it was so hard to fix.</p><h3><strong>The system wasn&#8217;t broken. It was incoherent.</strong></h3><p>Desktop and mobile had entirely separate preference systems that had grown apart over years. &#8220;Nothing&#8221; on mobile meant something different from &#8220;Off&#8221; on desktop. Not slightly different. Architecturally different. One disabled push notifications. The other disabled in-app badges too. Users changing settings on one device had no predictable effect on the other.</p><p>This is how trust erodes. Not with crashes. With settings that don&#8217;t do what you think they do.</p><p>The core design flaw was a tight coupling between <em>what</em> notifies you and <em>how</em> you get notified. If you wanted fewer interruptions on mobile, your only lever also killed in-app awareness. There was no way to say &#8220;show me everything in the sidebar but only push me for mentions.&#8221; You had to pick between overload or ignorance.</p><h3><strong>Four preference systems became one</strong></h3><p>The old prefs looked like this:</p><pre><code><code>desktop: everything | mentions | nothing   // Push on desktop
mobile:  everything | mentions | nothing   // Push on mobile</code></code></pre><p>The word &#8220;nothing&#8221; is doing dishonest work there. Users who chose it thought they&#8217;d gone quiet. They hadn&#8217;t &#8212; they still got in-app badges. They just didn&#8217;t know it.</p><p>The new model decouples the two concerns cleanly:</p><pre><code><code>desktop: everything | mentions // What activity to show
desktop_push_enabled: true | false // Whether to interrupt you
mobile: everything | mentions | nothing</code></code></pre><p><code>desktop_push_enabled</code> is new. Because it had no prior value in the database, the team could backfill every existing user based on whether they&#8217;d previously set &#8220;off&#8221;, no disruption, no migration emails, no support tickets. &#8220;Off&#8221; became &#8220;mentions with push disabled&#8221; at read time, which is exactly what it meant in practice anyway.</p><p>That&#8217;s a clean migration. Backwards compatible, rollback-safe, and behaviorally honest.</p><h3><strong>The real difficulty: millions of users, years of state</strong></h3>
      <p>
          <a href="https://read.bytesizeddesign.com/p/slack-rebuilt-notifications-for-millions">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How Uber Killed Hours-Old Data (And Why Your Batch Jobs Are a Liability)]]></title><description><![CDATA[What they found when they finally did the math on stale data.]]></description><link>https://read.bytesizeddesign.com/p/how-uber-killed-hours-old-data-and</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/how-uber-killed-hours-old-data-and</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Tue, 24 Mar 2026 05:16:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lkl9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>TLDR</h2><p>Hours-old data. Petabyte scale. Thousands of engineers making decisions on stale numbers.</p><p>Uber&#8217;s data lake powers Delivery, Mobility, Finance, Marketing Analytics, and Machine Learning for a company with hundreds of millions of users. For years, the ingestion layer ran on Spark batch jobs. Data arrived in the lake hours late. Sometimes a full day late.</p><p>That was fine when the business moved slowly. It stopped being fine when data freshness became a competitive bottleneck&#8212;when model iteration speed, real-time experimentation, and operational analytics demanded minutes, not hours.</p><p>So they rebuilt ingestion from scratch on Apache Flink. The result: freshness dropped from hours to minutes, compute costs dropped 25%, and the system now handles petabyte-scale streaming across thousands of datasets.</p><p>This is IngestionNext. And the problems they had to solve to get there are exactly the kind of problems most data teams quietly ignore until they can&#8217;t anymore.</p><div><hr></div><h2>The Dirty Secret About Batch Ingestion</h2><p>Here&#8217;s the thing nobody wants to say out loud: batch jobs are slow by design, and most teams have just accepted that as the cost of doing business.</p><p>You run a Spark job every hour. Maybe every 30 minutes if you&#8217;re ambitious. The job spins up, reads from Kafka or a transactional database, transforms the data, writes it to the lake. Then it tears down. An hour later, it does it all again.</p><p>At small scale this is totally fine. Predictable. Easy to debug. The operational overhead is low.</p><p>At Uber&#8217;s scale, hundreds of petabytes, thousands of datasets&#8212;those batch jobs were burning hundreds of thousands of CPU cores every day. Not because the work required that many cores. Because that&#8217;s how batch scheduling works. You provision for the peak, the peak is infrequent, and everything in between is wasted capacity.</p><p>And even if you ignore the cost problem, there&#8217;s no fixing the freshness problem. Batch is batch. If your job runs every hour, your data is up to an hour old. Period.</p><p>For model training, that&#8217;s a delay in experiment velocity. For fraud detection, that&#8217;s a window where bad actors operate undetected. For marketplace analytics, that&#8217;s a lag between what happened and when anyone can respond to it.</p><p>Uber looked at this and decided hours-old data was no longer acceptable. They needed minutes. That meant streaming.</p><blockquote><p>If you want to see how Uber&#8217;s data lake got to 350PB in the first place, and the replication problems that scale created, read <a href="https://bytesizeddesign.substack.com/p/how-uber-moved-1-petabyte-a-day-and">Inside Uber&#8217;s 350PB Data Lake: The Distcp Rewrite That 5x&#8217;d Performance</a>.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;ecef9490-62ae-427a-bd94-bb31d14e94a7&quot;,&quot;caption&quot;:&quot;TLDR 250 TB to 1 PB per day. One quarter. Daily replication jobs jumped from 10,000 to 374,000. Uber&#8217;s data lake hit 350 PB and their copy tool couldn&#8217;t keep up. The P100 SLA of 4 hours became a joke.&#8230;&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Inside Uber&#8217;s 350PB Data Lake: The Distcp Rewrite That 5x&#8217;d Performance&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:104689928,&quot;name&quot;:&quot;Byte-Sized Design&quot;,&quot;bio&quot;:&quot;Real talk about building systems that work. Career advice for growing engineers, how actual companies solve large-scale problems, post-mortems from things that broke, and the system design fundamentals that matter. No fluff, no buzzwords.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75986514-8b28-4199-95ab-d22806dd8fe1_228x228.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:100}],&quot;post_date&quot;:&quot;2026-02-11T20:46:19.711Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ead3563-41f5-4a1f-90ac-9b06292fc74b_1536x1003.avif&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://bytesizeddesign.substack.com/p/how-uber-moved-1-petabyte-a-day-and&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:187673109,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:9,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1499683,&quot;publication_name&quot;:&quot;Byte-Sized Design&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!UMZA!,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&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></blockquote><div><hr></div><h2>Why Flink, Not Just &#8220;More Spark&#8221;</h2><p>The obvious question: why not just run Spark Structured Streaming? It exists. It integrates with Kafka. Half the data ecosystem already knows how to use it.</p><p>Because Spark Structured Streaming still thinks in micro-batches. It&#8217;s better than full batch scheduling, but it&#8217;s not true streaming. You&#8217;re still dealing with the same fundamental model: accumulate records, process a chunk, commit.</p><p>Flink is a different mental model. It processes records as they arrive. Checkpoints are asynchronous, not tied to batch intervals. The state management is first-class. For continuous ingestion at this scale, Flink&#8217;s execution model is a better fit.</p><p>Uber already had Flink infrastructure. The ecosystem supported it. That made the decision easier, but the architecture challenges were anything but easy.</p><blockquote><p>Pinterest went through a similar reckoning with Spark at scale, rebuilding their entire Hadoop-based platform into a container-native Spark system. Worth reading alongside this one: <a href="https://bytesizeddesign.substack.com/p/how-pinterest-runs-spark-at-scale">How Pinterest Runs Spark at Scale with Moka</a>.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;a36cfc92-b286-409a-a131-d5531bf53ae1&quot;,&quot;caption&quot;:&quot;Pinterest&#8217;s old data platform was called Monarch. It ran on Hadoop. It powered everything from ad analytics to recommendation training.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;&#9889; How Pinterest Runs Spark at Scale with Moka&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:104689928,&quot;name&quot;:&quot;Byte-Sized Design&quot;,&quot;bio&quot;:&quot;Real talk about building systems that work. Career advice for growing engineers, how actual companies solve large-scale problems, post-mortems from things that broke, and the system design fundamentals that matter. No fluff, no buzzwords.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75986514-8b28-4199-95ab-d22806dd8fe1_228x228.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:100}],&quot;post_date&quot;:&quot;2025-10-07T07:53:29.278Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!UHvU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cec44d8-0e9b-487f-a49c-ab0c2307b899_1100x589.webp&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://bytesizeddesign.substack.com/p/how-pinterest-runs-spark-at-scale&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:175505751,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:6,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1499683,&quot;publication_name&quot;:&quot;Byte-Sized Design&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!UMZA!,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&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></blockquote><div><hr></div><h2>The Architecture</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lkl9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lkl9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif 424w, https://substackcdn.com/image/fetch/$s_!lkl9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif 848w, https://substackcdn.com/image/fetch/$s_!lkl9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif 1272w, https://substackcdn.com/image/fetch/$s_!lkl9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lkl9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif" width="1456" height="663" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:663,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:43197,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/avif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://bytesizeddesign.substack.com/i/191947351?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!lkl9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif 424w, https://substackcdn.com/image/fetch/$s_!lkl9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif 848w, https://substackcdn.com/image/fetch/$s_!lkl9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif 1272w, https://substackcdn.com/image/fetch/$s_!lkl9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0e1db2f-b775-4ab4-9f03-3ae686fb9fa1_1536x699.avif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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"><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"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Events arrive in Kafka. Flink jobs consume them continuously and write to the data lake in Hudi format.</p><p>Hudi is doing serious work here. It provides transactional commits, rollback support, and time travel queries on top of what would otherwise be raw Parquet files on object storage. When a Flink job fails mid-write, Hudi rolls back the uncommitted data. When someone wants to query data as of a specific timestamp, Hudi handles it.</p><p>Above the data plane sits a control plane that manages the job lifecycle across thousands of datasets. Create, deploy, restart, stop, delete&#8212;all automated. Configuration changes propagate without manual intervention. Health checks run continuously. This isn&#8217;t glamorous infrastructure work, but at Uber&#8217;s scale, &#8220;we have 4,000 ingestion jobs&#8221; means operations without a control plane is a full-time fire drill.</p><p>There&#8217;s also regional failover. If a region goes dark, ingestion jobs reroute or fall back to batch mode. No data loss. No manual intervention required.</p><p>The architecture isn&#8217;t surprising. The interesting parts are the problems that showed up once it was running.</p><div><hr></div><h2>Problem 1: Streaming Creates a Small File Nightmare</h2>
      <p>
          <a href="https://read.bytesizeddesign.com/p/how-uber-killed-hours-old-data-and">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[GitHub’s Elasticsearch Problem Was Seven Years in the Making. Here’s How They Finally Fixed It]]></title><description><![CDATA[Why the right fix wasn't available until now, and what they did in the meantime.]]></description><link>https://read.bytesizeddesign.com/p/githubs-elasticsearch-problem-was</link><guid isPermaLink="false">https://read.bytesizeddesign.com/p/githubs-elasticsearch-problem-was</guid><dc:creator><![CDATA[Byte-Sized Design]]></dc:creator><pubDate>Mon, 16 Mar 2026 06:51:44 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[<h3><strong>TL;DR</strong></h3><p>GitHub Enterprise Server runs search on Elasticsearch. It also runs High Availability with a primary/replica model. For years, those two things could not coexist cleanly. Elasticsearch would move a primary shard to the read-only replica node. If you then took down that replica for maintenance, the whole thing deadlocked. The replica waited for Elasticsearch to recover before it could start. Elasticsearch couldn&#8217;t recover until the replica rejoined.</p><p>GitHub engineers knew this was broken. They spent years trying to patch around it. It took until Elasticsearch shipped Cross Cluster Replication to actually fix it.</p><p>The fix is live in GHES 3.19.1. The lesson underneath it is older than GitHub.</p><div><hr></div><h3><strong>The Original Sin Was a Reasonable Decision</strong></h3><p>Let&#8217;s be precise about what went wrong here, because it&#8217;s easy to read this story as &#8220;Elasticsearch bad&#8221; when the real issue is more interesting.</p>
      <p>
          <a href="https://read.bytesizeddesign.com/p/githubs-elasticsearch-problem-was">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>