<?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[Engineering Chaos]]></title><description><![CDATA[Insights on the advanced engineering that makes modern security possible.]]></description><link>https://www.engineeringchaos.io</link><image><url>https://substackcdn.com/image/fetch/$s_!OieM!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec8c9863-e9a7-4221-a648-8ff83066cc65_1080x1080.png</url><title>Engineering Chaos</title><link>https://www.engineeringchaos.io</link></image><generator>Substack</generator><lastBuildDate>Wed, 29 Apr 2026 11:21:55 GMT</lastBuildDate><atom:link href="https://www.engineeringchaos.io/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Mike Saxton]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[engineeringchaos0x@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[engineeringchaos0x@substack.com]]></itunes:email><itunes:name><![CDATA[Mike Saxton]]></itunes:name></itunes:owner><itunes:author><![CDATA[Mike Saxton]]></itunes:author><googleplay:owner><![CDATA[engineeringchaos0x@substack.com]]></googleplay:owner><googleplay:email><![CDATA[engineeringchaos0x@substack.com]]></googleplay:email><googleplay:author><![CDATA[Mike Saxton]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Contextual Feeling]]></title><description><![CDATA[(or&#8230;The Third Axis: How AI Changes the Way We Think About Threat Detection)]]></description><link>https://www.engineeringchaos.io/p/contextual-feeling</link><guid isPermaLink="false">https://www.engineeringchaos.io/p/contextual-feeling</guid><dc:creator><![CDATA[Mike Saxton]]></dc:creator><pubDate>Mon, 30 Mar 2026 03:21:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2712e64d-9527-4c37-b07c-94bebb7422fb_428x241.webp" 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_!DaXB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DaXB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.webp 424w, https://substackcdn.com/image/fetch/$s_!DaXB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.webp 848w, https://substackcdn.com/image/fetch/$s_!DaXB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.webp 1272w, https://substackcdn.com/image/fetch/$s_!DaXB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DaXB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.webp" width="428" height="241" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:241,&quot;width&quot;:428,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12206,&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://www.engineeringchaos.io/i/192569072?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.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_!DaXB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.webp 424w, https://substackcdn.com/image/fetch/$s_!DaXB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.webp 848w, https://substackcdn.com/image/fetch/$s_!DaXB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.webp 1272w, https://substackcdn.com/image/fetch/$s_!DaXB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f89957e-8eb4-43a8-8a3b-5530a7570694_428x241.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>(Before we get going, I&#8217;ll open with a Wikipedia style opening and say this is an article is about the Z Axis, or <a href="https://en.wikipedia.org/w/index.php?title=Spherical_coordinate_system&amp;wprov=rarw1">Spherical coordinate system</a>. Not the other Axis (Disambiguation), your history book might discuss)</p><p>For years I&#8217;ve thought about threat detections on an XY axis. Speed on one side, accuracy on the other. The tradeoff between them is basically a a 1-slope or a 45-degree line &#8212; the faster a detection is to implement, the less accurate it tends to be, and vice versa. The goal has always been to find that sweet spot somewhere in the middle: not so fast that you&#8217;re drowning in noise, not so slow that you&#8217;re never confident in what you&#8217;re seeing.</p><p>That model held up for a long time. But I think AI has broken it &#8212; not by eliminating the tradeoff, but by adding a third dimension that the old model doesn&#8217;t account for.</p><div><hr></div><h2>The Original Two: Atomic and Machine Learning</h2><p>On one end of the spectrum you have atomic detections. Rules based on a specific, known data point &#8212; an IP address, a file hash, a registry key, a domain. Sigma rules live here. Emerging threat feeds live here. The value of atomic detections is that they&#8217;re deterministic: the same input produces the same output every time. If you write a rule that fires when it sees a specific IOC, and that IOC shows up, the rule fires. No ambiguity.</p><p>The tradeoff is tuning. Writing an atomic detection is fast. Getting it accurate &#8212; low false positive rate, properly scoped, not firing on legitimate traffic &#8212; takes real time. And the threat landscape changes fast enough that rules require constant maintenance to stay relevant. At the bare minimum of any detection program, atomic detections are where you start. They&#8217;re the foundation. But they have a ceiling.</p><p>On the other end you have machine learning. ML flips the tradeoff. It&#8217;s slow to implement &#8212; you need historical data, a trained model, ongoing monitoring for accuracy, drift detection over time &#8212; but once it&#8217;s running it can catch things that no rule would ever catch. Behavioral anomalies, subtle pattern shifts, activity that doesn&#8217;t match any known IOC but doesn&#8217;t look right either. The catch is that ML models are probabilistic. They&#8217;ll tell you something looks suspicious, and they&#8217;ll tell you how confident they are, but they won&#8217;t tell you definitively that it&#8217;s bad. Sometimes they&#8217;ll tell you they&#8217;re not very confident &#8212; and honestly, when they say that, they&#8217;re usually right to flag the uncertainty.</p><p>So for a long time the detection strategy question was: where on that spectrum do you want to live? Rules or models? Fast and deterministic, or slow and probabilistic? Or my favorite&#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZShA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZShA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZShA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZShA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZShA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZShA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg" width="625" height="625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:625,&quot;width&quot;:625,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:54631,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.engineeringchaos.io/i/192569072?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZShA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZShA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZShA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZShA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c10e7b-8649-4403-aaa9-2e8fcfbddfc8_625x625.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>AI Adds a Third Axis</h2><p>Here&#8217;s where I think the framing needs to change. When people ask where AI fits on that spectrum, they&#8217;re still thinking in two dimensions. And it doesn&#8217;t fit cleanly.</p><p>AI &#8212; specifically LLMs and agents &#8212; introduces a third variable: determinism.</p><p>Atomic detections are fully deterministic. Machine learning is probabilistic but bounded &#8212; the same model on the same data will give you a consistent confidence score. LLMs are non-deterministic by nature. The same prompt, given the same context, can produce different outputs. They can hallucinate. They can go down a reasoning path you didn&#8217;t intend. They can be confidently wrong. That&#8217;s not a flaw to work around &#8212; it&#8217;s a fundamental characteristic of the technology that has to be part of how you use it.</p><p>If speed and accuracy are the X and Y axes, determinism is the Z axis. And when you look at it that way, atomic detections, ML models, and AI each occupy a different point in three-dimensional space rather than sitting on the same line.</p><p>That reframing matters because it changes how you think about where each one belongs in your stack.</p><div><hr></div><h2>The Right Job for Each</h2><p>There&#8217;s an old saying: <em>quick, cheap, or easy &#8212; pick two</em>. Detection engineering strategy has always been a version of that problem. The third axis doesn&#8217;t solve it. It just makes the tradeoffs more explicit.</p><p>Atomic detections are deterministic, fast to deploy, and expensive to maintain at scale; ML models are probabilistic, slow to build, and better at catching what rules miss. AI is non-deterministic, fast at certain tasks, and genuinely bad at others.</p><p>The question isn&#8217;t which one wins. It&#8217;s which one is right for which job.</p><p>And I think the industry is currently overindexing on using AI as a detector and underinvesting in using AI as an operator.</p><p>Everyone has an agent that &#8220;monitors your network&#8221; or &#8220;finds threats&#8221; or &#8220;reasons over your alerts.&#8221; And some of that is real. But an agent is a feature, not a strategy. Buying a tool that uses AI to detect things doesn&#8217;t answer the harder question of what your detection strategy actually is.</p><div><hr></div><h2>Why the Layered Approach Works</h2><p>In most security conversations <em><strong>cough</strong> RSA <strong>cough</strong></em> I think there&#8217;s a point that often gets missed: AI doesn&#8217;t work well in a vacuum. It works well when it has context.</p><p><a href="https://www-cdn.anthropic.com/58284b19e702b49db9302d5b6f135ad8871e7658.pdf">Anthropic published a post on how their own teams use Claude Code internally</a>. They noted that moving to test-driven development &#8212; writing tests before writing code &#8212; produced more reliable, testable output from Claude. The insight isn&#8217;t just that TDD is good engineering hygiene. It&#8217;s that giving the AI a defined structure to work within, with clear constraints and expected outcomes, makes the output meaningfully better.</p><p>Using AI for detection engineering works the same way. When you ask an AI agent to &#8220;find the bad stuff in our network,&#8221; you&#8217;re giving it almost no structure to work within. When you ask it to write a Sigma rule for a specific TTP, validate it against known-good traffic, and map it to an ATT&amp;CK technique &#8212; you&#8217;ve given it a test. You&#8217;ve given it constraints. You&#8217;ve given it a definition of correct. The output is better because the problem is better defined.</p><p>The atomic detection layer and the ML layer aren&#8217;t just detection mechanisms. They&#8217;re also the context that makes AI effective when you bring it in. Your existing Sigma rules tell AI what you already know how to detect. Your ML models tell AI what behavioral baselines look like. Together they give AI the constraints it needs to do useful work &#8212; whether that&#8217;s filling coverage gaps, tuning thresholds, or reasoning over anomalies that don&#8217;t match any existing rule.</p><p><a href="https://research.google/blog/mle-star-a-state-of-the-art-machine-learning-engineering-agents/">Google Research released a paper called MLE-STAR</a>, a state-of-the-art machine learning engineering agent capable of automating various machine learning tasks. The whole premise is that getting better results from ML isn&#8217;t about replacing the model &#8212; it&#8217;s about giving it better inputs, better structure, and better feedback loops. AI can now help do that work. Which means the ML layer you already have can get materially better without starting over.</p><div><hr></div><h2>Where AI Actually Changes Things</h2><p>The most underrated use of AI in detection right now isn&#8217;t finding threats. It&#8217;s keeping your detection program running.</p><p>Think about what actually breaks down in most detection programs over time. Sigma rules go stale because no one has time to rewrite them when a TTP evolves. ML models drift because the data they were trained on no longer reflects current attacker behavior. The ATT&amp;CK matrix gets updated and the coverage gaps don&#8217;t get addressed because mapping detections to TTPs manually is slow and nobody&#8217;s priority.</p><p>AI is genuinely good at all of those maintenance tasks. Writing a Sigma rule from a threat report is something an LLM can do well and fast. Identifying which existing rules are likely to need updates based on new threat intelligence is something an LLM can reason over. As mentioned, Google has published research on using AI to tune machine learning models &#8212; adjusting hyperparameters, identifying drift, improving precision &#8212; that points at a future where the model-building loop is itself partially automated.</p><p>The non-determinism that makes AI unreliable as a standalone detector becomes much more manageable when a human is reviewing the output before it goes into production. A Sigma rule that an LLM drafts and a human reviews is better than a Sigma rule nobody had time to write. A tuning recommendation from an AI assistant that an engineer validates is better than a model running on stale parameters because nobody got to it.</p><p>The way I&#8217;m starting to think about this: AI&#8217;s role in detection isn&#8217;t to replace the atomic layer or the ML layer. It&#8217;s to be the engine that keeps both of them current, calibrated, and aligned to the actual threat landscape.</p><div><hr></div><h2>The Framework in Practice</h2><p>If you think about a mature detection program through this lens, you end up with something like:</p><p>Atomic detections for what you know. Fast, deterministic, high-confidence when tuned. AI writes and maintains them &#8212; turning threat reports into rules, flagging stale coverage, mapping new TTPs to existing logic.</p><p>Machine learning for what you don&#8217;t know yet. Probabilistic, behavioral, better at catching novel activity. AI helps tune it &#8212; adjusting models, monitoring drift, identifying where the training data needs to be refreshed.</p><p>AI agents for what requires reasoning over context. Correlating signals across sources, generating hypotheses, helping analysts work through ambiguous alerts. Used with appropriate skepticism about confidence and with human review in the loop.</p><p>None of these replace the others. They cover different parts of the problem, and AI shows up differently in each one.</p><h2>My Lukewarm AI Take</h2><p>I&#8217;m optimistic about what AI can do for threat detection programs. I&#8217;m much more skeptical about how we&#8217;re talking about it right now &#8212; as if deploying an AI agent is itself a detection strategy.</p><p>The teams that will get the most out of AI aren&#8217;t the ones that replace their detection program with it. They&#8217;re the ones that use it to do the unglamorous work that detection programs actually need: keeping rules current, keeping models calibrated, keeping coverage aligned to what adversaries are actually doing.</p><p>That&#8217;s not as exciting a demo as an agent that finds threats. But it&#8217;s the thing that actually makes detection programs better over time.</p><div><hr></div><p><em>Engineering Chaos is about applying modern data engineering to rethink how security teams build and operate their data infrastructure. As always, views are mine. You can share them but I don&#8217;t know why you&#8217;d want to.</em></p>]]></content:encoded></item><item><title><![CDATA[Fodder on the Feuding Format Fracas is Fitting For Finding Final Boss Forensics]]></title><description><![CDATA[or...Why We Chose Hudi for Cybersecurity Data. In Part 1 we covered serialization. Now the part everyone actually argues about.]]></description><link>https://www.engineeringchaos.io/p/fodder-on-the-feuding-format-fracas</link><guid isPermaLink="false">https://www.engineeringchaos.io/p/fodder-on-the-feuding-format-fracas</guid><dc:creator><![CDATA[Mike Saxton]]></dc:creator><pubDate>Wed, 25 Mar 2026 14:28:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AUzG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Part 2 of 2 - <a href="https://www.engineeringchaos.io/p/a-super-cereal-post-about-serialization">You can read about Avro selection here in part 1</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AUzG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AUzG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AUzG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AUzG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AUzG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AUzG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg" width="750" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:750,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78622,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.engineeringchaos.io/i/192098500?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AUzG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AUzG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AUzG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AUzG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3661c82d-4dc2-4831-8e98-90a4dca2625e_750x500.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://buffalonews.com/sports/professional/nfl/bills/article_48f8f48c-8bc8-419a-a085-5c68bb579965.html">Source</a></figcaption></figure></div><div><hr></div><p><a href="https://iceberg.apache.org">Iceberg</a>, <a href="https://delta.io">Delta Lake</a>, and <a href="https://hudi.apache.org">Hudi</a> are all solid <a href="https://en.wikipedia.org/wiki/Analytics">table formats</a>. For most use cases any of them will serve you well &#8212; the differences only start to matter at the edges. This post is about our edges, and why we landed where we did.</p><h2>What We Needed the Table Layer to Do</h2><p>Before evaluating anything, we wrote down the requirements specific to our platform. Not features &#8212; but the actual behaviors we needed in production. A few of them are below:</p><ul><li><p><strong>Continuous streaming ingest.</strong> Detection latency starts at the table layer. We couldn&#8217;t afford a batch-oriented architecture.</p></li><li><p><strong>Upserts.</strong> Security events change after they land. Threat intel enrichment, identity correlation, analyst annotations &#8212; a record that arrives at T+0 might look very different by T+60 seconds. The table format needed to handle that cleanly.</p></li><li><p><strong>Incremental processing.</strong> When a new detection rule is written, we backfill it against historical data. Reprocessing the full dataset every time isn&#8217;t viable at our scale. We needed &#8220;give me everything that changed since timestamp X&#8221; as a native operation.</p></li><li><p><strong>Timeline and auditability.</strong> In security, when a record arrived and what it looked like before enrichment are forensic questions, not optional metadata. We needed that built into the table, not maintained separately.</p></li><li><p><strong>Avro compatibility.</strong> We covered the serialization decision in <a href="https://www.engineeringchaos.io/p/a-super-cereal-post-about-serialization">Part 1</a>. The table format needed to work with it. </p></li></ul><div><hr></div><h2>Iceberg</h2><p>Iceberg&#8217;s metadata architecture is well-designed. Hidden partitioning, partition evolution without rewriting data, snapshot isolation, and broad engine support across <a href="https://spark.apache.org">Spark</a>, <a href="https://flink.apache.org">Flink</a>, <a href="https://trino.io">Trino</a>, <a href="https://www.dremio.com">Dremio</a>, and <a href="https://www.snowflake.com/en/">Snowflake</a>. If you need multiple query engines reading the same tables, Iceberg is the most credible answer right now.</p><p>Where it didn&#8217;t fit us: Iceberg was built for read-heavy analytical workloads on stable data. Streaming upserts at high ingest rates require careful engineering to avoid small file accumulation. Record-level incremental consumption isn&#8217;t a native primitive. For a different team with a read-dominated workload, Iceberg would be a strong choice. For our workload, we&#8217;d have been building around its edges rather than with them.</p><div><hr></div><h2>Delta Lake</h2><p>Delta Lake&#8217;s foundation is solid &#8212; ACID transactions on <a href="https://parquet.apache.org">Parquet</a>, a reliable transaction log, clean MERGE support. If your stack is heavily Databricks or Spark, staying in that ecosystem has real operational advantages.</p><p>Two things didn&#8217;t fit us. First, our streaming layer isn&#8217;t uniformly Spark, and Delta Lake&#8217;s design reflects its Spark origins in ways that created friction we didn&#8217;t want to carry. Second, Change Data Feed &#8212; Delta&#8217;s mechanism for incremental consumption &#8212; works, but it was added after the fact to an architecture not originally designed around changelogs. For a workload where incremental processing is load-bearing, we wanted something where that model was native.</p><div><hr></div><h2>Why Hudi</h2><p>Hudi was built around a specific use case: continuous ingest, records that change after landing, consumers that only want to process what changed. That&#8217;s a good description of what we were building and a pretty good description of world we live in for Security Engineering. Some of the key features of Hudi that were attractive to us are:</p><ul><li><p><strong>The timeline.</strong> Hudi maintains an ordered, atomic log of every action taken against a table &#8212; commits, compactions, cleanings, rollbacks &#8212; with precise timestamps. For us this serves as forensic infrastructure. When an analyst needs to know what a table looked like at the time of an incident, or when a record was modified and what it contained before, the timeline has it. We&#8217;re not maintaining a separate audit system alongside the data.</p></li><li><p><strong>Upserts.</strong> Records are identified by a primary key. When a new version arrives, Hudi handles the merge without a full partition rewrite. An EDR event lands, gets enriched with threat intel 15 seconds later, gets annotated with a case ID 45 seconds after that &#8212; three upserts, one record, handled as intended behavior.</p></li><li><p><strong>Merge on Read and Copy on Write.</strong> Hudi lets you choose a storage type per table. MoR writes delta logs for updates and merges at read time &#8212; low write latency, right for high-velocity ingest. CoW rewrites files on every upsert &#8212; faster reads, right for tables being queried constantly. We run our ingest tables on MoR and our analyst-facing tables on CoW after compaction. Matching the storage model to the access pattern per table is genuinely useful.</p></li><li><p><strong>Incremental queries.</strong> A consumer specifies a point on the timeline and gets back exactly what changed since then. No full scans, no manual offset tracking. New detection rules backfill by walking the timeline in chunks. Downstream processes that fell over during an incident resume from where they stopped.</p></li><li><p><strong>Avro.</strong> Hudi uses Avro as its internal record representation in the versions we&#8217;re running. Schema evolution and field resolution are consistent between the serialization layer and the table layer, which is what we were aiming for when we made the Part 1 decision.</p></li></ul><div><hr></div><h2>Tradeoffs We Knew Going In</h2><p>Hudi requires more operational configuration than Delta Lake. Compaction scheduling, cleaning policies, timeline retention, index types &#8212; the defaults are a starting point, not a final answer. Plan for ongoing tuning.</p><p>Iceberg has broader query engine support. If non-Spark engines are a hard requirement, check Hudi&#8217;s current compatibility list before committing.</p><p>MoR tables accumulate delta logs between compaction runs. If compaction falls behind ingest, read performance degrades. It&#8217;s manageable but it needs monitoring.</p><p>None of these changed the decision. They were costs we could see and plan for.</p><div><hr></div><h2>Where This Leaves Us</h2><p>We chose Hudi because our specific requirements &#8212; streaming ingest, upserts, incremental processing, and a native timeline &#8212; mapped to what it was built for. Iceberg and Delta Lake are both good. They were just better fits for different workloads than ours.</p><p>So, that&#8217;s the whole analysis. The right format for your stack depends on your requirements. These were ours.</p><div><hr></div><p><em>Engineering Chaos is about applying modern data engineering to rethink how security teams build and operate their data infrastructure. As always, views are mine. You can share them, but I don&#8217;t know why you&#8217;d want to.</em></p>]]></content:encoded></item><item><title><![CDATA[A Super Cereal Post About Serialization]]></title><description><![CDATA[Evaluating and picking a serialization format for true real-time threat detection]]></description><link>https://www.engineeringchaos.io/p/a-super-cereal-post-about-serialization</link><guid isPermaLink="false">https://www.engineeringchaos.io/p/a-super-cereal-post-about-serialization</guid><dc:creator><![CDATA[Mike Saxton]]></dc:creator><pubDate>Tue, 17 Mar 2026 00:32:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ekhP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Part 1 of 2</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ekhP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ekhP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ekhP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ekhP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ekhP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ekhP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg" width="1920" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1280,&quot;width&quot;:1920,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:0,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ekhP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ekhP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ekhP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ekhP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b5ee09-399b-464a-bce1-5f7945d22c40_1920x1280.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>Stream vs batch. Kappa vs Lambda. Copy on Write vs Merge on Read. These are all things security engineers think about (ok, maybe just me and a handful of others?) but they are functions of a high-performance data system. I have a feeling these words will become more common parlance in the security engineering space as security and data engineering teams begin to merge. </p><p>In building real-time systems, we needed to decide how they would be built. For our users, they need to see high-performance results &#8212; sub-minute detections on petabyte-scale data. What we didn&#8217;t want them to see, well worry about really, was any of the words I opened with.</p><p>So this will be a 2-part post on our thinking and selection process. This post will cover serialization formats and the following will cover table formats. There&#8217;s no &#8220;right&#8221; answer here &#8212; for 90% of use cases most of the capabilities will work. The remaining 10% is on how your platform performs, and that&#8217;s what we&#8217;ll dive into.</p><p>This is the story of why we chose Apache Avro as our serialization format for cybersecurity data and why we felt this was important for what we do.</p><div><hr></div><h2>The Inherent Problem with Cybersecurity Data</h2><p>Cybersecurity data is not like analytics data. It is not like transactional data. It is not like IoT sensor data. It is its own uniquely chaotic beast, and while the data itself isn&#8217;t that unique, when combining it into a system-of-systems, that&#8217;s where things begin to get weird.</p><p>But here&#8217;s what makes it different:</p><p><strong>Your schemas are someone else&#8217;s decision.</strong> And they aren&#8217;t all that stable. Elastic is on Version 9 of their product and Version 8 of the Elastic Common Schema (ECS) as an example (correlation, causation, all of that). This isn&#8217;t a dig on Elastic &#8212; in fact they led the way here in my opinion &#8212; but I&#8217;ll selfishly use the example to say cybersecurity schema management is just a mess. When an EDR vendor pushes an agent update and a field you&#8217;ve been relying on for 18 months is renamed, split into two fields, or now carries a nested object where a string used to live, it breaks things fast. </p><p><strong>Your data sources multiply constantly.</strong> At any given time you&#8217;re ingesting from endpoint agents, network taps, cloud provider audit logs, identity providers, SaaS security APIs, threat intelligence feeds, and whatever new tool the IT team just bought. Each one has its own schema and none of them agreed on a standard before publishing.</p><p><strong>Volume spikes are tied to incidents.</strong> When something is actively on fire, your ingest rate can jump 10x in seconds. That is exactly the wrong moment to be debugging a schema mismatch.</p><p><strong>Late-arriving data is the norm, not the exception.</strong> Security logs get buffered, re-routed, and delayed by the very controls they&#8217;re monitoring. You cannot assume your stream is ordered or complete.</p><p>We like to say cybersecurity data is always in motion. It&#8217;s not about compacting it (that&#8217;s important), it&#8217;s not about decreasing storage volume (that&#8217;s important too), but specifically for streaming analytics it&#8217;s about taming the chaos into something close to manageable.</p><div><hr></div><h2>Why JSON and CSV Don&#8217;t Scale Here</h2><p>JSON is everywhere in security. Almost every API returns it. Almost every vendor exports it. And it is a genuinely terrible choice for a high-throughput data pipeline at scale.</p><ol><li><p><strong>To start, its verbose.</strong> Every record carries its own field names. When you&#8217;re processing millions of events per second, you are paying a real compute and storage cost to repeat the string "<em>sourceIpAddress</em>" on every single row.</p></li><li><p><strong>It has no schema contract.</strong> JSON is whatever the producer decided to send. There is no enforcement, no evolution tracking, no compatibility guarantee. One bad producer can silently corrupt a downstream table with no warning.</p></li><li><p><strong>It&#8217;s slow to parse at volume.</strong> Text-based parsing is expensive. When you&#8217;re doing stream analytics on high-velocity threat detection pipelines, that cost compounds fast.</p></li></ol><p>CSV is even worse &#8212; no types, no nesting, and a comma in the wrong string field becomes your entire afternoon.</p><p>As we started looking towards streaming data we needed something binary, something schematized, and something built to handle change over time. That points squarely at the three main contenders: Protocol Buffers, Thrift, and Avro.</p><div><hr></div><h2>Avro vs Protobuf vs Thrift: Why Avro Wins for This Domain</h2><p>Protobuf and Thrift are excellent serialization formats. They&#8217;re fast, compact, and widely adopted. But they carry a critical assumption: the schema lives in compiled code.</p><p>In a product company with stable, versioned APIs, that&#8217;s fine. In a security data platform ingesting from dozens of external sources that you don&#8217;t control, it&#8217;s a liability.</p><p>When a vendor changes their schema, you cannot wait for a code review, a build pipeline, and a deployment to resume ingestion. You need to adapt in the data layer, not the application layer.</p><p>Avro makes a fundamentally different architectural choice: the schema travels with the data, registered in a schema registry, and resolved at read time. This single design decision unlocks everything that makes Avro the right choice for cybersecurity pipelines.</p><h3>Schema Evolution That Actually Works</h3><p>Avro has first-class support for schema evolution with well-defined compatibility rules. You can:</p><p>&#9;&#8729;&#9;<strong>Add a field with a default value</strong> &#8212; old readers ignore it, new readers see it. Fully backward compatible.</p><p>&#9;&#8729;&#9;<strong>Remove a field that has a default</strong> &#8212; new readers use the default when reading old data. Fully forward compatible.</p><p>&#9;&#8729;&#9;<strong>Rename a field using aliases</strong> &#8212; old data maps to the new name transparently.</p><p>This is a disciplined contract. And it means that when your EDR vendor renames process_name to process.executable.name in their next agent release, your pipeline doesn&#8217;t break &#8212; you update the schema, register the new version, define the alias, and data keeps flowing.</p><p>In cybersecurity, schema evolution isn&#8217;t a nice-to-have. It&#8217;s an operational requirement.</p><h3>The Schema Registry as a Source of Truth</h3><p>When you pair Avro with a schema registry (Confluent Schema Registry, AWS Glue Schema Registry, or similar), something really cool happens: your schema becomes a governed, versioned artifact.</p><p>Every producer registers its schema before writing. Every consumer fetches the schema by ID embedded in the message. Compatibility rules are enforced at write time &#8212; not discovered at query time.</p><p>For a security data platform, this means:</p><p>&#9;&#8729;&#9;Lineage becomes traceable. You know exactly what schema version produced any given record.</p><p>&#9;&#8729;&#9;Breaking changes are caught at ingestion, not when an analyst runs a query at midnight during an incident.</p><p>&#9;&#8729;&#9;New data sources are onboarded with a schema contract, not just a hope that the fields stay consistent.</p><p>&#9;&#8729;&#9;Security analysts get consistency across every vendor. When CrowdStrike, SentinelOne, and Microsoft Defender all land in the same table with normalized, schema-enforced field names, analysts stop memorizing vendor-specific quirks and start writing detection logic that actually works across your entire endpoint fleet.</p><p>This is data engineering discipline applied to one of the most schema-volatile domains that exists. And it changes the operational posture of the whole platform.</p><div><hr></div><h2>What This Means for Stream Analytics</h2><p>The payoff is in your detection pipelines. When every event flowing through your Kafka topics is Avro-encoded with a registered schema, your stream processors gain superpowers:</p><ul><li><p><strong>Enrichment is predictable.</strong> When you join an authentication event against a user identity store, you know exactly what fields are available and what types they carry. No defensive null checks for fields that might or might not exist depending on the source.</p></li><li><p><strong>Multi-source correlation works cleanly.</strong> When you&#8217;re correlating a process execution event, a network connection event, and a file write event to detect lateral movement, all three sources are speaking the same schematized language. You can join them confidently.</p></li><li><p><strong>Schema drift is observable.</strong> When a new schema version is registered, you can alert on it, review it, and decide whether it&#8217;s backward compatible before it affects downstream consumers. Schema changes become change management events, not surprises.</p></li><li><p><strong>Historical backfills don&#8217;t break.</strong> When you need to reprocess 90 days of events against a new detection rule, you&#8217;re reading Avro records where the schema is embedded in the data. Old records still deserialize correctly even after the schema has evolved.</p></li></ul><div><hr></div><h2>The Honest Tradeoffs</h2><p>Avro is not perfect and we have found a few things out along the way.</p><p>Schema registry dependency is real. If your registry is unavailable, producers and consumers that require online schema resolution will fail. You need to treat your schema registry with the same operational care as your message broker. Cache schemas aggressively. Build for registry outages.</p><p>Binary formats are harder to debug. When a JSON record is malformed you can read it. When an Avro record is malformed you need tooling to inspect it. Invest early in good observability and deserialization debugging utilities.</p><p>Schema governance requires discipline. The power of a schema registry is only realized if your teams actually use it. Producers that bypass the registry and write raw JSON or unregistered Avro undermine the whole model. We tried this early on and saw a massive decrease in performance.</p><div><hr></div><h2>Where This Leaves Us</h2><p>We chose Avro because cybersecurity data is defined by change &#8212; vendors change schemas, new sources get added, the threat landscape forces new data types into existence. A serialization format that cannot evolve gracefully is a serialization format that becomes a liability.</p><p>Schema evolution gives us the operational resilience to keep pipelines running when the data changes. The schema registry gives us the governance foundation that makes the whole platform trustworthy. And the analyst on the other end gets consistent, predictable data regardless of which vendor generated it.</p><p>That foundation is what makes the table format argument in our next post even possible to have. When the serialization layer is solid, you can focus on optimizing how data is stored and queried &#8212; rather than constantly firefighting schema breakage.</p><div><hr></div><h2>Up Next &#8212; Part 2: The Table Format Wars</h2><p>We evaluated Iceberg, Delta Lake, and Hudi. We ultimately chose Hudi because for our stack it worked. As I mentioned earlier, for 90% of use cases the differences won&#8217;t matter much &#8212; but for the 10% left, that&#8217;s where our decision was made.</p>]]></content:encoded></item></channel></rss>