<?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[The Intermediate Catch Event]]></title><description><![CDATA[Think of this Substack like an intermediate catch event in BPMN — a pause in the flow, waiting for something relevant. Each post aims to be that trigger: a concept, or a practical impulse that moves your understanding of process automation a step forward.]]></description><link>https://blog.itsmestefanjay.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!ejxI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe3e2488-65e3-4b2b-9f3d-923f2793349c_596x596.png</url><title>The Intermediate Catch Event</title><link>https://blog.itsmestefanjay.dev</link></image><generator>Substack</generator><lastBuildDate>Fri, 13 Nov 2026 09:50:51 GMT</lastBuildDate><atom:link href="https://blog.itsmestefanjay.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Stefan Schultz]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[theintermediatecatchevent@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[theintermediatecatchevent@substack.com]]></itunes:email><itunes:name><![CDATA[Stefan Schultz]]></itunes:name></itunes:owner><itunes:author><![CDATA[Stefan Schultz]]></itunes:author><googleplay:owner><![CDATA[theintermediatecatchevent@substack.com]]></googleplay:owner><googleplay:email><![CDATA[theintermediatecatchevent@substack.com]]></googleplay:email><googleplay:author><![CDATA[Stefan Schultz]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Under Pressure: How Camunda 8 Absorbs Load]]></title><description><![CDATA[How Zeebe Backpressure Works, And How It Compares To Camunda 7]]></description><link>https://blog.itsmestefanjay.dev/p/under-pressure-how-camunda-8-absorbs</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/under-pressure-how-camunda-8-absorbs</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 29 Oct 2026 09:01:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gn5S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.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_!gn5S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gn5S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!gn5S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!gn5S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!gn5S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gn5S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2385341,&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://theintermediatecatchevent.substack.com/i/220527889?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gn5S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!gn5S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!gn5S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!gn5S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34041e0e-6777-48b6-87b1-871862aefee7_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Under Pressure (AI, 2026)</figcaption></figure></div><p>I tripped over back-pressure while load-testing our Camunda cluster on STACKIT. In the end we tuned the exporter and left the broker&#8217;s flow-control settings at their defaults. If you want the measurements, they&#8217;re in <a href="https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-5-what-it?r=5i6h9p">Part 5 of the series</a>. What stayed with me was the mechanism. While we were building there was never time to look at it properly, so this article does.</p><p>The question underneath: when a client sends one more command, who decides whether the system takes it, and what happens when the answer is no? Camunda 7 and Camunda 8 answer that in very different places. Camunda 7 lets the infrastructure around the engine answer: the web container, the connection pool, the database, none of which was built to say no on purpose, so the engine accepts the call, writes the work down and slows until something times out. Camunda 8 answers inside the engine. It rejects early and lets the client retry. It has to, because a log-based engine that buffered without limit would turn overload into unbounded latency and, eventually, a full disk. One gap remains with Self-Managed defaults, where the export backlog is bounded only by the disk. More on that under circuit 2.</p><p>I checked the code and config defaults against 8.10.4, the latest release as I write this; older versions may differ. The Camunda 7 side comes from its docs and how it&#8217;s built. I didn&#8217;t load-test it for this article.</p><h2>Where You Come From; An Async Call To Camunda 7</h2><p>To keep the comparison fair I&#8217;ll stick to one Camunda 7 setup: a remote engine in Camunda Run, called over REST, with an async continuation on the start event, so a call only persists state and returns. External task workers fetch and lock their work. That is the closest thing Camunda 7 has to Camunda 8&#8217;s command plus job worker model, so whatever differs comes from the engines.</p><p>The call goes through the web container into the engine, which writes the instance and its job to the database, commits and responds. From there the job executor moves the instance forward, and workers fetch, lock and complete their tasks against the same database. The call itself is cheap, so the REST endpoint should stay responsive while the job table fills up behind it, and nothing in the engine looks at that backlog before taking the next call. When the database or the connection pool can&#8217;t keep up, calls get slower and then fail with timeouts or server errors. The client never gets a signal it can act on. Camunda&#8217;s best-practices guidance describes no admission control in the engine; where it mentions throttling, it means protecting the services the engine calls.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UyDE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UyDE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png 424w, https://substackcdn.com/image/fetch/$s_!UyDE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png 848w, https://substackcdn.com/image/fetch/$s_!UyDE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png 1272w, https://substackcdn.com/image/fetch/$s_!UyDE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UyDE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png" width="1456" height="448" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:448,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:217359,&quot;alt&quot;:&quot;An external task worker calls Camunda Run on a virtual machine through its HTTP threads. The engine writes through a shared connection pool to one relational database, which holds history, runtime and the job queue, and job threads pick up queued jobs from it and hand them back to the engine. Hourglasses mark the HTTP threads, the connection pool and the job threads.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/220527889?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="An external task worker calls Camunda Run on a virtual machine through its HTTP threads. The engine writes through a shared connection pool to one relational database, which holds history, runtime and the job queue, and job threads pick up queued jobs from it and hand them back to the engine. Hourglasses mark the HTTP threads, the connection pool and the job threads." title="An external task worker calls Camunda Run on a virtual machine through its HTTP threads. The engine writes through a shared connection pool to one relational database, which holds history, runtime and the job queue, and job threads pick up queued jobs from it and hand them back to the engine. Hourglasses mark the HTTP threads, the connection pool and the job threads." srcset="https://substackcdn.com/image/fetch/$s_!UyDE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png 424w, https://substackcdn.com/image/fetch/$s_!UyDE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png 848w, https://substackcdn.com/image/fetch/$s_!UyDE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png 1272w, https://substackcdn.com/image/fetch/$s_!UyDE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80d5cf7-6480-4174-9222-0b2985e82451_2567x790.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The Camunda 7 reference setup: a remote engine in Camunda Run, with the places where load waits.</em></figcaption></figure></div><h2>The Path Of A Command In Camunda 8</h2><p>A client sends a command to the gateway, which routes it to the leader of one partition. The leader appends the command to the partition's log, replicates it to the followers and waits until it's committed. Then the stream processor reads the command back, executes it, writes the follow-up records and answers the client. Exporters read the same log afterwards and copy it into secondary storage, where Operate, Tasklist and the search APIs find it, and the log can only be compacted behind the slowest of those exporters and the latest snapshot.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lTYt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lTYt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png 424w, https://substackcdn.com/image/fetch/$s_!lTYt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png 848w, https://substackcdn.com/image/fetch/$s_!lTYt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png 1272w, https://substackcdn.com/image/fetch/$s_!lTYt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!lTYt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png" width="1456" height="451" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/816c9542-01c7-402e-9626-660f7d709a87_1791x555.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:451,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131097,&quot;alt&quot;:&quot;A client talks to the gateway of a Zeebe broker on Kubernetes. The gateway passes commands to a partition, the processor answers back through the gateway and keeps state in RocksDB, and an exporter copies the partition to an OpenSearch cluster&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/220527889?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A client talks to the gateway of a Zeebe broker on Kubernetes. The gateway passes commands to a partition, the processor answers back through the gateway and keeps state in RocksDB, and an exporter copies the partition to an OpenSearch cluster" title="A client talks to the gateway of a Zeebe broker on Kubernetes. The gateway passes commands to a partition, the processor answers back through the gateway and keeps state in RocksDB, and an exporter copies the partition to an OpenSearch cluster" srcset="https://substackcdn.com/image/fetch/$s_!lTYt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png 424w, https://substackcdn.com/image/fetch/$s_!lTYt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png 848w, https://substackcdn.com/image/fetch/$s_!lTYt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png 1272w, https://substackcdn.com/image/fetch/$s_!lTYt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816c9542-01c7-402e-9626-660f7d709a87_1791x555.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>A simplified view of one broker in our STACKIT setup, from client to exporter.</em></figcaption></figure></div><p>There is no shared database. State is split into partitions, each with a single writer, and work sits in order in an append-only log instead of in rows that compete for locks.</p><p>Two things matter from here on. The command is written before it&#8217;s executed, so the broker always holds work it has accepted and not answered yet. And processing and export share the log, so a slow reader at the end holds disk at the start.</p><h2>Three Circuits And A Pause</h2><p>Four independent mechanisms decide when the broker says no. Three of them are circuits that watch load, each at a different point: the commands in flight, the export behind them and the disk under both. The fourth is a pause, new in 8.10 and unrelated to load, so it comes last.</p><h3>Circuit 1; The In-Flight Limit</h3><p>Circuit 1 is about latency. Per partition, the leader counts the user commands it has accepted and not answered yet. A command is in flight from the moment it&#8217;s written until it has been processed, committed and answered. Once the count reaches the limit, new commands are rejected immediately.</p><p>The client sees <code>RESOURCE_EXHAUSTED</code> over gRPC, or a <code>503</code> over REST. Not a <code>429</code>. The gateway has no limiter of its own, and for commands that can go to any partition it tries the next partition before giving up, while a command pinned to one partition, through a correlation key for example, goes straight back to the client.</p><p>Commands that finish or cancel work are exempt. Completing or failing a job still goes through above the limit, because work already inside has to be able to leave. Throwing a BPMN error from a job and updating job retries are not exempt, so workers can see rejections on those two calls. Unlike the next circuit, this one is on by default.</p><p>Camunda 7 caps concurrency through the size of the web container and the connection pool. Whoever sized the pools set that cap without meaning to. It works by making callers wait and knows nothing about how far behind the engine is. Starts, worker fetches and completions all queue for the same connections.</p><h3>Circuit 2; The Write Rate And Exporter Lag</h3><p>Circuit 2 is a limit on records written per second, with an optional throttle that shrinks that rate as the unexported backlog grows. Past an acceptable backlog, by default 100k records, the allowed rate drops in proportion. It rejects client commands, and it also slows the broker&#8217;s own scheduled writes and processing results, so the whole partition runs at the exporter&#8217;s pace.</p><p>It&#8217;s <strong>off by default in Self-Managed</strong> and on in SaaS. With it off, the first circuit only sees processing and commit, so it can stay quiet while the export backlog grows behind it. The log keeps growing and clients get no pushback until the disk runs low.</p><p>If you run Self-Managed, export lag needs its own alert.</p><p>I&#8217;d turn it on when export is your constraint and you can&#8217;t make export cheaper. If export keeps up with everything the engine accepts, the throttle caps a rate nothing ever reaches. We never turned it on: we were exporting too much data, and changing what got exported fixed it. From 8.9 the switch lives under one prefix:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;398351b9-2b95-42cd-8c61-96ad4844e128&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">camunda:
  processing:
    flow-control:
      write:
        enabled: true
        limit: 1000 # example rate, not a default
        throttle:
          enabled: true</code></pre></div><p>In 8.6 to 8.8 the same settings sit under <code>zeebe.broker.flowControl.write.*</code>. The rate is yours to set, and I wouldn&#8217;t trust a default number, because the docs disagree on it.</p><p>Camunda 7 has nothing like circuit 2. Runtime and history live in the same database, so there&#8217;s no separate export path to fall behind.</p><h3>Circuit 3; Free Disk Space</h3><p>Circuit 3 watches free disk, and the broker checks it every second. By default, below 2 GB free it rejects every client command and pauses processing, and below 1 GB it stops accepting replicated events too: the log refuses to grow and compacts what it can. Both recover on their own once space is back.</p><p>The disk fills because processing and export share one log, and a stuck exporter keeps it growing however healthy processing looks. Circuit 2 is the earlier, gentler version of circuit 3. Alert on how fast the volume fills as well as how full it is, because under load the log can reach the watermark quickly.</p><p>In Camunda 7 the database itself is the buffer, with no watermark the engine respects, so I&#8217;d expect a full database to end in failed transactions.</p><h3>The Pause; Leadership Rebalancing</h3><p>The pause isn&#8217;t a circuit, because it doesn&#8217;t watch load at all. In 8.10, when a partition hands its leadership to another broker during a coordinated rebalance, it freezes its log. It rejects every write, internal ones included, so the new leader has a fixed log position to catch up to. Clients get the same <code>RESOURCE_EXHAUSTED</code> or <code>503</code>, with a message saying the partition is paused for a leadership transfer.</p><p>The pause ends when the transfer succeeds or fails, and if it runs too long a watchdog makes the old leader step down. Only one partition pauses at a time, and only when someone triggers a rebalance; a crash, a normal leader election or a rolling update leaves the log alone. So if you see a short burst of rejections on one partition and nothing else looks loaded, check whether somebody just rebalanced the cluster.</p><p>Camunda 7 has no leadership to hand over, so there&#8217;s nothing to pause.</p><h2>How The In-Flight Limit Moves</h2><p>There is no fixed number of in-flight commands. The limit moves with what the partition observes, and an algorithm decides how.</p><p><code>AIMD</code><strong> is the default and a good one, and most setups never need to change it.</strong> It grows the limit by one while the partition is busy and answers in time, and cuts it by 10% when a command takes longer than the default request timeout of 200 ms. It only grows while the partition is at least half full. By default it starts at 100 and moves between 1 and 1,000. As far as I can tell, it&#8217;s also the only one you can point at a latency target. If you do touch something, change that request timeout before you change the algorithm. Both sit in the snippet below.</p><p><code>AIMD</code> and <code>Vegas</code> are TCP congestion-control algorithms. <code>Gradient</code> and <code>Gradient2</code> are Netflix&#8217;s own, from their concurrency-limits library, which builds on the same TCP ideas. A partition limiting unanswered commands has the same problem as a TCP connection limiting unacknowledged packets.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cytE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cytE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png 424w, https://substackcdn.com/image/fetch/$s_!cytE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png 848w, https://substackcdn.com/image/fetch/$s_!cytE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png 1272w, https://substackcdn.com/image/fetch/$s_!cytE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!cytE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png" width="1456" height="552" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:552,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:101722,&quot;alt&quot;:&quot;The six backpressure algorithms in Camunda 8, what each one watches, and when it makes sense, with AIMD as the default&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/220527889?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The six backpressure algorithms in Camunda 8, what each one watches, and when it makes sense, with AIMD as the default" title="The six backpressure algorithms in Camunda 8, what each one watches, and when it makes sense, with AIMD as the default" srcset="https://substackcdn.com/image/fetch/$s_!cytE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png 424w, https://substackcdn.com/image/fetch/$s_!cytE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png 848w, https://substackcdn.com/image/fetch/$s_!cytE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png 1272w, https://substackcdn.com/image/fetch/$s_!cytE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6e6be3-307e-4938-bfe6-a05f1b131d18_1640x622.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Camunda&#8217;s docs give no guide for choosing between them, so the last column is my reading, not Camunda&#8217;s. <code>Fixed</code> makes sense in a benchmark, where you want the limit out of the equation. The docs also suggest it when the node&#8217;s clock is unreliable. I&#8217;d look at <code>Gradient2</code> if your baseline latency drifts, on shared storage or a busy network for example. <code>Legacy Vegas</code> mimics the old Zeebe defaults, for keeping old behavior on an upgraded cluster. Switching is one line, and <code>AIMD</code>&#8217;s timeout sits right next to it:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;adc5471b-b8e6-4de0-8652-1a81bb1058a8&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">camunda:
  processing:
    flow-control:
      request:
        algorithm: aimd # fixed, vegas, gradient, gradient2, legacy-vegas
        aimd:
          request-timeout: 200ms # the default</code></pre></div><p>In 8.8 and earlier the setting lives under <code>zeebe.broker.flowControl.request.*</code>, or <code>zeebe.broker.backpressure.*</code> on older clusters. The nearest Camunda 7 equivalent is a thread pool size you set once and hope still fits under load.</p><h2>Two Systems, Two Contracts</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qxh2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qxh2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png 424w, https://substackcdn.com/image/fetch/$s_!qxh2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png 848w, https://substackcdn.com/image/fetch/$s_!qxh2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png 1272w, https://substackcdn.com/image/fetch/$s_!qxh2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!qxh2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png" width="1456" height="748" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:748,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:135141,&quot;alt&quot;:&quot;How a remote, asynchronous Camunda 7 engine and a Camunda 8 broker differ under load, from who accepts work and what the client sees to where excess work waits, how limits adapt, export lag, a full disk and scaling out&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/220527889?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="How a remote, asynchronous Camunda 7 engine and a Camunda 8 broker differ under load, from who accepts work and what the client sees to where excess work waits, how limits adapt, export lag, a full disk and scaling out" title="How a remote, asynchronous Camunda 7 engine and a Camunda 8 broker differ under load, from who accepts work and what the client sees to where excess work waits, how limits adapt, export lag, a full disk and scaling out" srcset="https://substackcdn.com/image/fetch/$s_!qxh2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png 424w, https://substackcdn.com/image/fetch/$s_!qxh2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png 848w, https://substackcdn.com/image/fetch/$s_!qxh2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png 1272w, https://substackcdn.com/image/fetch/$s_!qxh2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83839d7-64e0-4c82-aa3f-d0c50b57a8c6_1640x842.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In this setup an accepted request means the same thing in both products: the work is persisted.</p><p>Camunda 8 builds a backlog too: jobs waiting for workers. None of the circuits watches your workers. Where the two differ is command admission, and what that makes the client responsible for.</p><p>If you&#8217;re coming from Camunda 7, this is where old habits bite. Against a Camunda 8 broker, a rejected request is normal operation. A retry loop, timeout or alert built for a system that waits does the wrong thing against one that says no. A client that treats <code>RESOURCE_EXHAUSTED</code> as a failure gives up on work the broker would have taken shortly after, and an alert on every 503 fires whenever the broker does its job.</p><h2>Summary</h2><p>The client owns the retry now, and the Java client leaves most of it to you. Its job workers back off on their own when polling gets rejected. Commands don&#8217;t: their retries are off by default, and the retry policy you can switch on with <code>useDefaultRetryPolicy</code> covers gRPC only, not REST. The Spring Boot starter can retry completing, failing and throwing errors from jobs after a rejection, but <code>camunda.client.worker.defaults.max-retries</code> is 0 by default. A client that backs off lets the in-flight count drain, and once commands are answered inside the timeout again the limit recovers.</p><ul><li><p>Retry with backoff and jitter in every client that sends commands.</p></li><li><p>Make retries idempotent. A timeout doesn&#8217;t prove the command failed, in either product.</p></li><li><p>Watch one signal per circuit. </p><ul><li><p>Circuit 1: rejected requests (<code>zeebe_dropped_request_count_total</code>, which counts rejections from every circuit, the pause included) and the current limit (<code>zeebe_backpressure_requests_limit</code>). </p></li><li><p>Circuit 2: export lag, the committed position (<code>zeebe_log_appender_last_committed_position</code>) minus the exported one (<code>zeebe_exporter_last_exported_position</code>), as in Camunda&#8217;s Grafana dashboard. </p></li><li><p>Circuit 3: free disk and its fill rate from your volume metrics, since the broker exports no disk metric.</p></li></ul></li><li><p>Watch the job backlog as well.</p></li><li><p>Decide consciously about circuit 2 in Self-Managed.</p></li></ul><p>On STACKIT circuits 1 and 3 stayed at their defaults, and our work went into the exporter. Having gone through the mechanism now, I&#8217;d make the same call again: they regulate themselves.</p>]]></content:encoded></item><item><title><![CDATA[Connector Discovery In Camunda 8]]></title><description><![CDATA[How One Missing Flag Made Ops Hit Their Step Goal]]></description><link>https://blog.itsmestefanjay.dev/p/connector-discovery-in-camunda-8</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/connector-discovery-in-camunda-8</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 22 Oct 2026 08:00:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rtHs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.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_!rtHs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rtHs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!rtHs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!rtHs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!rtHs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rtHs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/baec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2166593,&quot;alt&quot;:&quot;An ops engineer with a USB stick hurries down a stairwell toward a locked server room door marked \&quot;Keep Out\&quot; and \&quot;Access Level 4\&quot;, lit by red warning lights&quot;,&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://theintermediatecatchevent.substack.com/i/220527317?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="An ops engineer with a USB stick hurries down a stairwell toward a locked server room door marked &quot;Keep Out&quot; and &quot;Access Level 4&quot;, lit by red warning lights" title="An ops engineer with a USB stick hurries down a stairwell toward a locked server room door marked &quot;Keep Out&quot; and &quot;Access Level 4&quot;, lit by red warning lights" srcset="https://substackcdn.com/image/fetch/$s_!rtHs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!rtHs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!rtHs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!rtHs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaec9957-3fe0-4d26-9bab-49fd29117c86_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Secure Connector Deployment (AI, 2026)</figcaption></figure></div><p>I recently built a custom connector that manages DNS entries. The customer runs critical infrastructure, and DNS is not something you change from just anywhere. So the connector runtime had to run in a secure environment, on a machine that can only be accessed in person. If you want to deploy something there, somebody builds it and walks over with a USB stick, including several flights of stairs.</p><p>I wrote the connector as a Spring bean with constructor injection. In the environment where we built and tested it, the runtime had automatic connector discovery disabled (via <code>CONNECTOR_OUTBOUND_DISCOVERY_DISABLED</code>) and everything worked. When the connector moved to the secure machine, nobody carried that environment variable over. The runtime now found the connector twice: once as a Spring bean, and once through SPI. The bean registration was fine. The SPI path tried to build the class on its own, found no no-args constructor, and the runtime didn&#8217;t start. The error said the class couldn&#8217;t be built. It didn&#8217;t say why the runtime was trying to build it in the first place. Every failure meant another walk to the desk, fix and back to the machine, and it took more of those walks than I like to admit before it was clear that discovery wasn&#8217;t disabled anymore.</p><p>I mixed up the two mechanisms myself. What kept them apart lived in the environment, not in the artifact, and environment variables don&#8217;t travel with jars. This article sorts every way to get a custom connector into a Camunda connector runtime into one of two families, so you can pick one on purpose.</p><h2>Two Families, One Question</h2><p>The connector runtime collects connectors from several sources and puts them into one factory. After that, it doesn&#8217;t matter how a connector got there. <a href="https://theintermediatecatchevent.substack.com/p/keeping-secretshow-to-handle-authentication">Secrets</a>, <a href="https://theintermediatecatchevent.substack.com/p/validating-process-payloads-with">input validation</a>, <a href="https://theintermediatecatchevent.substack.com/p/deliberate-retries-in-camunda-connectors">retries</a> and error handling all run through the same job handler. The only real difference is who builds the instance:</p><ul><li><p>SPI family: the runtime builds your class itself, reflectively, without Spring.</p></li><li><p>Spring family: your Spring context builds your class, and the runtime picks up the bean.</p></li></ul><p>Each family has its own rules. A few switches cut across both, and those are the ones that cause confusion.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZoT8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZoT8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png 424w, https://substackcdn.com/image/fetch/$s_!ZoT8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png 848w, https://substackcdn.com/image/fetch/$s_!ZoT8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png 1272w, https://substackcdn.com/image/fetch/$s_!ZoT8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZoT8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png" width="1456" height="951" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:951,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:225132,&quot;alt&quot;:&quot;Each way to register a custom outbound connector and each runtime switch, marked by whether it belongs in an SPI setup, a Spring setup or both&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/220527317?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Each way to register a custom outbound connector and each runtime switch, marked by whether it belongs in an SPI setup, a Spring setup or both" title="Each way to register a custom outbound connector and each runtime switch, marked by whether it belongs in an SPI setup, a Spring setup or both" srcset="https://substackcdn.com/image/fetch/$s_!ZoT8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png 424w, https://substackcdn.com/image/fetch/$s_!ZoT8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png 848w, https://substackcdn.com/image/fetch/$s_!ZoT8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png 1272w, https://substackcdn.com/image/fetch/$s_!ZoT8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8bb87c-d6e3-44af-a58a-7cb28b56f35a_1720x1124.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Two things apply to both families. First, your connector class implements <code>OutboundConnectorFunction</code>, or <code>OutboundConnectorProvider</code> if you use the <a href="https://theintermediatecatchevent.substack.com/p/reducing-connector-complexity-with">Operation API</a>. Both families look for exactly these two types. Second, it carries <code>@OutboundConnector</code>. A class without the annotation is skipped silently, by SPI and by bean discovery alike. The runtime doesn&#8217;t log an error for it. Jobs of that type just sit there, because no worker picks them up.</p><p>Note: I use outbound connectors in the examples, but inbound connectors follow the same rules. Only the names change. The class implements <code>InboundConnectorExecutable</code> and carries <code>@InboundConnector</code>, and the services file is named after that interface. Env var registration uses <code>CONNECTOR_{NAME}_EXECUTABLE</code>, and the discovery switch is <code>CONNECTOR_INBOUND_DISCOVERY_DISABLED</code>. The Spring family has one extra rule for inbound: the bean must be <code>@Scope("prototype")</code>, or the runtime refuses to start.</p><h2>The SPI Family; The Runtime Builds Your Class</h2><p>The runtime uses Java&#8217;s <code>ServiceLoader</code>. It reads <code>META-INF/services/io.camunda.connector.api.outbound.OutboundConnectorFunction</code> from every jar on the classpath. Each line in that file is the fully qualified name of a connector class. Operation API connectors go into a file named after <code>OutboundConnectorProvider</code> instead.</p><p>That file comes into existence in one of two ways. You write it by hand, or, what I didn&#8217;t know, the <code>element-template-generator-maven-plugin</code> writes it for you. The plugin does that by default, as long as the file doesn&#8217;t exist yet. Both paths end up in the same mechanism, so pick whichever you like. <code>ServiceLoader</code> calls a public no-args constructor, and nothing else. That rules out constructor injection and everything else Spring would normally do for you. The connector builds what it needs itself:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;a7006b8b-f2ee-46c2-9eb7-b1609e83e002&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">@OutboundConnector(
    name = "Invoice Lookup",
    type = "com.acme:invoice-lookup:1",
    inputVariables = {"invoiceId"})
public class InvoiceLookupConnector implements OutboundConnectorFunction {

  private final InvoiceClient invoiceClient = InvoiceClient.fromEnvironment();

  @Override
  public Object execute(OutboundConnectorContext context) {
    var request = context.bindVariables(InvoiceRequest.class);
    return invoiceClient.findById(request.invoiceId());
  }
}</code></pre></div><p>The services file contains a single line:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;4010a578-c7b1-47c7-9562-fb1cefe8529d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">com.acme.invoice.InvoiceLookupConnector</code></pre></div><p>There is a sibling in this family: registration by environment variable. You set <code>CONNECTOR_INVOICELOOKUP_FUNCTION=com.acme.invoice.InvoiceLookupConnector</code>, plus <code>_TYPE</code>, <code>_INPUT_VARIABLES</code> and <code>_TIMEOUT</code> if you need them. The runtime loads the class by name and instantiates it reflectively, again without Spring. As soon as one of these variables exists, the runtime skips outbound SPI scanning completely, so env var registration replaces the services files instead of adding to them.</p><p>The SPI family is the only one that works with the official connectors Docker image. You don&#8217;t write any Spring Boot application. You put your fat jar on the image&#8217;s classpath, as described in the Camunda docs on <a href="https://docs.camunda.io/docs/components/connectors/custom-built-connectors/host-custom-connector">hosting custom connectors</a>. One thing not to count on with this image: Spring picking up beans from your jar. The image only scans its own packages, so a <code>@Component</code> in your package is just a class to it.</p><h2>The Spring Family; Your Context Builds Your Class</h2><p>If your connector needs beans, you need your own runtime. That&#8217;s a Spring Boot application with <code>io.camunda.connector:spring-boot-starter-camunda-connectors</code> as a dependency. Every bean of type <code>OutboundConnectorFunction</code> or <code>OutboundConnectorProvider</code> in that context gets registered as a connector. The starter doesn&#8217;t replace the SPI family, though. It still runs SPI and env var discovery and adds the beans on top, all into the same factory. Now constructor injection works, and the invoice connector looks like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;01151e96-9a8e-4848-970f-aee40473f03a&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">@Component
@OutboundConnector(
    name = "Invoice Lookup",
    type = "com.acme:invoice-lookup:1",
    inputVariables = {"invoiceId"})
public class InvoiceLookupConnector implements OutboundConnectorFunction {

  private final InvoiceClient invoiceClient;

  public InvoiceLookupConnector(InvoiceClient invoiceClient) {
    this.invoiceClient = invoiceClient;
  }

  @Override
  public Object execute(OutboundConnectorContext context) {
    var request = context.bindVariables(InvoiceRequest.class);
    return invoiceClient.findById(request.invoiceId());
  }
}</code></pre></div><p>Look at the constructor. There is no no-args variant, and that&#8217;s exactly why SPI cannot load this class. For the Spring family, the services file must not exist for this connector. The clean way is to tell the plugin not to write it:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;xml&quot;,&quot;nodeId&quot;:&quot;bbe153ad-66c7-41de-bc65-633dd7c2d787&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-xml">&lt;plugin&gt;
  &lt;groupId&gt;io.camunda.connector&lt;/groupId&gt;
  &lt;artifactId&gt;element-template-generator-maven-plugin&lt;/artifactId&gt;
  &lt;version&gt;${version.connectors}&lt;/version&gt;
  &lt;executions&gt;
    &lt;execution&gt;
      &lt;goals&gt;
        &lt;goal&gt;generate-templates&lt;/goal&gt;
      &lt;/goals&gt;
    &lt;/execution&gt;
  &lt;/executions&gt;
  &lt;configuration&gt;
    &lt;connectors&gt;
      &lt;connector&gt;
        &lt;connectorClass&gt;com.acme.invoice.InvoiceLookupConnector&lt;/connectorClass&gt;
        &lt;writeMetaInfFileGeneration&gt;false&lt;/writeMetaInfFileGeneration&gt;
      &lt;/connector&gt;
    &lt;/connectors&gt;
  &lt;/configuration&gt;
&lt;/plugin&gt;</code></pre></div><p>The flag sits on each <code>&lt;connector&gt;</code> entry, not on the plugin. Older examples in the plugin README use a <code>&lt;connectorClasses&gt;</code> element, but the real one is <code>&lt;connectors&gt;&lt;connector&gt;</code>. Camunda does the same thing for its own AI Agent connector, whose components are Spring beans.</p><p>There is a catch. The plugin writes the file into <code>src/main/resources</code>, your source tree, and it only writes it if it doesn&#8217;t exist yet. Switching the flag to <code>false</code> stops new files. It does not remove the one from your last build, and that one is probably in Git by now. Delete it by hand. The same goes for renames: the file keeps the old class name. A services file that names a class that doesn&#8217;t exist, or one that doesn&#8217;t implement the interface, stops the runtime at startup. Only a listed class without <code>@OutboundConnector</code> gets skipped silently.</p><p>The other way is to switch off discovery for the whole runtime and keep the plugin defaults:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;8e343cc9-7530-4442-b98f-c262a536994d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">env:
  - name: CONNECTOR_OUTBOUND_DISCOVERY_DISABLED
    value: "true"</code></pre></div><p>This disables SPI and environment variable registration, but never Spring beans. It also disables SPI for every other connector jar on that runtime&#8217;s classpath. And it&#8217;s the variable that got lost in my story. I&#8217;d use it as a second line of defence only. It is an environment variable and nothing else: there is no Spring property for it, so <code>application.yaml</code> won&#8217;t help you.</p><p>One more advanced gotcha, new in 8.10: the runtime doesn&#8217;t use the instance Spring already created for your bean. When it opens the job worker, it builds its own instance from the class, with constructor injection, and reuses that one instance for every job (one per tenant, if you run several). A <code>@Bean</code> factory method is skipped in that step. If you declare the connector itself through a <code>@Bean</code> method, mark it <code>@Scope("prototype")</code>, and the runtime asks Spring for the bean instead. In 8.9, the runtime still used the bean from the context.</p><h2>Why Blending Breaks</h2><p>With both families active for the same connector, you can end up in several places:</p><ul><li><p>Constructor injection, SPI file present: SPI tries to build the class and fails, because there is no no-args constructor. The runtime doesn&#8217;t start. That was my case.</p></li><li><p>No-args constructor, SPI file present, also a bean: both registrations succeed, and the runtime refuses to start. Registering the same connector type twice throws. There is no &#8220;last one wins&#8221;, no matter in which order the runtime reads its sources.</p></li><li><p>Field injection, SPI only: if the class has <code>@Autowired</code> fields and a default constructor, <code>ServiceLoader</code> builds it happily. The fields stay <code>null</code> until the first job hits them.</p></li><li><p>Discovery &#8220;re-enabled&#8221; with <code>false</code>: the runtime only checks whether <code>CONNECTOR_OUTBOUND_DISCOVERY_DISABLED</code> exists. Its value is ignored. Set it to <code>false</code> and discovery stays off, and every SPI-only connector on that runtime disappears without a word.</p></li><li><p>Type overrides on a mixed runtime: <code>CONNECTOR_{NAME}_TYPE</code> is looked up by the connector&#8217;s name. SPI and bean registrations of the same class share that name, so they get the same type and you&#8217;re back at the duplicate error. Env var registration is different, because you pick the name yourself. Register a bean and the same class by env var under another name with its own <code>_TYPE</code>, and both start. Now two workers handle job types you never meant to have.</p></li></ul><p>Two switches really do apply to both families: <code>CONNECTOR_OUTBOUND_DISABLED</code> and, since 8.10, <code>CONNECTOR_OUTBOUND_ENABLED</code>. Each takes a comma-separated list of connector types, meaning the job types such as <code>com.acme:invoice-lookup:1</code>, not connector names or classes. <code>_DISABLED</code> is a block list, <code>_ENABLED</code> an allow list, and setting both stops the runtime at startup. They filter every source, and they match the type after any <code>_TYPE</code> override. A filtered connector stays registered but gets no job worker. That&#8217;s also why they can&#8217;t fix a duplicate: the duplicate check runs first, so blocking one of two registrations of the same type still ends in the startup error. Like the discovery switch, they&#8217;re environment variables only.</p><h2>Which Family To Pick</h2><p>Start with one question: does the connector need beans from a Spring context? That might be a client with connection pooling, or a component another team already maintains as a bean. If yes, you&#8217;re in the Spring family. There is no trick that gets injection into SPI. If no, both families work, and the question becomes who runs the runtime.</p><p>The SPI family is cheaper to operate. You ship a jar, and Camunda ships the runtime. A Camunda upgrade means a new base image tag and a rebuild. You pay for that in code: the connector builds its own clients and reads its own configuration, and testing that wiring is on you.</p><p>The Spring family turns the runtime into your application. You pick the starter version, keep it in line with your Camunda version, build the image and patch its dependencies. For a team that already runs Spring Boot services, that&#8217;s routine. For a team that only wanted to add one connector, it&#8217;s one more application to maintain.</p><p>It gets harder when one runtime should host both. Say three connectors are plain SPI jars and one needs beans. You can put all four into your own Spring runtime, and SPI keeps working there as long as discovery stays on. That rules out the discovery switch, so <code>writeMetaInfFileGeneration=false</code> on the bean connector is your only guard. The same applies if your runtime pulls in Camunda&#8217;s out-of-the-box connectors as dependencies, because those register through SPI too. The alternative is two runtimes: the stock image for the SPI connectors, and your own runtime for the bean connector, with discovery disabled as a second line of defence. That&#8217;s one more deployment. In return, each runtime follows one family, and the stock one has no variable to lose. If you can afford the extra deployment, I&#8217;d split.</p><h2>Summary</h2><p>Pick the family per connector, and per runtime where you can. Then make the build enforce it, so the choice doesn&#8217;t depend on a variable someone has to remember.</p><ul><li><p>If you need Spring beans, use the Spring family: your own Spring Boot runtime with the starter, <code>writeMetaInfFileGeneration=false</code> on the connector, no services file in <code>src/main/resources</code>. Disabling discovery as well is a backup, and it shouldn&#8217;t be your only guard.</p></li><li><p>If you want to drop a jar into the stock image, use the SPI family: public no-args constructor, no injection, plugin defaults or a handwritten services file, jar on the image&#8217;s classpath.</p></li><li><p>If one runtime hosts both families, the build flag is your only guard, because disabling discovery would drop the SPI connectors too. Two runtimes cost a deployment and keep each family on its own.</p></li><li><p><code>CONNECTOR_OUTBOUND_DISCOVERY_DISABLED</code> turns off SPI and environment variable registration, never beans. The presence of the variable is enough, the value doesn&#8217;t matter (incl. <em>false</em>).</p></li><li><p>Same type registered twice means the runtime doesn&#8217;t start. Nothing overrides anything.</p></li><li><p>Inbound connectors follow the same rules under their own names. Inbound beans must be prototype-scoped.</p></li></ul><p>If I had put <code>writeMetaInfFileGeneration=false</code> into the DNS connector&#8217;s build from day one, the USB stick would&#8217;ve gone down those stairs once.</p>]]></content:encoded></item><item><title><![CDATA[Riding the Wave: How Camunda Became a Forrester Leader]]></title><description><![CDATA[Why Camunda&#8217;s Bet on Camunda 8 Paid Off, and What That Means for You]]></description><link>https://blog.itsmestefanjay.dev/p/riding-the-wave-camunda-is-a-forrester</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/riding-the-wave-camunda-is-a-forrester</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 08 Oct 2026 08:01:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nSU8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.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_!nSU8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nSU8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!nSU8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!nSU8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!nSU8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nSU8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2325043,&quot;alt&quot;:&quot;A black speedboat with the Camunda logo riding the crest of a large wave, ahead of three smaller white boats&quot;,&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://theintermediatecatchevent.substack.com/i/218141908?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A black speedboat with the Camunda logo riding the crest of a large wave, ahead of three smaller white boats" title="A black speedboat with the Camunda logo riding the crest of a large wave, ahead of three smaller white boats" srcset="https://substackcdn.com/image/fetch/$s_!nSU8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!nSU8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!nSU8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!nSU8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773e4748-d4e9-45bd-9417-22c0e57903bb_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Riding the Wave (AI, 2026)</em></figcaption></figure></div><p>At a talk about agentic orchestration last year, someone in the audience asked me: &#8220;Why should we use Camunda for agent orchestration when we could just use n8n?&#8221; Fair question. Both draw boxes and arrows, both call APIs, and n8n gets you a working automation in an afternoon. My answer was one word: <em>Enterprise</em>. What I meant is everything that only starts to matter once a process runs at volume, crosses teams and has to pass an audit.</p><p>Two weeks ago Forrester published The Forrester Wave: Adaptive Process Orchestration Software, Q3 2026. It evaluates 13 providers and names four of them Leaders, <a href="https://camunda.com/blog/2026/09/camunda-named-a-leader-in-the-forrester-wave-adaptive-process-orchestration-software-q3-2026/">Camunda among them</a>. Forrester&#8217;s take says Camunda &#8220;is best suited for large enterprises requiring scalable, reliable, and observable process orchestration that includes agentic AI at scale.&#8221; That sentence is pretty much the answer I tried to give in that room, only with an analyst&#8217;s name on it.</p><p><em>Full disclosure: I work at Consid, a Camunda partner, and I&#8217;m a Camunda Champion, so read what follows as an opinion from someone who is invested in the topic.</em></p><p>Two things had to come together. Camunda 8 supplied the architectural foundation, but it was already on the market when Forrester rated Camunda a <em>Strong Performer</em> twice. What changed is the evaluation: the new category put the properties of that foundation at the center. In my view, without the painful jump from Camunda 7 to Camunda 8, there would have been little for the new criteria to reward.</p><h2>From Consultancy to Leader</h2><p>Camunda started in 2008 in Berlin as a BPM consultancy, founded by Jakob Freund and Bernd R&#252;cker. In 2013 it forked the Activiti engine and became a product company, and the fork became Camunda 7: a Java engine most teams embedded in their application, backed by a relational database. Developers loved it because the engine wasn&#8217;t hidden away: it was developer-centric and open source. Business teams loved it because BPMN was the real execution model and not a drawing next to the code.</p><p>Camunda has been in Forrester&#8217;s Waves since 2023, always as a Strong Performer until this one. The first two were Digital Process Automation (DPA) Waves and the latest belongs to a different category, so read the placements as a direction across changing tests.</p><ul><li><p>Q4 2023, DPA: first entry, as a Strong Performer, with top scores in six criteria including end-to-end orchestration. According to Camunda, the report already singled out Zeebe for automation at scale.</p></li><li><p>Q3 2025, DPA: Strong Performer again. Forrester wrote that Camunda suits enterprises that &#8220;require best-in-class orchestration.&#8221;</p></li><li><p>Q3 2026, Adaptive Process Orchestration (APO), a category Forrester announced in September 2025: Leader, with the highest possible scores in the architecture criteria, adoption and vision.</p></li></ul><p>Camunda scored top marks on orchestration and vision in both DPA Waves and still stayed out of the Leader circle. My reading is that a DPA evaluation also weighs things Camunda never wanted to be good at, like low-code app building for citizen developers. Forrester itself wrote in the 2025 DPA Wave that the low-code promise for citizen developers &#8220;is largely overstated, with most DPA projects deployed by experienced professionals.&#8221;</p><p>Gartner started its own category in the same period. Its Magic Quadrant for Business Orchestration and Automation Technologies (BOAT), which also scores use cases like platform consolidation, placed Camunda among the Visionaries in October 2025 and again on September 14, 2026. According to <a href="https://camunda.com/blog/2026/09/camunda-recognized-as-a-visionary-in-gartner-boat-magic-quadrant-2026/">Camunda</a>, Gartner calls process orchestration its strongest capability. The methods differ too much to line up as one ranking, and I can&#8217;t say exactly why each firm landed where it did, but the pair shows that the lens matters: an evaluation built around orchestration puts Camunda in a different place than a wider one.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jV28!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jV28!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png 424w, https://substackcdn.com/image/fetch/$s_!jV28!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png 848w, https://substackcdn.com/image/fetch/$s_!jV28!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png 1272w, https://substackcdn.com/image/fetch/$s_!jV28!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!jV28!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png" width="1440" height="466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:466,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57933,&quot;alt&quot;:&quot;Camunda&#8217;s placements per year from 2023 to 2026 in Forrester&#8217;s DPA and APO Waves and in Gartner&#8217;s BOAT Magic Quadrant&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/218141908?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Camunda&#8217;s placements per year from 2023 to 2026 in Forrester&#8217;s DPA and APO Waves and in Gartner&#8217;s BOAT Magic Quadrant" title="Camunda&#8217;s placements per year from 2023 to 2026 in Forrester&#8217;s DPA and APO Waves and in Gartner&#8217;s BOAT Magic Quadrant" srcset="https://substackcdn.com/image/fetch/$s_!jV28!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png 424w, https://substackcdn.com/image/fetch/$s_!jV28!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png 848w, https://substackcdn.com/image/fetch/$s_!jV28!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png 1272w, https://substackcdn.com/image/fetch/$s_!jV28!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52c30a9e-ab32-47b8-bae4-d0c95e5b9da6_1440x466.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Why a New Category Changes the Picture</h2><p>In <a href="https://www.forrester.com/blogs/announcing-the-evaluation-of-the-adaptive-process-orchestration-market/">September 2025</a>, Bernhard Schaffrik wrote that deterministic workflow engines, RPA bots and DPA tools are not powerful enough for autonomous operations. Forrester calls autonomous operations the North Star for many enterprises, and the DPA evaluations were built around deterministic automation.</p><p>At CamundaCon Amsterdam in May 2025, Schaffrik had called for solving &#8220;the trust gap with a blend of deterministic and non-deterministic approaches.&#8221; Four months later that blend was the definition of a new market. Forrester defines APO as &#8220;an automation platform that uses AI agents and nondeterministic control flows, in addition to traditional deterministic control flows, to meet business goals, perform complex tasks, and make autonomous decisions.&#8221;</p><p>Read that definition with a BPMN model in mind. Deterministic flow around the parts that must be controlled, an ad-hoc sub-process with an AI agent inside for the parts that can&#8217;t be scripted in advance. That is the agentic orchestration Camunda shipped with 8.8, and it is what Camunda calls outer and inner orchestration: BPMN coordinates agents, people and systems, and inside the agent it governs which tools the agent may call.</p><p>So the category followed the market, and the market moved toward the kind of platform Camunda had been building since Zeebe work started in 2017. The APO report opens on trust: companies hold back on agents because they don&#8217;t trust AI output to be reliable, and Forrester&#8217;s answer is the right architecture. The criteria that carry weight in this Wave are architecture criteria, and read as questions, they are the ones a bank&#8217;s architecture board asks before it lets an agent decide anything: how much volume the platform takes, whether it stays up while you upgrade it, and whether someone can reconstruct afterwards what the agent did and which rule allowed it.</p><p>Camunda landed right where those questions sit. Forrester rates it above par for running complex processes at scale, with top marks for reliability and adaptivity, and above par for runtime observability and optimization. It also credits the platform with strong auditability, live versioning and updates without downtime, which answers the architecture board&#8217;s three questions almost one by one. On strategy, vision and adoption get top marks, the user community stands out, and customers praise the support and a product team that is easy to reach. The weak spot is the design environment, which Forrester rates below par and sees as built for technical users, but the Wave puts most of its weight on architecture, not on how processes are drawn.</p><p>The switch reshuffled the whole field. Of the five Leaders in the 2025 DPA Wave, only Appian is a Leader in the APO Wave. Pegasystems, Salesforce and ServiceNow are Strong Performers under the new test, and IBM isn&#8217;t part of the APO Wave. Camunda is the only vendor that went from Strong Performer in DPA to Leader in APO.</p><h2>Why This Needed Camunda 8</h2><p>I don&#8217;t think Camunda would be a Leader in this Wave with Camunda 7. Camunda 7 runs demanding workloads and will be supported for years. The question is where its limit sits.</p><p>Camunda 7 keeps process state in a relational database. You could embed the engine or run it remotely and let workers fetch external tasks over REST, which took your code out of the engine&#8217;s JVM. Either way, every state change, every fetch-and-lock and every completion is a database transaction, and the history goes into the same database. You scale by adding engine nodes and tuning the job executor and history level, until that shared database is the limit and the one component every node depends on.</p><p>Zeebe, the engine behind Camunda 8, was started in 2017 to move that limit. It has no central database. State lives in a replicated, partitioned log, workers pull jobs over gRPC or REST, and you scale by adding partitions and brokers. That doesn&#8217;t remove limits, it moves them. Camunda launched Camunda 8 on Zeebe in April 2022, runs its SaaS on it, and in 8.8 built the <a href="https://theintermediatecatchevent.substack.com/p/camundas-new-unified-architecture">Orchestration Cluster</a> around it.</p><p>Agent workloads make that capacity matter more. In Camunda 8&#8217;s native agent pattern, the agent loop runs in the engine and each tool call activates a BPMN activity in the agent&#8217;s ad-hoc sub-process, so a busy agent adds many state changes. An agent that runs elsewhere and only calls Camunda puts less of that on the engine.</p><p>For an executive, the short version: on Camunda 7, growth eventually means a bigger, more carefully tuned central database. On Camunda 8, it means adding capacity to a distributed cluster.</p><p>The move had a price, and customers carry a large part of it. Code that ran inside the Camunda 7 engine, such as delegates and listeners, has to be reworked for Camunda 8, mostly into job workers, and the tests with it. Camunda&#8217;s migration tooling cuts that work down without removing it. Camunda 7 Community Edition got its final release on October 14, 2025. Enterprise support runs until April 2030, with paid extended support until a few years later. For teams with years of Camunda 7 code in production, that is a hard message, and I understand the frustration. Nobody has to move everything at once, though: new processes can start on Camunda 8 while the existing Camunda 7 instances run out, which is the drain-out approach in Camunda&#8217;s migration guide. As I see it, Camunda had two options: keep refining a well-loved engine whose ceiling it knew, or break with it and build for the market it expected a few years later.</p><p>Camunda&#8217;s commercial numbers point the same way. Camunda crossed $100 million in ARR in September 2024 after almost ten years, and according to its <a href="https://camunda.com/press-releases/camunda-closing-in-on-200m-in-arr-doubling-revenue-in-record-time/">press release from August</a>, ARR is nearing $200 million. Camunda credits enterprise customers spending more than $1 million a year and its native agentic orchestration, a Camunda 8 feature. The growth happened in the Camunda 8 era, but it doesn&#8217;t show how much of it came from the engine rather than from the agent wave, sales or a growing market, or what Camunda 7 would have earned in the same years.</p><p>That is why the bet paid off for Camunda. Whether it pays off for you is a separate question. The architecture is worth evaluating when your processes run at high volume, cross many systems and teams, have to stay up through upgrades, have to be explained to auditors, and increasingly include agents that decide steps on their own. If a few of your core processes look like that, the shift deserves a serious look. If your automation is small, local and stable, a Leader badge changes nothing, and a migration from Camunda 7 costs what it costs.</p><h2>Where Camunda Is Still Building</h2><p>Camunda doesn&#8217;t score top marks everywhere and it makes sense to take a closer look. Of the criteria Forrester rates as on par, three carry the most weight: </p><ol><li><p>content and context intelligence</p></li><li><p>the AI agent library and discovery</p></li><li><p>orchestration testing</p></li></ol><p>In my view none of them points at a weakness in the architecture. They&#8217;re the questions the whole market is still working on, because agents haven&#8217;t been in production long enough for anyone to have finished answers. Forrester used material vendors provided by July 17, 2026. Camunda 8.10 ships on October 13, and a good part of it lands right on these three points.</p><p>Testing is the hardest. A deterministic BPMN path is easy to test: you drive the process and assert on the path it took. An agent can take a different path on every run, so the test has to check whether the decision stayed inside the rules. Camunda started on this early. Since 8.9, Camunda Process Test has judge assertions: a model scores how well a process variable matches an expectation written in plain language, and the test passes above a threshold. 8.10 brings them into JSON test cases, and Camunda Hub gets a test mode that runs test cases with assertions from the modeler. What I want to see next is tests that catch the failures that matter, the wrong approval or the skipped check, reliably enough to block a release. The building blocks for that are already in the product.</p><p>Context is about what the agent knew when it decided. Here Camunda has an advantage that is easy to miss: a native agent runs inside a process instance, so the steps before it, the variables it got and the human decisions around it are already recorded by the engine. With 8.10, Operate adds the agent instance on top, with its system prompt, resolved tools, every prompt and tool call, and the model&#8217;s reasoning where the provider returns it. For an auditor that splits cleanly: the process trail, which steps ran, which tools the agent called with which inputs, and who approved what, is recorded by the engine and can be checked. The model&#8217;s displayed reasoning can&#8217;t, because it is not a complete account of why the model decided. Having both next to the process they belong to is still more than most teams can show today. What I&#8217;d like Camunda to build next is context as a managed asset: system prompts, policies and knowledge sources defined once, versioned and approved like a process model, and referenced by every agent that needs them. Camunda already handles process models that way, so the step is shorter than it sounds. The test is whether a team can show, for any agent decision, which inputs, which policy version and which tool calls led to the outcome.</p><p>Discovery is where Camunda Hub comes in. In Camunda an agent is a connector, an element template with a version, and with 8.10 the engine knows agents as definitions with their own API. At CamundaCon in May I saw Hub flag models still on old connector template versions. Through the Agent Instance API, agents built with LangGraph or CrewAI report into the same view, so Camunda doesn&#8217;t have to run every agent to see it. What I&#8217;d want next is one inventory across real deployments: every agent, its version, its owner and every process that calls it. Today that view stops at the cluster. Until an organization can answer &#8220;which processes use this agent, and who owns it&#8221; across its clusters, the gap is open, but it is an inventory on top of data Camunda already collects.</p><p>The engine work that made this placement possible is behind Camunda, and that was the hard part. What&#8217;s left is making agent governance operationally dependable, release after release. Given what 8.9 and 8.10 already brought, I&#8217;m betting Camunda gets there.</p><h2>What&#8217;s Next</h2><p>Camunda&#8217;s next move is ProcessOS, announced at CamundaCon in May. It leaves the closed beta with 8.10 and becomes available to all paying customers. It brings AI into how processes are discovered, designed, built and optimized, the same area where Forrester rates Camunda&#8217;s autonomous process design as on par. At CamundaCon, Camunda showed it on its own Quote to Cash process: a discovery agent queried the real systems and documented the process in under an hour, and a build agent generated the BPMN and DMN from the redesign, with approvals still enforced in BPMN. <a href="https://theintermediatecatchevent.substack.com/p/camunda-announces-processos">I wrote about it in May</a>, and I&#8217;ll look at it hands-on once 8.10 is out.</p><ul><li><p>Camunda 8 supplied the architecture. The APO Wave made it decisive.</p></li><li><p>The bet paid off for Camunda. Your migration case is your own assessment, and April 2030 is closer than it sounds.</p></li><li><p>Agent testing, context and discovery are where Camunda goes next, and 8.9 and 8.10 already moved on all three.</p></li></ul><p>When someone asks me the n8n question again, my answer will still be one word, and now boards and architects can read an independent evaluation of what it means for agentic processes in the <a href="https://page.camunda.com/wp-forrester-wave-apo-2026">report Camunda offers</a>. It won&#8217;t tell anyone whether Camunda fits their processes, and it doesn&#8217;t make n8n the wrong tool for the work it does well. The next step is showing that agents on Camunda can be tested, explained and governed as reliably as the processes around them, and with 8.9 and 8.10 that work has started.</p>]]></content:encoded></item><item><title><![CDATA[Camunda 8.10 Release Summary]]></title><description><![CDATA[What&#8217;s New, What&#8217;s Changed and What Breaks]]></description><link>https://blog.itsmestefanjay.dev/p/camunda-810-release-summary</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/camunda-810-release-summary</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 01 Oct 2026 08:01:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TrNs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.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_!TrNs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TrNs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png 424w, https://substackcdn.com/image/fetch/$s_!TrNs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png 848w, https://substackcdn.com/image/fetch/$s_!TrNs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png 1272w, https://substackcdn.com/image/fetch/$s_!TrNs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TrNs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1566881,&quot;alt&quot;:&quot;A laptop showing a imagined Camunda Hub UI.&quot;,&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://theintermediatecatchevent.substack.com/i/216267606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A laptop showing a imagined Camunda Hub UI." title="A laptop showing a imagined Camunda Hub UI." srcset="https://substackcdn.com/image/fetch/$s_!TrNs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png 424w, https://substackcdn.com/image/fetch/$s_!TrNs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png 848w, https://substackcdn.com/image/fetch/$s_!TrNs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png 1272w, https://substackcdn.com/image/fetch/$s_!TrNs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d9b2cba-9414-4103-932d-4c3a3e39a3ef_1671x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Camunda Hub in Camunda 8.10 (AI, 2026)</em></figcaption></figure></div><p>Camunda 8.10 ships on October 13, 2026. Camunda 8.7 reaches end of standard maintenance that same day, which leaves anyone still on 8.7 with no overlap between the release going out of support and the one replacing it. The release also removes everything 8.8 deprecated.</p><p>The headline features are Camunda Hub and an engine API for agents. For existing users, most of the actual work sits a bit deeper: removed APIs, changed defaults, Helm 4 for self-managed, and the Web Modeler migration. Camunda&#8217;s own what&#8217;s-new page starts with unified authentication, Optimize data filters, and that migration.</p><h2>Camunda Hub Replaces Console And Web Modeler</h2><p>Camunda merged the two products into one. Center of excellence teams manage infrastructure, access, and workspaces at Organization level; delivery teams model and deploy inside a Workspace. Almost every name changed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XQpw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XQpw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png 424w, https://substackcdn.com/image/fetch/$s_!XQpw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png 848w, https://substackcdn.com/image/fetch/$s_!XQpw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png 1272w, https://substackcdn.com/image/fetch/$s_!XQpw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XQpw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png" width="1440" height="778" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:778,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:72921,&quot;alt&quot;:&quot;Mapping of Console, Web Modeler, projects, process applications, collaborators, Play, milestones and the Web Modeler API to their Camunda Hub equivalents&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/216267606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Mapping of Console, Web Modeler, projects, process applications, collaborators, Play, milestones and the Web Modeler API to their Camunda Hub equivalents" title="Mapping of Console, Web Modeler, projects, process applications, collaborators, Play, milestones and the Web Modeler API to their Camunda Hub equivalents" srcset="https://substackcdn.com/image/fetch/$s_!XQpw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png 424w, https://substackcdn.com/image/fetch/$s_!XQpw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png 848w, https://substackcdn.com/image/fetch/$s_!XQpw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png 1272w, https://substackcdn.com/image/fetch/$s_!XQpw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d97bcb-12cb-4414-aa68-de1452071a12_1440x778.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Workspaces have their own members, roles, projects, and clusters, and the Catalog holds element templates synced from one Git repository. Credentials live as organization-level cluster variables; connectors reference them as <em>camunda.secrets.KEY</em>.</p><p>At CamundaCon in May, I saw Camunda Hub show which workers and connectors belong to each cluster. It also flagged models using old connector template versions, and it kept tenants, secrets, and connections in one place. Today I open models one by one to find those templates, and I cannot see the worker-to-cluster connection at all. If the released Hub matches that demo, I stop doing both.</p><p>The Hub API v2 arrives with the release, and Web Modeler API v1 is deprecated in 8.10 and removed in 8.12 (Oct 2027), with the Console self-managed API on the same schedule, which leaves anything built against either of them two releases to move across before it stops working. Camunda migrated SaaS to the new workspace structure in August. Self-managed gets the same structure at GA.</p><p>In our SaaS organization the migration arrived in the modeler. Folders came back as process applications, created by Camunda Migration, with an info panel saying only the location changed, not names, files or version history.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vLIR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vLIR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png 424w, https://substackcdn.com/image/fetch/$s_!vLIR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png 848w, https://substackcdn.com/image/fetch/$s_!vLIR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png 1272w, https://substackcdn.com/image/fetch/$s_!vLIR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!vLIR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png" width="1412" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1412,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66031,&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://theintermediatecatchevent.substack.com/i/216267606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.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_!vLIR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png 424w, https://substackcdn.com/image/fetch/$s_!vLIR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png 848w, https://substackcdn.com/image/fetch/$s_!vLIR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png 1272w, https://substackcdn.com/image/fetch/$s_!vLIR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16c1eb31-3e28-454e-b23e-1980aa659ae8_1412x630.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Folders regrouped into process applications by the August SaaS migration</em></figcaption></figure></div><p>Self-managed users have to replace two chart settings:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;7aa3d885-76e0-40fb-8683-454705c53be4&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml"># 8.9
console:
  enabled: true
webModeler:
  enabled: true

# 8.10
camundaHub:
  enabled: true</code></pre></div><p><span>The images become </span><em>camunda/hub</em><span> and </span><em>camunda/hub-websockets</em><span>, and any leftover </span><em>camunda.console.*</em><span> configuration fails the application on startup. </span> The chart change is the easy part: there is no rolling upgrade from Web Modeler to Hub, so every Web Modeler instance has to stop and its database has to be backed up before Hub starts, and because the database migration cannot be reversed, that backup is the only way back to 8.9. <span>The </span><a href="https://docs.camunda.io/docs/next/self-managed/upgrade/components/890-to-8100/">component upgrade guide</a><span> lists every removed setting. Management Identity is still separate and still required. Console Admin and Web Modeler Admin both gain access to Hub cluster pages, so check who holds those roles before the upgrade.</span></p><h2>What The Engine Now Knows About Agents</h2><p>The orchestration cluster models agents as first-class entities now. An agent definition comes from a <em>zeebe:agentDefinition</em> extension on the model, and an agent instance carries state, token usage, tool inventory, and conversation history grouped by loop iteration. Eight new endpoints cover definitions, instances, updates, and history search.</p><p>None of it shows up for an agent modeled before 8.10. Operate fills the panel once the <a href="https://docs.camunda.io/docs/next/components/agentic-orchestration/agent-definitions-and-instances/">element template moves to latest v1 or v2</a> and the model is redeployed; until then it stays empty.</p><p>Select the agent element in Operate and you get the instance key, model, system prompt, resolved tools, and usage against the configured token and call limits. The state moves through Initializing, Tool discovery, Thinking, Tool calling, Idle, and Completed. Below the diagram, the conversation history groups every prompt, message, tool call, input, and output by loop iteration, inside the same process instance, and shows the model&#8217;s reasoning inline as a <em>Thinking</em> entry where the provider returns it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RtTr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RtTr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png 424w, https://substackcdn.com/image/fetch/$s_!RtTr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png 848w, https://substackcdn.com/image/fetch/$s_!RtTr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png 1272w, https://substackcdn.com/image/fetch/$s_!RtTr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!RtTr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png" width="1456" height="966" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:966,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:193188,&quot;alt&quot;:&quot;Operate showing an agent instance&#8217;s details, with status, token usage and conversation history&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/216267606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Operate showing an agent instance&#8217;s details, with status, token usage and conversation history" title="Operate showing an agent instance&#8217;s details, with status, token usage and conversation history" srcset="https://substackcdn.com/image/fetch/$s_!RtTr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png 424w, https://substackcdn.com/image/fetch/$s_!RtTr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png 848w, https://substackcdn.com/image/fetch/$s_!RtTr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png 1272w, https://substackcdn.com/image/fetch/$s_!RtTr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0914d32-a71b-4573-9ea6-e485d1d86eb1_1740x1154.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Agent state, usage and conversation history on the agent instance, as shown in the official Camunda docs</em></figcaption></figure></div><p>The 8.9 version of that documentation page had you switching on execution counts and hunting tool inputs in a parent scope. The 8.10 page says you rarely need raw process variables. Operate also renders a LangGraph or CrewAI runtime beside the process instance when it registers through the Agent Instance API.</p><p>The engine resolves the tools from the agent&#8217;s ad-hoc sub-process. That list is the BPMN boundary on what the agent can call, and the engine enforces it.</p><p>The Agentic Control Plane is an Optimize dashboard over completed Camunda AI agent instances. It is scoped per cluster, keeps 30 days of data, and does not manage or govern agents. The Camunda-provided LLM shipped in May and is documented identically for 8.8 and 8.9, so an 8.9 cluster already has it.</p><p>On May 20, after Camunda&#8217;s ProcessOS keynote at CamundaCon, I published <em>Camunda Announces ProcessOS</em> and said I would follow up when 8.10 shipped. Two weeks before GA, the docs cover the Control Plane dashboard, live agent state and conversation history in Operate, and processes as MCP tools. <s>ProcessOS, Test Studio, and the Business Value Dashboard are not in them. ProcessOS itself is still in beta behind a waiting list, and Camunda gives priority to companies that bring a use case and a forward deployed engineer with it. Fingers crossed I get my hands on it soon.</s></p><p><em>EDIT: I wrote this against what was checked into the docs two weeks before GA, and Camunda of course works double shifts before a go-live. Two updates came in from Camunda after I published. ProcessOS, Test Studio, and the Business Value Dashboard will ship with 8.10 after all, and ProcessOS leaves the closed beta and becomes available to all paying customers; the release notes are being finalized now.</em></p><h2>What Changed Outside The Agent Work</h2><p>The orchestration cluster API gained 44 endpoints in 8.10 and removed none. Every active element instance can report what it is waiting for: a timer with its due date, a message with its name and correlation key, a signal, a conditional expression, a user task, or a job. Operate shows it under a Waiting label and details tab by default.</p><p>Business ID is now searchable across process instances, decision instances, user tasks, and message subscriptions. It also narrows message correlation as an extra filter, and FEEL reads it through <em>camunda.processInstance.businessId</em>.</p><p>Camunda added four endpoints for suspending and resuming process instances, plus a <em>SUSPENDED</em> state and a new permission, and Operate can suspend a single instance or a batch. Suspension halts the instance where it stands: no jobs activate or complete, no messages or signals correlate, and no timers fire. Variables stay readable and writable, so you can fix bad data before resuming. Timers that came due during the pause fire the moment the instance resumes, so a long suspension ends with every overdue timer firing at once.</p><p>Physical tenants sit between logical tenants and separate clusters as a third isolation option. Each tenant gets dedicated Raft groups, isolated secondary storage, and its own document store, while brokers and gateways stay shared, and in 8.10 the whole thing is self-managed only and configured statically with a rolling restart, with no runtime create, rename, or delete.</p><h2>What Breaks In 8.10</h2><p>Camunda removes everything it deprecated in 8.8, and the <a href="https://docs.camunda.io/docs/next/apis-tools/migration-manuals/migrate-to-810/">8.10 migration guide</a> maps each removal to its replacement. The Operate API, Tasklist API v1, Tasklist v1 mode, public start forms, and user task access restrictions are all gone. Java projects have to swap <em>ZeebeClient</em> for <em>CamundaClient</em> and Zeebe Process Test for <em>CamundaProcessTest</em>. Both show up as compile errors. The Camunda Spring Boot Starter also moves to Spring Boot 4.1.x, which pulls projects on 4.0.x into a migration of their own. Anything calling the Operate API or Tasklist v1 stops working until those integrations are rewritten. On self-managed, Optimize also rejects its static API token with a 401 straight after the upgrade, so any client that sends <em>OPTIMIZE_API_ACCESS_TOKEN</em> has to move to OIDC bearer tokens first.</p><p>Four behavior changes may not fail loudly:</p><ul><li><p>Java client OAuth credentials are cached in memory by default, with the file cache now opt-in</p></li><li><p><em>JobIntent.COMPLETED</em> no longer carries variables by default, which breaks custom exporters reading them</p></li><li><p>Message subscription search now returns start event subscriptions, with a new type field to filter them out</p></li><li><p>Resource APIs became eventually consistent</p></li></ul><p>A custom exporter can keep running while it drops fields from a report.</p><p>Element templates can declare operations, so the modeling menu lists <code>send email</code> or <code>upload object</code> as searchable entries. Nineteen single-operation connectors were renamed, REST Outbound Connector to Send REST Request among them. Template IDs and runtime behavior did not change, so deployed models keep running and only the documentation and training material need updating. AWS connectors moved to AWS SDK for Java v2. STRICT became the default connector secret filter back in Connectors 8.9.10 and stays the default here, which the 8.10 announcement still lists as a breaking change.</p><h2>Camunda 7 Gaps That Close</h2><p>Several 8.10 items restore something Camunda 7 had and Camunda 8 did not. Camunda does not present them that way, and the release notes never mention Camunda 7.</p><p>Business ID is the big one. Camunda&#8217;s own data migrator maps the Camunda 7 <em>businessKey</em> onto it, and in 8.10 it stops being a label you carry around. Camunda 7 correlated messages by business key directly.</p><p>Execution listeners now take headers, which covers the field injection a Camunda 7 listener class relied on for its configuration, and a <code>cancel</code> listener runs when an instance is terminated, a hook Camunda 7 fired by default and Camunda 8 never had. Suspend and resume come back as API endpoints.</p><p>The <code>SUSPEND</code> authorizations have also been added, which closes the permission gap from the Camunda 7 section, and the docs follow shortly.</p><h2>SaaS And Self-Managed Upgrade Notes</h2><h3>On SaaS</h3><p>Optimize data filters are new in cluster settings, on by default for new clusters and opt-in for existing ones. Saving a filter restarts the cluster, and the records it filters out are gone for good.</p><p>Camunda&#8217;s official SaaS multi-tenancy support applies to generation 8.8 and later clusters. The same per-cluster toggle already appears in the 8.8 and 8.9 docs, and the 8.10 release note says no upgrade is required. Tenancy checks remain off by default, and turning them on locks out any principal without a tenant assignment.</p><h3>On Self-Managed</h3><p><a href="https://docs.camunda.io/docs/next/self-managed/upgrade/helm/890-to-8100/">Helm v4 is required</a> and chart 15.x fails fast on Helm v3. Do the CLI switch while you are still on 8.9, because chart 14.x is the last one that accepts both. Nothing has to be migrated with it: Helm is client-side, both CLIs read the same release secrets, and there is no <code>helm 3to4</code> step for Camunda charts. Server-side apply is on by default in Helm 4, which turns duplicate <code>env</code> entries into an install error. Bitnami subcharts are gone, another migration that belongs on 8.9. Minimum versions rise across ElasticSearch and OpenSearch (v2.19+), and PostgreSQL 14, SQL Server 2019, and H2 2.3 are dropped.</p><p>Four defaults then move underneath the install, and none of them stops the upgrade. RocksDB memory allocation stops being 512 MB per partition and becomes 10% of broker memory shared across all of them, which puts break-even at 5 GB per partition and most clusters below it. The smaller block cache sends reads that used to come from memory to disk, so throughput falls under load and the first sign of it is a latency graph. OpenSearch index replicas go from 0 to 1, which on a single OpenSearch node plan leaves a replica with nowhere to go, so cluster health sits yellow and the alert fires for a redundancy you are not getting, and on a real cluster it roughly doubles the disk every new index costs. The exporter switches to Optimize mode and drops every record value type Optimize does not consume, job records included: anything reading the Zeebe record indices directly quietly thins out. Optimize stops flattening object variables, so reports built on their properties come back empty, and the reimport that fixes them only works while the records are still inside the Zeebe retention window.</p><p>We made the Helm 4 switch on our own self-managed 8.9 platform on STACKIT in mid-September, a month before GA, and it was a non-event. Chart 14.x takes both CLIs, so it came down to a version pin in CI and a new test rule that refuses a Helm 3 binary. Test and prod rendered byte for byte identical across the Helm 4 patches we tried, every policy assertion passed, and nothing in the cluster moved. The reason to do it early is ArgoCD, which renders every Application with Helm 4 from 3.5 on: Helm 4 keeps explicit <em>null</em> fields that Helm 3 dropped, so a chart can render differently with no version change at all.</p><p>We turned that exporter filter on by hand in early August, on the same platform. Export was the binding constraint in our load tests then, and switching it on doubled export to 851.000 <em>records/minute</em> with the exporter thread still 40 percent idle, which moved the bottleneck off export and onto the engine&#8217;s accept ceiling. In 8.10 it arrives as a default, so the throughput comes for free, and so does the record loss that pays for it.</p><h2>Summary</h2><ul><li><p>Still on 8.7: standard maintenance ends on October 13, the day 8.10 ships. Nothing else on this list matters until that hop is scheduled.</p></li><li><p>Custom integrations: inventory every Operate API, Tasklist API v1, <em>ZeebeClient</em> and <em>ZeebeProcessTest</em> dependency now. The library removals surface as compile errors, the API removals as failing calls.</p></li><li><p>Self-managed Kubernetes: switch to the Helm v4 CLI while chart 14.x still accepts both, then re-render your values against chart 15.x and check custom exporters for the changed completed-job records.</p></li><li><p>Agent models: move the element templates to latest v1 or v2 and redeploy, or the new Operate panel stays empty.</p></li><li><p>Everyone: the Hub names reach runbooks, training material and support conversations long before anyone touches a cluster.</p></li></ul><p><span>The full detail is on Camunda's what's-new page for 8.10: </span><a href="https://docs.camunda.io/docs/next/reference/announcements-release-notes/8100/whats-new-in-810/">https://docs.camunda.io/docs/next/reference/announcements-release-notes/8100/whats-new-in-810/</a><span>.</span></p>]]></content:encoded></item><item><title><![CDATA[Camunda On STACKIT, Part 6: The Bill And The Verdict]]></title><description><![CDATA[What Held, What Hurt, And What A Sovereign Camunda Platform Costs To Run]]></description><link>https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-6-the-bill</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-6-the-bill</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 24 Sep 2026 08:01:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4UiX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.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_!4UiX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4UiX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!4UiX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!4UiX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!4UiX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4UiX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png" width="1456" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11335697-279a-4f09-a328-1b080181c8e7_1500x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1469793,&quot;alt&quot;:&quot;Camunda on STACKIT over a stylized European data-center network&quot;,&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://theintermediatecatchevent.substack.com/i/216281951?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Camunda on STACKIT over a stylized European data-center network" title="Camunda on STACKIT over a stylized European data-center network" srcset="https://substackcdn.com/image/fetch/$s_!4UiX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!4UiX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!4UiX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!4UiX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11335697-279a-4f09-a328-1b080181c8e7_1500x800.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Camunda On STACKIT (AI, 2026)</em></figcaption></figure></div><p>In the last article in this series, I want to give you an overview of our learnings and what we eventually paid during development. We can&#8217;t answer every question yet, but we are very close to a production-ready platform that holds the load a customer expects.</p><p>To make it short: One day of STACKIT billing across our three projects came to 70 &#8364;. Prod accounted for 51 &#8364;, test for 16 &#8364; and shared infrastructure for 3 &#8364;.</p><p>That is only the provider bill. The people who build and run the platform cost more than the infrastructure does. We did not do any of this to save money.</p><h2>What Held</h2><p>I would use Camunda&#8217;s AWS single-region reference again. STACKIT publishes no equivalent blueprint, so we mapped the published architecture component by component, and that mapping is where every major prod choice came from, including the three brokers spread across three availability zones.</p><p>The two-repository split and keyless pipeline from <a href="https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-2-building?r=5i6h9p">Part 2</a> also held up. Every change that reached a cluster passed a review with a person&#8217;s name on it. Infrastructure and platform changes kept separate permissions and separate failure boundaries.</p><p>Above the infrastructure layer we wrote exactly one STACKIT-specific line: a load-balancer annotation that turns on PROXY protocol. Everything else is standard charts, manifests and operators. Nothing in the Camunda layer knows which cloud it sits on.</p><p>Decision records, a findings log and runbooks kept earlier work available to the next person, and to the next agent session. A hand-maintained set of numbered Markdown files stops working once the platform is live and several people are filing findings at once, so we froze both registers and moved new work into tracked GitHub issues.</p><p><a href="https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-5-what-it?r=5i6h9p">Part 5</a> put a number on the sizing: roughly 72 to 80 accepted process instances per second on the current hardware.</p><h2>What Hurt</h2><p>STACKIT&#8217;s managed Kubernetes gives you a cluster and stops there. Ingress, certificate automation and secret synchronization were ours to install, and then ours to keep running, including their upgrades and their alerts. On Camunda&#8217;s reference cloud two of those three are managed services and the third is an add-on. That work carries on after go-live, so price it in. It is the warning I would give first.</p><p>Managed OpenSearch came with a narrower limit. Its application credential has no index-lifecycle permissions, and with Camunda&#8217;s retention enabled the engine never finished starting up. We turned native retention off and scheduled a job to prune dated indices instead.</p><p>In August, prod&#8217;s search cluster was renamed outside Terraform. The provider treats that name as immutable, so the next plan proposed destroying the secondary store and building a new one. Destroy protection stopped the apply. I shipped a temporary name override so the rest of the prod changes could go out, opened a ticket, and removed the override once STACKIT put the original name back.</p><p>Ingress ate several days. <em>spec.loadBalancerSourceRanges</em> does enforce the L4 restriction, so the source gate holds at layer 4. Separating the UI audience from the Zeebe audience needs L7 rules on top of that, and those rules only work when the PROXY protocol chain in front of them is correct. <a href="https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-3-platform?r=5i6h9p">Part 3</a> has the detail, together with our decision to postpone inbound connectors and the broad HTTPS egress that outbound connectors still need.</p><p>Entra was worse. One audience value in the wrong field produced a login loop, and a group-mapping rule then used equality against a claim that arrives as a list. We only found them by walking the whole authentication path, from directory membership through to Camunda authorization.</p><p>There are few Camunda-on-STACKIT examples to copy, and some provider differences only showed up under load. We upgraded the search plan, and then found an exporter setting that doubled capacity on the hardware we already had. <a href="https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-5-what-it?r=5i6h9p">Part 5 tells that story</a>. The bigger plan is independently justified now for its heap and shard budget, and we still bought it in the wrong order: capacity problems come with a bill attached, and the order you investigate them in decides how big it is.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Intermediate Catch Event! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>What It Costs</h2><p>The prod bill shows where the money went.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yYBw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yYBw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png 424w, https://substackcdn.com/image/fetch/$s_!yYBw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png 848w, https://substackcdn.com/image/fetch/$s_!yYBw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png 1272w, https://substackcdn.com/image/fetch/$s_!yYBw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!yYBw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png" width="1456" height="701" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:701,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111766,&quot;alt&quot;:&quot;Breakdown of one day of prod costs across Kubernetes, OpenSearch, PostgreSQL, storage and platform services&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/216281951?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Breakdown of one day of prod costs across Kubernetes, OpenSearch, PostgreSQL, storage and platform services" title="Breakdown of one day of prod costs across Kubernetes, OpenSearch, PostgreSQL, storage and platform services" srcset="https://substackcdn.com/image/fetch/$s_!yYBw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png 424w, https://substackcdn.com/image/fetch/$s_!yYBw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png 848w, https://substackcdn.com/image/fetch/$s_!yYBw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png 1272w, https://substackcdn.com/image/fetch/$s_!yYBw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86369c3-a80d-4c07-8b27-492c39aa6035_1616x778.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Test came to 15,80 &#8364; for the same platform shape at smaller sizes. Shared infrastructure cost 3,20 &#8364;, and almost all of that is one CI runner on a fixed public address. The managed services are gated by address, so a changed IP would lock that runner out of every one of them. Three euros a day is the floor you cannot easily design away.</p><p>We hibernate the test and prod clusters outside working hours. On the measured day that put 39 node-hours on prod&#8217;s bill instead of 72, and 13 on test&#8217;s instead of 24. The infra project has no cluster to hibernate, so its 3,20 &#8364; lands every day of the month, weekends included.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Bbk7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Bbk7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png 424w, https://substackcdn.com/image/fetch/$s_!Bbk7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png 848w, https://substackcdn.com/image/fetch/$s_!Bbk7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png 1272w, https://substackcdn.com/image/fetch/$s_!Bbk7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Bbk7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png" width="1456" height="847" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:847,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:116392,&quot;alt&quot;:&quot;Daily prod cost through August 2026 as stacked bars; the green Kubernetes node band is present on about eleven days and absent on the rest, and the mix of services changes during the first week&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/216281951?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Daily prod cost through August 2026 as stacked bars; the green Kubernetes node band is present on about eleven days and absent on the rest, and the mix of services changes during the first week" title="Daily prod cost through August 2026 as stacked bars; the green Kubernetes node band is present on about eleven days and absent on the rest, and the mix of services changes during the first week" srcset="https://substackcdn.com/image/fetch/$s_!Bbk7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png 424w, https://substackcdn.com/image/fetch/$s_!Bbk7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png 848w, https://substackcdn.com/image/fetch/$s_!Bbk7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png 1272w, https://substackcdn.com/image/fetch/$s_!Bbk7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13aab603-ea86-4292-ac1d-19af1e048b2b_1698x988.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Prod, every day of August. The green band is the Kubernetes nodes, so the bars without it are the days the cluster was asleep, and the colours shift in the first week where we swapped the OpenSearch plan and a few storage classes. Totalling to 1.240 Euro.</em></figcaption></figure></div><p>August came to 1.240 &#8364; for prod, and that is what we actually paid. It is not a rate. We swapped resources in the first week and woke the clusters when there was work rather than to a timetable, so the nodes billed 426 hours across the three of them over the whole month. Take the month as evidence that hibernation works, and take the numbers that follow from one regular day instead.</p><p>So take one regular day, the one in the table above, where both clusters woke at 07:00 and slept at 20:00. Both projects run the same machine type at 0,41 &#8364; per node-hour, and compute is the only line the schedule moves: around the clock, prod&#8217;s three nodes take it from 15,96 &#8364; to 29,46 &#8364; a day and test&#8217;s single node from 5,32 &#8364; to 9,82 &#8364;. Everything else on the bill, the replicated stores and the storage and the cluster management, holds at its measured level either way, which is why a weekend with both clusters asleep still costs 49,05 &#8364; across the three projects. Scaling that one day two ways gives the months below, both of them arithmetic rather than a billed month: the left column keeps the hibernation schedule, the right one never lets the nodes sleep. Put customer processes on this platform and the right column is your bill.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_95D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_95D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png 424w, https://substackcdn.com/image/fetch/$s_!_95D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png 848w, https://substackcdn.com/image/fetch/$s_!_95D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png 1272w, https://substackcdn.com/image/fetch/$s_!_95D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!_95D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png" width="1400" height="466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:466,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45425,&quot;alt&quot;:&quot;Projected monthly cost per project on the weekday schedule against running around the clock; prod 1.403 &#8364; against 1.945 &#8364;, test 428 &#8364; against 609 &#8364;, infra 96 &#8364; either way, and 1.927 &#8364; against 2.650 &#8364; for all three&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/216281951?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Projected monthly cost per project on the weekday schedule against running around the clock; prod 1.403 &#8364; against 1.945 &#8364;, test 428 &#8364; against 609 &#8364;, infra 96 &#8364; either way, and 1.927 &#8364; against 2.650 &#8364; for all three" title="Projected monthly cost per project on the weekday schedule against running around the clock; prod 1.403 &#8364; against 1.945 &#8364;, test 428 &#8364; against 609 &#8364;, infra 96 &#8364; either way, and 1.927 &#8364; against 2.650 &#8364; for all three" srcset="https://substackcdn.com/image/fetch/$s_!_95D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png 424w, https://substackcdn.com/image/fetch/$s_!_95D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png 848w, https://substackcdn.com/image/fetch/$s_!_95D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png 1272w, https://substackcdn.com/image/fetch/$s_!_95D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2d3ed2-f4d8-4aa4-8f77-e794e0678c1d_1400x466.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Three services account for 75 % of the prod bill: the nodes, the search cluster and the database. Add cluster management and the share reaches 85 %. All the block storage together is 13 %. The load balancer, the public IPs, DNS, the secret store and object storage come to 1,4 % between them, which is noise. The two replicated data stores cost more than all the compute put together. That is what it costs to let prod survive the loss of an availability zone, and it is why test&#8217;s day costs less than a third of prod&#8217;s.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0vyC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0vyC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png 424w, https://substackcdn.com/image/fetch/$s_!0vyC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png 848w, https://substackcdn.com/image/fetch/$s_!0vyC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png 1272w, https://substackcdn.com/image/fetch/$s_!0vyC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!0vyC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png" width="1456" height="719" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:719,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:163107,&quot;alt&quot;:&quot;The seven most expensive prod services in August 2026; OpenSearch 376,53 &#8364;, PostgreSQL 280,81 &#8364;, Kubernetes nodes 174,30 &#8364;, cluster management 139,83 &#8364; and three block storage lines&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/216281951?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The seven most expensive prod services in August 2026; OpenSearch 376,53 &#8364;, PostgreSQL 280,81 &#8364;, Kubernetes nodes 174,30 &#8364;, cluster management 139,83 &#8364; and three block storage lines" title="The seven most expensive prod services in August 2026; OpenSearch 376,53 &#8364;, PostgreSQL 280,81 &#8364;, Kubernetes nodes 174,30 &#8364;, cluster management 139,83 &#8364; and three block storage lines" srcset="https://substackcdn.com/image/fetch/$s_!0vyC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png 424w, https://substackcdn.com/image/fetch/$s_!0vyC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png 848w, https://substackcdn.com/image/fetch/$s_!0vyC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png 1272w, https://substackcdn.com/image/fetch/$s_!0vyC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac17bdd-3673-47b5-acf7-3dd30a242370_1794x886.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Prod&#8217;s most expensive services over the month. The search cluster and the database each cost more than the (partly hibernated) nodes.</em></figcaption></figure></div><p>A full month sharpens it. In August the search cluster cost 376,53 &#8364;, the database 280,81 &#8364; and the nodes 174,30 &#8364;, so the two replicated stores came to nearly four times the compute rather than the 1,4 times the single day showed. Hibernation is why: the stores bill every hour and the nodes do not.</p><p>The larger cost is people. I built this platform with an agent, which is <a href="https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-4-built-with?r=5i6h9p">Part 4</a>&#8217;s story. Running it takes two, because nobody is on call every day of the year.</p><p>Camunda charges two things: a fixed amount per root process instance, and the infrastructure it runs on. Self-managing changes only the second one. You still owe the per-instance amount, and in place of Camunda&#8217;s infrastructure component, which is billed at roughly cost recovery and lands below what we pay for prod, you carry your own bill and the people who run it. There is no list price to check that against, because agreements get negotiated around volume and need. Sovereign self-managed prod costs more either way, on the bill and on the team. For an organization that needs EU legal sovereignty, SaaS on US infrastructure is not an option, whatever its price.</p><h2>Running It</h2><p>Someone still has to run it. Our runbooks cover credential rotation per credential, an identity-provider outage, a failed apply against a cluster that is not awake, restoring either environment, an unstuck GitOps sync, rebalancing partition leaders, and the day the office address changes and every gate rejects at once. You read them after the build team has moved on, or while something is already broken.</p><p>We run the monitoring stack ourselves, the kube-prometheus-stack with Loki for logs, so the alerts and dashboards are ours to keep working. Buying STACKIT&#8217;s managed observability instead would have added another 200 &#8364; to the monthly bill.</p><p>Keeping the platform current is the piece we haven&#8217;t automated yet. An agent pins the version it learned, so a chart or provider release that has already been superseded can arrive in a pull request looking current, and a reviewer is a poor detector for that. We plan to put Renovate on both repositories and let a bot watch upstream releases.</p><p>Backups run nightly into object storage. Both environments have been restored end to end, and the data came back.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-6-the-bill?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading The Intermediate Catch Event! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-6-the-bill?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-6-the-bill?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><h2>The Verdict</h2><p>The repositories rebuild both environments, policy checks guard the exposed paths, and <a href="https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-5-what-it?r=5i6h9p">Part 5</a> found the current ceiling. A team of two can run this platform today. That is the bar I would set before calling something a platform.</p><p>STACKIT carries Camunda and its process data with no US operator underneath. Two dependencies sit outside that data path: Entra for identity and GitHub for code hosting. The capacity number belongs to our synthetic process shape, so your own process mix still has to be measured.</p><p>My verdict: it makes sense when legal sovereignty and less dependence on American hyper-scalers are real requirements. You control where the platform and the process data live, and you carry the higher infrastructure bill and the team that comes with it. Take the requirement away and I would struggle to justify either.</p><p>For this build, sovereignty means about 2.650 &#8364; a month of projected infrastructure across the three projects, the people who keep it running, and the per-instance fee you would owe Camunda either way.</p>]]></content:encoded></item><item><title><![CDATA[Camunda On STACKIT, Part 5: What It Actually Holds]]></title><description><![CDATA[Measuring Accepted Throughput When Backpressure And Export Lag Disagree]]></description><link>https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-5-what-it</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-5-what-it</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 17 Sep 2026 08:01:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kw94!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.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_!kw94!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kw94!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!kw94!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!kw94!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!kw94!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kw94!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png" width="1456" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png&quot;,&quot;srcNoWatermark&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9add880-14c7-47f6-aa6d-b2a40d0c6211_1500x800.png&quot;,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1469793,&quot;alt&quot;:&quot;Camunda on STACKIT over a stylized European data-center network&quot;,&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://theintermediatecatchevent.substack.com/i/214852088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9add880-14c7-47f6-aa6d-b2a40d0c6211_1500x800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Camunda on STACKIT over a stylized European data-center network" title="Camunda on STACKIT over a stylized European data-center network" srcset="https://substackcdn.com/image/fetch/$s_!kw94!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!kw94!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!kw94!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!kw94!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8617800c-18e8-4ca1-bf6c-bdeaa4c864be_1500x800.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Camunda On STACKIT (AI, 2026)</em></figcaption></figure></div><p><span>We had sized prod from Camunda&#8217;s reference architecture and our own arithmetic. No real load had passed through it. We spent the next week finding a capacity number we could support with measurements.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ihZi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ihZi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png 424w, https://substackcdn.com/image/fetch/$s_!ihZi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png 848w, https://substackcdn.com/image/fetch/$s_!ihZi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png 1272w, https://substackcdn.com/image/fetch/$s_!ihZi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ihZi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png" width="484" height="360.3538767395626" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:749,&quot;width&quot;:1006,&quot;resizeWidth&quot;:484,&quot;bytes&quot;:147171,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/214852088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.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_!ihZi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png 424w, https://substackcdn.com/image/fetch/$s_!ihZi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png 848w, https://substackcdn.com/image/fetch/$s_!ihZi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png 1272w, https://substackcdn.com/image/fetch/$s_!ihZi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605e86a1-2ff0-449a-b8e4-ba790818e24f_1006x749.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Prod cluster under load</figcaption></figure></div><p><span>The prod setup under test had three </span><em><span>g2i.8</span></em><span> nodes, 8 vCPU and 32 GiB each, one per availability zone, with Zeebe across them as three brokers, three partitions, replication factor 3 and a 64 Gi volume per broker. Secondary storage is a managed OpenSearch service, three nodes in HA, which started the week at 2 vCPU and 8 GiB per node. Two exporters run on every partition: the newer one feeds Operate, Tasklist and the search APIs, and the legacy one is there because Optimize needs it.</span></p><p><span>The first graph looked good. For a few minutes we thought the platform had exceeded our expectations, until the job-completion count showed that the generator was producing far less load than configured. Later runs repeated that pattern: one metric supported a capacity estimate, then another showed which limit we had measured. Across six runs, we produced four estimates and discarded three.</span></p><p><span>Note: The bench cluster is specific to our setup. The measurement errors apply to any Camunda 8 benchmark.</span></p><h2>How Camunda Absorbs Load</h2><p><span>Camunda absorbs load by measuring itself. Nothing here caps the request rate. Each broker derives its own ceiling from how fast it is answering, and three loops move that ceiling.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bZV9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bZV9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png 424w, https://substackcdn.com/image/fetch/$s_!bZV9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png 848w, https://substackcdn.com/image/fetch/$s_!bZV9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png 1272w, https://substackcdn.com/image/fetch/$s_!bZV9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bZV9!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png" width="1200" height="464.010989010989" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:563,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:178800,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/214852088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.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_!bZV9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png 424w, https://substackcdn.com/image/fetch/$s_!bZV9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png 848w, https://substackcdn.com/image/fetch/$s_!bZV9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png 1272w, https://substackcdn.com/image/fetch/$s_!bZV9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041bfa47-0b37-48a4-8a9a-a6bc557fb3ae_1791x693.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The three loops of broker throughput</figcaption></figure></div><p><span>The first loop: A command is not executed when it arrives. The broker appends it to its partition&#8217;s log, and the stream processor reads it back later. So a broker always holds requests it has accepted and not yet answered. It counts those, in flight, and measures the round trip from accepting a request to answering it. Above a limit on the in-flight count, requests are rejected instead of queued. That rejection is </span><em><span>backpressure</span></em><span>, and limit and count are both per partition.</span></p><p><span>The limit moves. An adaptive algorithm recalculates it, AIMD by default: a round trip faster than the broker expects raises the limit by one, a slower one cuts it by a tenth. Ours sits at an initial </span><em><span>100 in-flight / partition</span></em><span>, with a floor of 1 so sustained load cannot walk it down to nothing.</span></p><p><span>Exporters close the second loop. Each walks the same log from its own position into secondary storage, the copy that Operate, Tasklist, Optimize and the search APIs read. Flow control limits the export write rate too, and can throttle it as the unexported backlog grows. Slower writes leave the stream processor waiting on its results, the round trip lengthens, the limit shrinks. A slow search cluster reaches clients as engine backpressure.</span></p><p><span>Disk closes the third loop. The log compacts only up to the earliest exporter position, so an exporter that stops advancing keeps it growing. Below 2 GB free the broker rejects every client command and pauses processing, and below 1 GB it stops accepting replicated events too. Both limits can be configured.</span></p><p><span>Whichever loop closed, the client gets RESOURCE_EXHAUSTED over gRPC, or an HTTP 503 saying the same, and should retry with backoff and jitter. A flood of start requests and a slow OpenSearch look identical from out there. Completing and failing a job are exempt, accepted above the limit, because work already inside has to be able to leave.</span></p><h2>The First Run Measured The Client</h2><p>We use the<a href="https://github.com/camunda-community-hub/camunda-8-benchmark"> camunda-8-benchmark</a> <span>project from Camunda Community Hub to put load on prod. It starts process instances at a configured rate and completes the service tasks in the synthetic model.</span></p><p><span>The pilot started from a laptop, with one generator driving prod over the public gRPC path at 150 process instances per second. The first dashboard looked almost too good: backpressure stayed under 1%, with no engine ceiling in sight. We wanted to believe the sizing had headroom.</span></p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ISYx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png 424w, https://substackcdn.com/image/fetch/$s_!ISYx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png 848w, https://substackcdn.com/image/fetch/$s_!ISYx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png 1272w, https://substackcdn.com/image/fetch/$s_!ISYx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ISYx!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png" width="1200" height="118.68131868131869" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:144,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:147032,&quot;alt&quot;:&quot;BPMN benchmark process with ten sequential service tasks, a gateway and two one-minute timer events&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/214852088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="BPMN benchmark process with ten sequential service tasks, a gateway and two one-minute timer events" title="BPMN benchmark process with ten sequential service tasks, a gateway and two one-minute timer events" srcset="https://substackcdn.com/image/fetch/$s_!ISYx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png 424w, https://substackcdn.com/image/fetch/$s_!ISYx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png 848w, https://substackcdn.com/image/fetch/$s_!ISYx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png 1272w, https://substackcdn.com/image/fetch/$s_!ISYx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1868497a-648f-44ab-aec0-2dd28acdeb5a_5823x576.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div><figcaption class="image-caption"><em>A synthetic process with 10 sequential steps from the benchmark project</em></figcaption></figure></div><p><span>The job-completion count showed the problem. The model has ten sequential service tasks, so 150 PI/s needs roughly 1.500 completions per second. The generator plateaued between 585 and 606. We traced the gap to the ingress recycling HTTP/2 connections after about a thousand requests. Each recycle killed the job-push streams, leaving pushed jobs on dead streams until timeout. Prod had looked comfortable because it never received the load we thought we were sending.</span></p><p><span>So we built a permanent cluster whose only job is generating load: three nodes, one generator per node so they cannot contend for a CPU or a network queue. Generators inside prod would have been cheaper and wrong twice, because their CPU competes with the brokers and they skip the public ingress path under investigation. The bench cluster comes in over the internet instead, admitted by a narrow allowlist on that one route.</span></p><p><span>Every run since reports the generators&#8217; own CPU against their limit. Peak draw went from 868 millicores on the first cluster run to 98 of a 3.000 limit on the last. A load test that cannot show its generator had headroom has not established what it measured.</span></p><h2>The Bottleneck Was Downstream</h2><p><span>With three generators, we offered the same 150 PI/s aggregate and watched the client path stay clean: zero GOAWAY, zero closed streams, zero UNAVAILABLE. Prod now received the intended load. Every error was engine-side, and backpressure reached 42% of start attempts against a 10% target.</span></p><p><span>The engine was only one path. Export lag climbed on all three partitions to 2,85 million records after five and a half minutes of load, and draining it afterwards took fourteen minutes. The original sizing exported about 280.000 records per minute, so every minute of load cost roughly 2,5 minutes of export tail. Export capacity, not the engine, bounded how long a run could last. Both sides of that ratio changed again later in the week.</span></p><p><span>We answered with three changes at once. That got the next run moving and made attribution impossible. Each broker went from a 2 Gi memory request and a 4 Gi limit to 4 Gi and 8 Gi, with its CPU limit left at 3 cores. The managed search cluster moved from three nodes at 2 vCPU and 8 GiB to three at 4 vCPU and 16 GiB. We also set the exporter&#8217;s index refresh interval to 5 seconds. Together they raised export capacity about 36%, to 380.000 records per minute.</span></p><p><span>The broker resize added memory headroom. Peak working set stayed at 3,73 GiB, which was 91% of the old limit and 47% of the new one. Because the image exits the JVM on out-of-memory, a longer run at the old limit could have cost us quorum.</span></p><h2>Capacity Arithmetic Uses The Accepted Rate</h2><p><span>Export remained the bottleneck, so we wanted the rate at which its backlog stopped growing. Two reports estimated that rate instead of measuring it, and both came out about 2,4 times too high.</span></p><p><span>The method was reasonable. </span><em><span>Export capacity</span></em><span> and </span><em><span>record generation</span></em><span> are both rates, so dividing one by the other tells you what share of the current load the exporter can keep up with. Apply that share to the load and you have a sustainable rate.</span></p><p><span>The load we applied it to was the wrong number. We&#8217;re </span><em><span>offering</span></em><span> 150 process instances per second, but backpressure was rejecting 40 - 47% of those starts, so the engine only ever accepted around 80. Nearly half the load in the calculation never reached the engine.</span></p><p><span>Capacity arithmetic has to use </span><em><span>accepted starts</span></em><span>. Nothing in the tooling tells you which of the two rates you are looking at, so it is worth checking before either one goes into a calculation. Once we saw the mistake, another spreadsheet felt less useful than a measured crossing point, so we went back to the cluster.</span></p><h2>Backpressure Is Not A Capacity Signal</h2><p><span>Sustainable means export lag neither grows nor shrinks over a long window, measured as the slope of the lag curve. We kept a standing backlog between steps instead of draining, so the exporter stayed saturated and the slope was generation minus capacity. Draining between steps would have made every slope depend on the exporter warming up again.</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;markdown&quot;,&quot;nodeId&quot;:&quot;e27a2f13-a914-4923-abfa-d9d73776a356&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-markdown"># Export lag: positions appended to the log, minus positions the exporter
# has walked. Take the slope over a long window; the level tells you nothing.
sum(
    max by (partition) (zeebe_log_appender_last_appended_position)
  - max by (partition) (zeebe_exporter_last_exported_position)
)</code></pre></div><p>We planned to increase the rate in fixed steps from 75 PI/s. The first step produced +415,000 records per minute of lag, so we reduced the rate instead. Four steps at 75, 45, 36 and 30 PI/s gave lag slopes of +415.000, +118.000, +2.000 and &#8722;85.000 records per minute. The line between them crossed break-even at 35,9 PI/s.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!phFb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!phFb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!phFb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!phFb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!phFb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!phFb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:186025,&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://theintermediatecatchevent.substack.com/i/214852088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.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_!phFb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!phFb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!phFb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!phFb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08c9d8b-39bf-4d0e-9724-b2b840d15a08_1920x1080.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Export lag slope against offered rate. The four measured steps sit at 75, 45, 36 and 30 PI/s, and the line through them crosses zero at 35.9, which is break-even for this export capacity.</em></figcaption></figure></div><p><span>Backpressure was useless as the instrument. At 30, 36 and 45 PI/s it sat at zero while export fell behind by up to 118.000 records per minute. The benchmark tooling&#8217;s ramp strategies climb until the engine pushes back, so they would have reported double the truth. Export capacity itself was a hard constant near 427.000 records per minute, within 0,4 % whether the brokers were under full load or idle. Nothing was bought between that and the 380,000: same brokers, same plan, one drain reading in an earlier run against a saturated exporter here.</span></p><h2>The Cheapest Capacity Was Free</h2><p><span>The largest improvement was already available in the exporter configuration. The legacy exporter serialized everything the engine produced even though Optimize, its only consumer, imports five record types.</span></p><p><span>Cutting the job records alone, 18% of that exporter&#8217;s write volume, had bought no throughput at all, because the metric that bounds run length counts log positions walked rather than documents written. What worked was dropping records before serialization instead of after, with the exporter&#8217;s own filter for what Optimize imports, plus skipping a class of variable writes on the newer exporter. Same hardware, same load profile, one configuration change:</span></p><ul><li><p><span>export capacity from 427.000 to at least 851.000 records per minute, a measured 2x, with 40% of the exporter thread still idle</span></p></li><li><p><span>the post-run drain from 2,68 million records and nearly nine minutes to 26.000 records and about 90 seconds</span></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DtF8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc159b475-fc59-49e7-add1-890669be2c10_2876x1648.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DtF8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc159b475-fc59-49e7-add1-890669be2c10_2876x1648.png 424w, https://substackcdn.com/image/fetch/$s_!DtF8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc159b475-fc59-49e7-add1-890669be2c10_2876x1648.png 848w, https://substackcdn.com/image/fetch/$s_!DtF8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc159b475-fc59-49e7-add1-890669be2c10_2876x1648.png 1272w, https://substackcdn.com/image/fetch/$s_!DtF8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc159b475-fc59-49e7-add1-890669be2c10_2876x1648.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!DtF8!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc159b475-fc59-49e7-add1-890669be2c10_2876x1648.png" width="1200" height="687.6216968011126" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c159b475-fc59-49e7-add1-890669be2c10_2876x1648.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:1648,&quot;width&quot;:2876,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:443739,&quot;alt&quot;:&quot;Grafana exporter dashboard showing backlog spikes in the earlier runs and near-zero backlog with larger bulk sizes in the tuned run after 15:00&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/214852088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa7044a6-8002-4b52-9855-9cfef83c4c2a_2876x1648.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Grafana exporter dashboard showing backlog spikes in the earlier runs and near-zero backlog with larger bulk sizes in the tuned run after 15:00" title="Grafana exporter dashboard showing backlog spikes in the earlier runs and near-zero backlog with larger bulk sizes in the tuned run after 15:00" srcset="https://substackcdn.com/image/fetch/$s_!DtF8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc159b475-fc59-49e7-add1-890669be2c10_2876x1648.png 424w, https://substackcdn.com/image/fetch/$s_!DtF8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc159b475-fc59-49e7-add1-890669be2c10_2876x1648.png 848w, https://substackcdn.com/image/fetch/$s_!DtF8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc159b475-fc59-49e7-add1-890669be2c10_2876x1648.png 1272w, https://substackcdn.com/image/fetch/$s_!DtF8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc159b475-fc59-49e7-add1-890669be2c10_2876x1648.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>A day of runs on the exporter dashboard. The tuned run starts at 15:00: its export backlog stays flat at essentially zero, where the untuned runs earlier build peaks of 1,1 to 1,5 million records. Bulk size roughly doubles at the same point, to 4.000 to 5.000 documents per flush.</em></figcaption></figure></div><p><span>We had bought hardware before finding the configuration limit. The larger plan raised capacity 1.36x and added a permanent monthly charge; the filter doubled it on the machines already running. The upgrade was still useful because it doubled the search cluster&#8217;s heap, and shard count has since outgrown what the old plan could hold. We should have finished reviewing the exporter configuration before upgrading the search plan. Part 6 shows the cost.</span></p><h2>What It Holds</h2><p><span>Doubling export capacity also doubled the projected break-even rate. The 35,9 PI/s result belonged to roughly 427,000 records per minute of export; at 851.000, the calculated balance is near 72 PI/s. At that rate, engine acceptance became the limiting factor. On the final run we increased the offered rate again, with export tracking generation at every step.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jFJs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jFJs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png 424w, https://substackcdn.com/image/fetch/$s_!jFJs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png 848w, https://substackcdn.com/image/fetch/$s_!jFJs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png 1272w, https://substackcdn.com/image/fetch/$s_!jFJs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!jFJs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png" width="1020" height="379" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:379,&quot;width&quot;:1020,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:25910,&quot;alt&quot;:&quot;Rejected and accepted process instances per second at offered rates of 75, 111 and 150&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/214852088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Rejected and accepted process instances per second at offered rates of 75, 111 and 150" title="Rejected and accepted process instances per second at offered rates of 75, 111 and 150" srcset="https://substackcdn.com/image/fetch/$s_!jFJs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png 424w, https://substackcdn.com/image/fetch/$s_!jFJs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png 848w, https://substackcdn.com/image/fetch/$s_!jFJs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png 1272w, https://substackcdn.com/image/fetch/$s_!jFJs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4e53ae-374f-4bc3-8a3c-256c16e07e3a_1020x379.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>On the final run, accepted throughput peaked around 80 process instances per second and fell to 72.6 when we offered nearly twice that, because rejecting a start still costs the engine work. We trust the range of 72 to 80 accepted process instances per second at this broker CPU limit, with no connectors. Prod completed 963,902 jobs across 25 minutes of load. One instance of this model produces ten jobs and about 186 log records, and that second number is the conversion to redo before comparing any of this to a different process.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fry7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fry7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png 424w, https://substackcdn.com/image/fetch/$s_!fry7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png 848w, https://substackcdn.com/image/fetch/$s_!fry7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png 1272w, https://substackcdn.com/image/fetch/$s_!fry7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!fry7!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png" width="1200" height="685.7142857142857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:473641,&quot;alt&quot;:&quot;Grafana Zeebe dashboard comparing processing, export, backpressure, CPU, gateway requests and disk use across the load-test runs&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/214852088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Grafana Zeebe dashboard comparing processing, export, backpressure, CPU, gateway requests and disk use across the load-test runs" title="Grafana Zeebe dashboard comparing processing, export, backpressure, CPU, gateway requests and disk use across the load-test runs" srcset="https://substackcdn.com/image/fetch/$s_!fry7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png 424w, https://substackcdn.com/image/fetch/$s_!fry7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png 848w, https://substackcdn.com/image/fetch/$s_!fry7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png 1272w, https://substackcdn.com/image/fetch/$s_!fry7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6656b1-0aaa-47a1-9f37-0b9743545b7a_2870x1640.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The same day from the broker side. In the 15:00 run, export per partition runs at 5 to 6K against 2 to 3K in the untuned runs, backpressure comes down to roughly 38% of starts from the mid-40s, and broker disk sits flat under 10 % because the log can compact once export keeps pace.</em></figcaption></figure></div><p><span>That ceiling is self-imposed. Each broker runs with a CPU limit of 3 cores, sat at 2,7 of them under load, and spent 27 to 48% of its scheduler periods throttled against that limit. The nodes underneath have 8 vCPU, and the busiest of the three peaked at 2,7 cores of the 7,9 it has to give. We set the limit to cover the broker&#8217;s three processing threads and left the request at 1 core, because that busy node also carries the ingress controllers and every non-broker Camunda component and is already at 79% of its CPU requests. The measured ceiling belongs to those resource limits; raising them remains untested.</span></p><p><span>The relevant alert changed with the bottleneck. Export backlog identified the limit in the middle runs while backpressure stayed silent. After the exporter change, backpressure identified the engine limit and export lag stayed flat.</span></p><p><span>Operate and the v2 search and statistics APIs read the secondary store, which in the early runs still reported ten thousand active instances more than an hour after everything had finished. Ground truth is the broker&#8217;s exported position. Never diagnose engine state from the search APIs under load.</span></p><p><span>The process shape is synthetic, ten sequential service tasks and two timer catch events, not a customer&#8217;s mix. The longest window we held flat was 22 minutes and the final run carried 25 minutes of load, so nothing here says what a day of it does. We also measured throughput and not client response time, so how long a start takes to return at 70 PI/s is still an open question.</span></p><h2>What You Turn If You Need More</h2><p><span>If you need more throughput, start with the broker CPU limit because the nodes already have unused capacity. Whether raising it moves the accept ceiling is untested: append rate held flat near 13.500 records per second across all three steps of the final run, which does not look CPU-bound, so change one variable and measure. The next option is more cores per broker or bigger nodes, both of which add a permanent cost. More partitions provide horizontal scale, but raising the partition count is a one-way door.</span></p><p><span>Whichever lever you pull, export has to move with it. Its capacity is a hard constant for a given configuration, and break-even scales with that constant. Raising the accept ceiling alone relocates the bottleneck.</span></p><h2>What&#8217;s Next</h2><p><span>The number that survived six runs is 72 to 80 accepted process instances per second at this sizing. The method is what carries beyond our setup: measure the accepted rate and never the offered one, read the export backlog slope while export is the bottleneck, and find out what the exporter thread is doing before buying hardware.</span></p><p><span>Part 6 closes the series with the bill: what the platform costs to run, what held, what hurt, and whether the sovereignty trade was worth it.</span></p>]]></content:encoded></item><item><title><![CDATA[Camunda On STACKIT, Part 4: Built With An Agent]]></title><description><![CDATA[Why An AI Agent Needs The Same Guardrails As Any Engineer]]></description><link>https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-4-built-with</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-4-built-with</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 10 Sep 2026 08:01:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!OxgC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.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_!OxgC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OxgC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!OxgC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!OxgC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!OxgC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OxgC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png" width="1456" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1469793,&quot;alt&quot;:&quot;Camunda on STACKIT over a stylized European data-center network&quot;,&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://theintermediatecatchevent.substack.com/i/211552969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Camunda on STACKIT over a stylized European data-center network" title="Camunda on STACKIT over a stylized European data-center network" srcset="https://substackcdn.com/image/fetch/$s_!OxgC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!OxgC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!OxgC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!OxgC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec92801-e99c-4144-9522-f37c5fdfc919_1500x800.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Camunda On STACKIT (AI, 2026)</em></figcaption></figure></div><p>I was lucky to be in assignments where I&#8217;ve learned a lot about building and running platforms in the cloud. I also learned that you need many resources to build and run a platform. Since we cannot allocate all of our time to this platform blueprint, we decided early to use agents for implementation and documentation. </p><p>Many of the Terraform and Kubernetes manifests behind Parts 2 and 3 came through pull requests opened by our coding agent. It mapped the reference architecture onto an unfamiliar provider, read live state and pushed branches.</p><p>The agent could prepare a branch, but it could not merge the pull request or run a <em>terraform apply</em>, and neither could one of us without going through the same review path. A reviewed merge started the only apply workflow, using an identity scoped to one environment.</p><p>My work shifted. I typed fewer resource blocks and spent more time comparing proposals with live state, reading plans and checking whether the recorded reason matched the change. But that only works when the reviewer knows enough to stop a plausible answer.</p><h2>The Same Guardrails You Would Give A Person</h2><p>Before we started handing work over to an agent, we ensured that an AI harness was in place. Each repository has an operating guide and skills that defines its job, what belongs elsewhere and the rules we learned while building. Stability, blast radius, least privilege and recoverability come before convenience. Providers and backends stay in roots. Reading live state is routine while changing it directly is strictly forbidden.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GfT3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GfT3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png 424w, https://substackcdn.com/image/fetch/$s_!GfT3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png 848w, https://substackcdn.com/image/fetch/$s_!GfT3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png 1272w, https://substackcdn.com/image/fetch/$s_!GfT3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GfT3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png" width="1456" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:248391,&quot;alt&quot;:&quot;Workflow for a change to get to SKE via GitHub actions&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211552969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Workflow for a change to get to SKE via GitHub actions" title="Workflow for a change to get to SKE via GitHub actions" srcset="https://substackcdn.com/image/fetch/$s_!GfT3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png 424w, https://substackcdn.com/image/fetch/$s_!GfT3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png 848w, https://substackcdn.com/image/fetch/$s_!GfT3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png 1272w, https://substackcdn.com/image/fetch/$s_!GfT3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d6e614a-97aa-40b9-839e-4f499cdd7af9_2755x917.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>How changes by an agent are driven and checked.</em></figcaption></figure></div><p>The guidance gets more specific near the work. Our runbooks folder has its own rules because an incident procedure needs different checks from a Terraform module, while Terraform and Helm conventions load only for sessions that use those tools. The agent starts each task with a small, relevant piece of the platform&#8217;s history instead of one huge prompt.</p><p>Every check from Part 3 runs on all pull requests, and the per-environment identities from Part 2 limit the eventual apply. We already needed those controls for ourselves. Everyone has a bad afternoon, copies a value from the wrong tab or points a command at the wrong environment.</p><p>For larger changes, Claude writes and ChatGPT reviews before I do. The second model has none of the discussion that produced the diff and must judge the evidence on the page, which is useful for finding unstated assumptions or a solution that has grown beyond the problem. I make the final decision. Two models can agree on the same bad idea with impressive fluency.</p><h2>Everything Goes In The Repo</h2><p>A human who debugged the managed OpenSearch will probably remember its provider-assigned high port number. A new agent session starts without that memory and uses the default port number.</p><p>Before closing a session, we put what it learned into the repository. Decision records capture the reason for an architecture, the alternatives we rejected and the condition that would make us revisit it; the next session reads that before proposing a change, and a reviewer can inspect the reasoning without reconstructing it from a diff. Review became the bottleneck quickly, so that context saved real time.</p><p>A findings log records smaller provider constraints, such as a bucket that cannot be deleted while it still contains object versions. Without that entry, a later session has to investigate the same failure again. That short feedback loop produced more decision records, findings and runbooks than we would have written by hand. We also keep track of open issues in GitHub, if there is no time or urgency to fix it right away.</p><p>They still go stale. At one point, decision records referred to Terraform variables that no longer existed. We treat stale documentation as a bug because the agent will follow it just as confidently as current instructions.</p><h2>Where Our Agent Was Confidently Wrong</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vMb6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vMb6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png 424w, https://substackcdn.com/image/fetch/$s_!vMb6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png 848w, https://substackcdn.com/image/fetch/$s_!vMb6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png 1272w, https://substackcdn.com/image/fetch/$s_!vMb6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!vMb6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png" width="442" height="261.74966352624494" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:440,&quot;width&quot;:743,&quot;resizeWidth&quot;:442,&quot;bytes&quot;:90690,&quot;alt&quot;:&quot;Diagram contrasting what each gate can match, a source address and port at L4 against the requested hostname at L7&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211552969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Diagram contrasting what each gate can match, a source address and port at L4 against the requested hostname at L7" title="Diagram contrasting what each gate can match, a source address and port at L4 against the requested hostname at L7" srcset="https://substackcdn.com/image/fetch/$s_!vMb6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png 424w, https://substackcdn.com/image/fetch/$s_!vMb6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png 848w, https://substackcdn.com/image/fetch/$s_!vMb6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png 1272w, https://substackcdn.com/image/fetch/$s_!vMb6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdb692f7-701f-478e-8857-dfbb293ca8c8_743x440.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>What each layer can match: the requested hostname is only visible at L7, while L4 sees an address and port.</em></figcaption></figure></div><p><a href="https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-3-platform?r=5i6h9p&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcomeOnShare=true">The load-balancer work from part 3</a> showed what happens when the agent is uncertain. An early test appeared to show that the allowed source ranges did nothing, so it treated the observation as a provider limitation and moved filtering into the ingress controller. A bad L7 configuration then returned 403 for every request in test. Its next proposal concluded that this cloud could not gate the surface reliably.</p><p>After two days, we had three architectures around a mechanism we had never isolated. I stopped the sequence, removed the workarounds and repeated the L4 check with a disposable load balancer. An excluded caller was blocked in ten out of ten attempts, and access returned when we restored the admitted range. <em>spec.loadBalancerSourceRanges</em> was enforced. We never found what had invalidated the early observation.</p><p>L7 filtering still has a job. Our UI and Zeebe routes have different audiences, and the ingress controller needs the real client address from the PROXY protocol chain. The final design kept both layers for distinct reasons. The agent had sounded equally confident through all three conclusions.</p><p>Version drift was quieter. The agent used chart versions it knew from training data instead of checking the registry, and both the GitOps controller and log shipper deployed cleanly several releases behind current. Nothing failed to draw our attention to their age.</p><p>The generated Terraform also pinned the STACKIT provider to 0.80, where service-account key files looked unavoidable. Workload identity federation had arrived in 0.82, and Terraform could manage the trust from 0.95. Both versions predated our build. We found the gap when local applies moved to GitHub Actions, upgraded the provider and gave infra, test and prod federated identities. The old dependency had excluded a safer design from consideration.</p><p>It also invented plausible details. We saw variable names that sounded native to the repository and did not exist. Once, it drafted a commit message describing a step that had never run, turning an intention into an apparent fact.</p><p>During a prod outage, the agent added and removed a dummy range on a managed service&#8217;s access list in the hope that the provider gateway would reconfigure itself. Nothing changed. We eventually traced the failure to an egress policy pinned to the conventional port for a service the provider had placed on a high range. The guess had changed the control plane before we understood the traffic path.</p><h2>Runbooks An Agent Can Run</h2><p>Somebody follows a runbook under time pressure and without the author&#8217;s context. Any missing precision has to be supplied during the incident.</p><p>Our standard grew out of procedures we would use while tired. Every command block is self-contained and names its environment and stack. Commands, paths, metrics and thresholds must come from the repository or a read-only query. Verification includes the expected output. A destructive step identifies its point of no return and the data at risk.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;shell&quot;,&quot;nodeId&quot;:&quot;025a03f9-f563-4559-8087-4ee06c4d9a8b&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-shell"># Illustrative verification step: self-contained, with a named healthy value
export KUBECONFIG=~/.kube/config/k8-test.yml
kubectl -n camunda get externalsecret app-connection-config
# READY is True within ~30s. If it stays False, the credential did not sync,
# and you are in step 4, not step 5.</code></pre></div><p>An experienced operator may be able to rescue a step that says &#8220;check it worked&#8221; by inventing the test from memory. An agent may instead report success against a condition it never evaluated. We write the check down, including the healthy value, which makes the same runbook usable by a tired person and an agent under supervision.</p><p>We have not handed a runbook to an agent and walked away. The flat confidence in the last section is why.</p><h2>What&#8217;s Next</h2><p>The agent made us faster at producing changes. Review, written context and executable checks became a larger share of the work.</p><p>Supervision stays in the operating model for one reason I have not found a technical control for: an engineer will often hesitate when they are out of their depth, while the agent can sound exactly as confident when it is guessing. That is how the load-balancer investigation lasted two days.</p><p>Part 5 measures what the platform holds under load. We ran six tests and got three wrong answers before the numbers meant anything.</p>]]></content:encoded></item><item><title><![CDATA[Camunda On STACKIT, Part 3: Platform Hardening]]></title><description><![CDATA[How We Secured Camunda And Ensured Stability Over The Whole Platform]]></description><link>https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-3-platform</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-3-platform</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 03 Sep 2026 08:02:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uMmu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.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_!uMmu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uMmu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!uMmu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!uMmu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!uMmu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uMmu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png" width="1456" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1469793,&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://theintermediatecatchevent.substack.com/i/211447345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.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_!uMmu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!uMmu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!uMmu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!uMmu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23810289-0e9e-4cb1-bf22-b6755310a2e5_1500x800.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Camunda On STACKIT (AI, 2026)</em></figcaption></figure></div><p>Part 2 ended with a right sized platform that could rebuild itself. That also included its open endpoints, broad permissions, badly placed replicas and unverified pull requests.</p><p>Right at the beginning we found that STACKIT limited which services could be private, the network gate depended on settings in two systems, Helm charts brought somebody else&#8217;s defaults, and Kubernetes treated a placement rule that looked strict as optional.</p><div><hr></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;01b45a17-b0df-43e5-a9df-8608f4351556&quot;,&quot;caption&quot;:&quot;Part 1 explained how we sized separate environments for test and prod, integrated Azure Entra as our identity provider, and successfully deployed them with Terraform. Users could log in, model processes and complete instances. Nobody could rebuild or recover them, though, and that set the goal for the next phase: building a &#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Camunda On STACKIT, Part 2: Building A Real Platform&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:332866285,&quot;name&quot;:&quot;Stefan Schultz&quot;,&quot;bio&quot;:&quot;Technologist with 13+ years in agile software development, software architecture and process automation and orchestration.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a35ad2f9-f5cd-4b90-96e7-4c41eec68f99_1167x1164.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-08-27T08:00:51.061Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!isf2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-2-building&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:211162772,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4704919,&quot;publication_name&quot;:&quot;The Intermediate Catch Event&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!ejxI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe3e2488-65e3-4b2b-9f3d-923f2793349c_596x596.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><p>So we compiled a list of the most pressing issues and addressed them one after another. I tried not to get too technical in here, but it gets harder the deeper we dive into real platform engineering.</p><h2>How Private Can You Get?</h2><p>We wanted the data tier on private endpoints, with operators entering through one hardened jump host. A private endpoint gives a database no public address, so a stolen password is useless without a foothold inside the network. This is similar to the VPC and PrivateLink approach on AWS.</p><p>STACKIT&#8217;s catalogue ruled that out. PostgresFlex, OpenSearch and Secrets Manager use public endpoints protected by authentication and an ACL, an access control list of accepted source addresses. Object Storage has no address filter. Private SKE was behind a feature flag and its routing tables were in public preview. Basing the foundation on those features would add churn without making the managed data tier private. A jump host would add a single point of failure and another machine to patch.</p><p>We accepted public endpoints behind a short ACL. The team connects through a VPN with a fixed exit address, while CI uses <a href="https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-2-building?r=5i6h9p&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcomeOnShare=true">the runner&#8217;s floating IP from Part 2</a>; the cluster API and secret store admit both addresses, but the datastores admit cluster egress only, which keeps direct operator traffic out. I would choose private endpoints in a landing zone that offers them. STACKIT&#8217;s managed data tier did not, but that might change.</p><h2>A Gate Split Across Two Systems</h2><p>Prod has two active access policies: the Camunda UIs are VPN-only, while Zeebe gRPC also admits our fixed-address benchmark runner, which Part 5 introduces. Both enter through the same load balancer.</p><p>The external load balancer (STACKIT uses <a href="https://github.com/stackitcloud/yawol">yawol</a>, &#8220;Yet Another Working OpenStack Loadbalancer&#8221;) filters connections at L4, where it sees a source address and port. Its <em>loadBalancerSourceRanges</em> setting applies one list to the whole load balancer. To let the benchmark runner reach Zeebe, that list has to contain both the VPN and runner ranges. At L4, the runner then has a network path to every hostname behind the load balancer, including the UIs. OIDC would still protect the login, but the UIs would no longer be VPN-only.</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h42E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.png 424w, https://substackcdn.com/image/fetch/$s_!h42E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.png 848w, https://substackcdn.com/image/fetch/$s_!h42E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.png 1272w, https://substackcdn.com/image/fetch/$s_!h42E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!h42E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.png" width="426" height="205.3012048192771" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:440,&quot;width&quot;:913,&quot;resizeWidth&quot;:426,&quot;bytes&quot;:81255,&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://theintermediatecatchevent.substack.com/i/211447345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.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_!h42E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.png 424w, https://substackcdn.com/image/fetch/$s_!h42E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.png 848w, https://substackcdn.com/image/fetch/$s_!h42E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.png 1272w, https://substackcdn.com/image/fetch/$s_!h42E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb06c084-d0e9-47bd-b950-f8f1605a7810_913x440.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div><figcaption class="image-caption">The levels of the OSI model on which data is handled over networks.</figcaption></figure></div><p><span>The SKE internal Loadbalancer (we use </span><a href="https://nginx.org/">nginx</a><span>) sees the requested hostname at L7. Its default rule admits only the VPN, while the Zeebe ingress overrides that rule with the VPN and runner ranges. That keeps the UIs behind the VPN without blocking the benchmark runner from Zeebe.</span></p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w97i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072d652b-f286-4b09-a238-bb2a7af164d8_743x440.png 424w, https://substackcdn.com/image/fetch/$s_!w97i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072d652b-f286-4b09-a238-bb2a7af164d8_743x440.png 848w, https://substackcdn.com/image/fetch/$s_!w97i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072d652b-f286-4b09-a238-bb2a7af164d8_743x440.png 1272w, https://substackcdn.com/image/fetch/$s_!w97i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072d652b-f286-4b09-a238-bb2a7af164d8_743x440.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!w97i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072d652b-f286-4b09-a238-bb2a7af164d8_743x440.png" width="344" height="203.71467025572005" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/072d652b-f286-4b09-a238-bb2a7af164d8_743x440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:440,&quot;width&quot;:743,&quot;resizeWidth&quot;:344,&quot;bytes&quot;:90690,&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://theintermediatecatchevent.substack.com/i/211447345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072d652b-f286-4b09-a238-bb2a7af164d8_743x440.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_!w97i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072d652b-f286-4b09-a238-bb2a7af164d8_743x440.png 424w, https://substackcdn.com/image/fetch/$s_!w97i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072d652b-f286-4b09-a238-bb2a7af164d8_743x440.png 848w, https://substackcdn.com/image/fetch/$s_!w97i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072d652b-f286-4b09-a238-bb2a7af164d8_743x440.png 1272w, https://substackcdn.com/image/fetch/$s_!w97i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072d652b-f286-4b09-a238-bb2a7af164d8_743x440.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div><figcaption class="image-caption"><em><span>The current design: L4 admits the VPN and benchmark runner to the load balancer, while L7 keeps the UIs VPN-only and admits both ranges on Zeebe.</span></em></figcaption></figure></div><p>We initially thought the L4 field was ignored. Before publishing that claim about a named provider, we retested with a throwaway load balancer: the excluded range blocked ten out of ten probes, and the caller&#8217;s address restored access. The current service enforces the field, so we use it as an outer gate.</p><p>The L7 rules depend on nginx seeing the original client address. The external load balancer therefore prepends it with PROXY protocol, while the internal load balancer is configured to parse that information and trust it only from the load-balancer network. We verified the chain in the live ingress logs, where nginx recorded the VPN exit address instead of the load balancer&#8217;s internal address.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;f9d99199-9bc5-4dd4-9d03-47c9944b6dd4&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml"># Illustrative: one outer list, then a narrower default at L7
service:
  loadBalancerSourceRanges:
    - &lt;vpn-cidr&gt;
    - &lt;benchmark-runner-cidr&gt;
  annotations:
    yawol.stackit.cloud/tcpProxyProtocol: "true"  # LB: prepend the real client IP
config:
  use-proxy-protocol: "true"                      # nginx: parse and trust the header
  proxy-real-ip-cidr: &lt;proxy-cidr&gt;                # nginx: only from this hop
  whitelist-source-range: &lt;vpn-cidr&gt;              # default: UIs stay VPN-only
---
# Annotation on the Zeebe gRPC Ingress only
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: &gt;-
      &lt;vpn-cidr&gt;,&lt;benchmark-runner-cidr&gt;</code></pre></div><p>The coupling fails in opposite directions. Remove a PROXY-protocol setting while the allowlist stays narrow and every client gets blocked with a HTTP 403 Forbidden; lose the shared value file that carries the L7 allowlist and every UI becomes reachable from the internet while ArgoCD stays green, the pods stay healthy and login continues to work.</p><p>Policy tests cover both layers. They assert that the L4 list remains a superset of every active L7 rule, each hostname stays narrow, and all three PROXY-protocol settings are present. The VPN range lives in one file used by both environments, so it changes once.</p><p>For example, this shortened <em>Conftest</em> rule checks every per-host L7 allowlist against the L4 list on the rendered load-balancer Service:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;go&quot;,&quot;nodeId&quot;:&quot;fb783927-e6e6-447a-8cea-b3ef722ad790&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-go">deny contains msg if {
  service := lib.ingress_nginx_service
  l4_cidrs := {
    trim_space(cidr) |
    some cidr in service.spec.loadBalancerSourceRanges
  }

  some ingress in lib.docs
  ingress.kind == "Ingress"
  annotation := object.get(
    ingress.metadata.annotations,
    "nginx.ingress.kubernetes.io/whitelist-source-range",
    "",
  )
  some l7_cidr in {
    trim_space(cidr) |
    some cidr in split(annotation, ",")
  }
  l7_cidr != ""
  not l7_cidr in l4_cidrs

  msg := sprintf(
    "L7 admits %s on %s, but the L4 gate blocks it",
    [l7_cidr, ingress.metadata.name],
  )
}</code></pre></div><p>The VPN range gates almost every human path into the platform. If its exit address changes, the UIs, <em>kubectl</em>, operator access to Zeebe gRPC and SSH to the runner reject at once. Direct operator access cannot reopen the ACL. Recovery follows a separate path: ArgoCD pulls from Git, so a commit restores UI access, and CI runs the applies that reopen the provider ACLs.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-3-platform?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading The Intermediate Catch Event! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-3-platform?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-3-platform?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><h2>Connector Direction Decides Your Public Surface</h2><p>Adding a public <em>/inbound/*</em> route would&#8217;ve made the setup more complicated so we postponed inbound support for now. A source filter would not have been enough. HMAC verification happens inside the connector runtime, after the request has crossed the load balancer and ingress and reached the pod, so unauthenticated traffic already consumes platform capacity. If inbound access returns, we will use polling where the external API supports it, place a relay in front of the cluster, or add an edge that enforces limits before traffic reaches the pod.</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SYfN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.png 424w, https://substackcdn.com/image/fetch/$s_!SYfN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.png 848w, https://substackcdn.com/image/fetch/$s_!SYfN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.png 1272w, https://substackcdn.com/image/fetch/$s_!SYfN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!SYfN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.png" width="1456" height="271" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:271,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91815,&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://theintermediatecatchevent.substack.com/i/211447345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.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_!SYfN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.png 424w, https://substackcdn.com/image/fetch/$s_!SYfN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.png 848w, https://substackcdn.com/image/fetch/$s_!SYfN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.png 1272w, https://substackcdn.com/image/fetch/$s_!SYfN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cc2be9b-2fb2-4ff6-b158-408846aec0bf_1981x369.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div><figcaption class="image-caption">Request reaching the connector runtime, even if it&#8217;s not clear if the caller is authorized.</figcaption></figure></div><p>Outbound connectors remain in use. They leave through cluster NAT and call the HTTPS destination named in a process model, using credentials from the managed secret store. Because the Camunda namespace permits port 443 to 0.0.0.0/0, permission to deploy a model also carries permission to make the platform send payloads and connector credentials to an external host.</p><p>Restricting that egress is harder than writing SaaS names into a NetworkPolicy. SKE uses Calico OSS, which matches IP ranges and cannot express DNS names. A forward proxy can restrict hosts, but for HTTPS it sees the hostname in <em>CONNECT</em>, not the request path. Path filtering requires TLS interception, which puts every connector credential and payload through one decryption point and breaks certificate pinning. We recorded broad HTTPS egress as an open risk and deferred that design. A process team cannot choose either connector direction without changing the platform&#8217;s exposure.</p><h2>Check The Defaults Of Every Chart You Install</h2><p>Installing our own platform charts also meant owning their defaults. The monitoring stack and ingress controller arrived with cluster-wide read on secrets, and application images used floating tags rather than digests, which means a version&#8217;s content can change without you noticing. Those charts are packaged for many cluster shapes, so we had to review and narrow the defaults ourselves.</p><p>Grafana and Loki could read every Secret in the cluster, but they only need the monitoring namespace. We replaced their ClusterRoles with namespace-scoped Roles. We also limited the Prometheus Operator to monitoring and camunda.</p><p><em>ingress-nginx</em> is different. It handles TLS for apps in several namespaces, so it must read their certificate Secrets. We kept this permission and restricted its network access.</p><p>Also, our Terraform modules now reject unsafe or invalid input at plan time. A caller range that is empty or wide open fails validation. The variable naming an environment accepts only the environments that exist (<em>test</em> or <em>prod</em>).</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;0dff4715-03bd-4889-97ca-f8421d03bed1&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">variable "allowed_caller_cidrs" {
  type = list(string)

  validation {
    condition     = length(var.allowed_caller_cidrs) &gt; 0 &amp;&amp; !contains(var.allowed_caller_cidrs, "0.0.0.0/0")
    error_message = "Name the VPN and CI egress ranges. Empty or 0.0.0.0/0 is not a valid answer."
  }
}</code></pre></div><p><span>Every stateful resource carries </span><em><span>destroy protection</span></em><span> in Terraform: the databases, the search cluster, Object Storage, the secret store. No apply takes the data with it, whatever a refactor does to the resource addresses. The guard cannot take a variable and the same modules serve both environments, so tearing down test is a deliberate two-step. Destroy protection later blocked Terraform from replacing a managed service after it had been renamed outside our configuration; Part 6 covers that incident.</span></p><p><span>We test monitoring separately because it cannot report its own failure. A heartbeat fires constantly into the same alert channel as everything else, and silence is the failure signal. Moving the stack out of the cluster with STACKIT Observability would remove it from the cluster&#8217;s failure domain and reduce our maintenance work, at the price of a managed-service bill; we have not done it yet.</span></p><h2>Terraform State And Camunda Backups Must Survive</h2><p><span>Two kinds of Object Storage buckets hold what the platform </span><em><span>cannot</span></em><span> recreate. The </span><em><span>state</span></em><span> buckets store what Terraform knows about every environment, including cluster credentials. The </span><em><span>backup</span></em><span> buckets receive the nightly Camunda and OpenSearch backups, our recovery path when anything else is lost. The destroy protection from the last section guards this data against Terraform, but Terraform is not the only writer. CI uploads state and the clusters upload backups with their own S3 keys, and a leaked key talks straight to the storage API, with no plan and no review in between. The buckets have to hold against their own credentials.</span></p><p><span>Every bucket therefore got Object Lock and a default retention when it was created. Creation is the only moment STACKIT can set the lock, so either you build this control in from the start or you recreate the bucket later. Versioning comes with the lock and cannot be switched off. Locked versions stay restorable for their retention window, even against the credential that wrote them. State keeps seven days in </span><em><span>GOVERNANCE</span></em><span> mode, which an operator can still clear early: state rewrites on every apply, and undeletable versions would stall every migration. Prod backups keep thirty days in </span><em><span>COMPLIANCE</span></em><span>.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7gq0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7gq0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png 424w, https://substackcdn.com/image/fetch/$s_!7gq0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png 848w, https://substackcdn.com/image/fetch/$s_!7gq0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png 1272w, https://substackcdn.com/image/fetch/$s_!7gq0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!7gq0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png" width="1456" height="609" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:609,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:247176,&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://theintermediatecatchevent.substack.com/i/211447345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.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_!7gq0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png 424w, https://substackcdn.com/image/fetch/$s_!7gq0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png 848w, https://substackcdn.com/image/fetch/$s_!7gq0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png 1272w, https://substackcdn.com/image/fetch/$s_!7gq0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28512c6-1375-49d4-90d0-a02bf6955cb7_2108x882.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em><span>Access roles and policy modes for Object Storage buckets</span></em></figcaption></figure></div><p><span>The difference between the two modes is who can bypass them. </span><em><span>GOVERNANCE</span></em><span> allows a credential with one specific bypass permission to delete locked versions or shorten their retention early; our bucket policy denies the writer exactly that permission. </span><em><span>COMPLIANCE</span></em><span> has no bypass: nobody deletes a locked version until the window ends, the project owner included, and retention can only be extended. The mode is stamped onto each version at write time, so changing a bucket&#8217;s default only affects future writes.</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;4d14622b-41cb-4169-81f9-da59c27f07b1&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">resource "stackit_objectstorage_compliance_lock" "project" {
  project_id = var.project_id
}

resource "stackit_objectstorage_bucket" "backups" {
  project_id  = var.project_id
  name        = "prod-backups"
  object_lock = true
  lifecycle { prevent_destroy = true }
}

resource "stackit_objectstorage_default_retention" "backups" {
  project_id  = var.project_id
  bucket_name = stackit_objectstorage_bucket.backups.name
  mode        = "COMPLIANCE"
  days        = 30
}</code></pre></div><p><span>An Object Lock alone would not survive long, because the settings that protect a bucket are changed over the same S3 API that writes objects. Any credential the bucket policy admits could downgrade the retention or rewrite the policy itself. So each bucket splits its permissions into three credential groups. </span></p><ol><li><p><span>The </span><em><span>writer</span></em><span>, the only key CI and the workloads hold, can read and write objects, and the policy denies it everything destructive: deleting versions, changing the policy, the lock, the lifecycle or the encryption. </span></p></li><li><p><span>A </span><em><span>monitor</span></em><span> credential that reads the five configuration values our checks compare and cannot even list the objects. </span>It&#8217;s for verification only.</p></li><li><p><em>Admin</em> rights belong to nobody permanently; when a bucket needs administrative work, we mint a key into the admin group, use it and delete it again, so there is no standing credential to steal. </p></li></ol><p><span>Bucket policies, lifecycle rules and default encryption have no provider resource, so an idempotent script applies those three (manually). A weekly GitHub Actions job compares every bucket against a checked-in declaration: versioning, lock mode and days, policy, lifecycle, SSE-S3 encryption.</span></p><h2>Replicas Need A Hard Placement Rule</h2><p>The pod placement test produced the same kind of surprise. Prod runs three nodes, one per availability zone, and our two-replica components had weight-100 <em>preferred</em> pod anti-affinity to keep each pair apart. Connectors, Console and the Web Modeler REST API still landed both replicas on one node.</p><p>It happened during a reschedule when two nodes became <em>Ready</em> one second apart. The first node ended up carrying 78% of the cluster&#8217;s CPU requests, along with both replicas of the three affected deployments; losing it would remove authentication, every UI, Connectors, Web Modeler, GitOps control and secret sync in one go.</p><p>Kubernetes was doing what we had asked. <em>preferred</em> contributes a score alongside image locality and resource fit, and it never removes a node from consideration. Other scores won during the scheduling burst.</p><p>The ingress controller behaved differently because its rule filters nodes. It held a replica <em>Pending</em> until a second node was ready. Zeebe&#8217;s required hostname and zone anti-affinity kept one broker <em>Pending</em> for twenty minutes until an unused zone had a ready node.</p><p>A disruption budget (PDB) caps how many pods of a workload may go down at once during a planned action. It cannot protect a co-located pair from losing its node because Kubernetes is not evicting either pod. Nothing reports the mismatch.</p><p>Policy tests now reject every multi-replica prod workload without hard hostname anti-affinity. For a Helm-managed component, the relevant part of the values file looks like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;7c4a10a4-7864-43b7-b301-2d57e89b95f0&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">connectors:
  replicas: 2
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
              - key: app.kubernetes.io/component
                operator: In
                values: [connectors]
          topologyKey: kubernetes.io/hostname</code></pre></div><p>The Camunda chart exposes <em>topologySpreadConstraints</em> only for brokers. Other components silently ignore the key, so required anti-affinity is the common lever.</p><p>After the GitOps change, the loaded node dropped from 78% to ~50% of CPU requests. No pair protected by a disruption budget shared a node. CPU requests still differed across the three nodes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QBiZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QBiZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png 424w, https://substackcdn.com/image/fetch/$s_!QBiZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png 848w, https://substackcdn.com/image/fetch/$s_!QBiZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png 1272w, https://substackcdn.com/image/fetch/$s_!QBiZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!QBiZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png" width="1456" height="418" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:418,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165719,&quot;alt&quot;:&quot;Three SKE nodes across zones before and after the placement change, with pods concentrated on one node before and distributed across all three after&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211447345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Three SKE nodes across zones before and after the placement change, with pods concentrated on one node before and distributed across all three after" title="Three SKE nodes across zones before and after the placement change, with pods concentrated on one node before and distributed across all three after" srcset="https://substackcdn.com/image/fetch/$s_!QBiZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png 424w, https://substackcdn.com/image/fetch/$s_!QBiZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png 848w, https://substackcdn.com/image/fetch/$s_!QBiZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png 1272w, https://substackcdn.com/image/fetch/$s_!QBiZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22ef976-1116-499d-a196-1131ae0cb8a7_1708x490.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The cluster before and after the placement fix</em></figcaption></figure></div><p>A fourth node would not have changed the scheduling race. Kubernetes placed most pods on the first node that became ready, while the node that arrived twenty minutes later received only pods with volumes pinned to its zone; one node pool across three zones has no symmetric fourth member anyway, because four means a 2/1/1 split. Placement needed enforcement. Capacity was a separate question.</p><p>Terraform-owned Helm releases need their placement values in Terraform. ArgoCD combines hard per-component anti-affinity with a soft spread across the release:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;94bc7c39-e831-427f-92ab-f15a1ca02e78&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">locals {
  argocd_ha_values = {
    global = {
      affinity = { podAntiAffinity = "hard" }
      topologySpreadConstraints = [{
        maxSkew           = 1
        topologyKey       = "kubernetes.io/hostname"
        whenUnsatisfiable = "ScheduleAnyway"
        labelSelector = {
          matchLabels = { "app.kubernetes.io/part-of" = "argocd" }
        }
      }]
    }
  }
}</code></pre></div><p><em>hard</em> separates matching replicas. With <em>ScheduleAnyway</em>, Kubernetes tries to spread the whole release while still permitting every ArgoCD pod to run during a one-node window.</p><p>Enforced placement costs something: a replica can wait <em>Pending</em> while only one node is up, and a rolling update now needs a third schedulable node or it stalls with the old pods serving. Test keeps none of this: one node, one zone and one replica of each. Singletons use preferred mutual scatter instead. This covers Camunda&#8217;s Identity, Optimize and Web Modeler WebSockets, GitOps-owned cert-manager and Terraform-owned External Secrets. A hard rule would add no availability and could strand a pod.</p><p>The scheduler evaluates these constraints when it places a pod. It does not move existing pods later. A descheduler could address the remaining concentration, but it would evict running pods, so we deferred it.</p><h2>The Checks A Change Has To Survive</h2><p>The allowlist and the placement rule had both looked correct in configuration. We changed the pull-request pipeline to test what the rendered configuration would do. Part 2 explains how a change ships; these are the checks it passes first.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xnI9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xnI9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png 424w, https://substackcdn.com/image/fetch/$s_!xnI9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png 848w, https://substackcdn.com/image/fetch/$s_!xnI9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png 1272w, https://substackcdn.com/image/fetch/$s_!xnI9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!xnI9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png" width="1456" height="587" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:587,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:190189,&quot;alt&quot;:&quot;Eight jobs that run for every PR: terraform format, validate, test, TFLint, tfsec, Checkov and Gitleaks&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211447345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Eight jobs that run for every PR: terraform format, validate, test, TFLint, tfsec, Checkov and Gitleaks" title="Eight jobs that run for every PR: terraform format, validate, test, TFLint, tfsec, Checkov and Gitleaks" srcset="https://substackcdn.com/image/fetch/$s_!xnI9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png 424w, https://substackcdn.com/image/fetch/$s_!xnI9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png 848w, https://substackcdn.com/image/fetch/$s_!xnI9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png 1272w, https://substackcdn.com/image/fetch/$s_!xnI9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cf3bf22-3ac1-4c13-97b3-c6926d9b5e33_1944x784.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em><span>The checks for each infrastructure change</span></em></figcaption></figure></div><p>Eight jobs run in parallel for every infrastructure pull request:</p><ul><li><p><a href="https://developer.hashicorp.com/terraform/cli/commands/fmt">terraform fmt</a> checks canonical formatting across every Terraform file.</p></li><li><p><a href="https://developer.hashicorp.com/terraform/cli/commands/validate">terraform validate</a> checks syntax and provider schemas without state access.</p></li><li><p><a href="https://github.com/terraform-linters/tflint">TFLint</a> flags Terraform-specific errors and recommended-rule violations.</p></li><li><p><a href="https://github.com/aquasecurity/tfsec">tfsec</a> scans Terraform for security misconfigurations.</p></li><li><p><a href="https://www.checkov.io/">Checkov</a> applies policy-as-code checks to Terraform.</p></li><li><p><a href="https://developer.hashicorp.com/terraform/cli/commands/test">terraform test </a>runs module input-validation tests with mocked providers.</p></li><li><p><a href="https://github.com/terraform-docs/terraform-docs">terraform-docs</a> generates README files for each module.</p></li><li><p><a href="https://github.com/gitleaks/gitleaks">Gitleaks</a> scans the repository on every pull request.</p></li></ul><p>The GitOps repo:</p><ul><li><p>Renders Helm charts with <a href="https://helm.sh/docs/helm/helm_template/">helm template</a></p></li><li><p>Builds the overlays with <a href="https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/">kubectl kustomize</a></p></li><li><p>Checks the combined test and production output with <a href="https://www.conftest.dev/">Conftest</a> policies written in Rego.</p></li><li><p><a href="https://github.com/gitleaks/gitleaks">Gitleaks</a> scans the repository on every pull request.</p></li></ul><p>For example, this Conftest rule fails when either default-deny policy is missing from a guarded namespace:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;3436a696-91c8-466f-9cef-5babf5e2f02d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">default_deny_namespaces := {
  "camunda", "argocd", "external-secrets-system", "secrets-manager", "ingress-nginx", "cert-manager"
}

deny contains msg if {
&#9;some ns in default_deny_namespaces
&#9;some np in {"default-deny-ingress", "default-deny-egress"}
&#9;not lib.has_ns("NetworkPolicy", ns, np)
&#9;msg := sprintf("[%s][network-policies] %s NetworkPolicy %q missing", [lib.release, ns, np])
}</code></pre></div><p>Neither <em>tfsec</em> nor <em>Checkov</em> has native STACKIT rules. The S3-compatible backend triggers AWS-shaped checks that do not apply or cannot be configured through the provider. We document the suppressions. STACKIT constraints belong in Terraform tests or custom policies. Versioning runs separately on the data plane.</p><p>None of these jobs receives cloud credentials. A scanner that runs on every pull request has no reason to sit inside the apply identity&#8217;s blast radius.</p><p>Runtime secrets live in the managed secret store, CI credentials stay in the pipeline&#8217;s store, and Git holds non-secret configuration. Gitleaks checks both repositories without a path filter because a credential can land anywhere; local rules cover signed webhook URLs that the defaults miss.</p><h2>What&#8217;s Next</h2><p>This part showed how we applied hardening over the whole platform. Restricting access to all of our components, adding pipelines that verify every change, deliberate pod placement to even the load, and chart defaults that make sense for us. </p><p>Part 4 explains how we use AI as support to build this platform, where its strengths are, and especially its weaknesses.</p>]]></content:encoded></item><item><title><![CDATA[Camunda On STACKIT, Part 2: Building A Real Platform]]></title><description><![CDATA[Making A First Deployment Reproducible With Terraform And GitOps]]></description><link>https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-2-building</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-2-building</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 27 Aug 2026 08:00:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!isf2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.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_!isf2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!isf2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!isf2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!isf2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!isf2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!isf2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png" width="1456" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1469793,&quot;alt&quot;:&quot;Camunda on STACKIT over a stylized European data-center network&quot;,&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://theintermediatecatchevent.substack.com/i/211162772?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Camunda on STACKIT over a stylized European data-center network" title="Camunda on STACKIT over a stylized European data-center network" srcset="https://substackcdn.com/image/fetch/$s_!isf2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!isf2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!isf2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!isf2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c5c115-c1ef-490b-a11f-19187a6c85c4_1500x800.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Camunda On STACKIT (AI, 2026)</em></figcaption></figure></div><p>Part 1 explained how we sized separate environments for <em>test</em> and <em>prod</em>, integrated Azure Entra as our identity provider, and successfully deployed them with Terraform. Users could log in, model processes and complete instances. Nobody could rebuild or recover them, though, and that set the goal for the next phase: building a real platform.</p><p>What that actually means is that Camunda config changes shouldn&#8217;t touch infrastructure, Terraform shouldn&#8217;t be executed from my local machine, backup mechanisms need to be in place and verified, and disks shouldn&#8217;t fill up without anyone noticing. I&#8217;ve already built similar groundwork on an AWS platform project for a logistics company, which was a great plus.</p><div><hr></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;d5482923-0bbd-47a6-9691-e1d6e8b8c52f&quot;,&quot;caption&quot;:&quot;In the opening article I explained the reasons why I put Camunda on a European cloud. We still had to figure out what running it on STACKIT means.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Camunda On STACKIT, Part 1: The First Deploy&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:332866285,&quot;name&quot;:&quot;Stefan Schultz&quot;,&quot;bio&quot;:&quot;Technologist with 13+ years in agile software development, software architecture and process automation and orchestration.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a35ad2f9-f5cd-4b90-96e7-4c41eec68f99_1167x1164.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-08-20T08:01:11.946Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!nyGf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://theintermediatecatchevent.substack.com/p/camunda-on-stackit-part-1-the-first&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:211160866,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4704919,&quot;publication_name&quot;:&quot;The Intermediate Catch Event&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!ejxI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe3e2488-65e3-4b2b-9f3d-923f2793349c_596x596.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>Terraform For Infrastructure, GitOps For Apps</h2><p>We decided to split the code. A database resize should not share a release rhythm with a Camunda values change, so Terraform owns the STACKIT projects, SKE, PostgreSQL, OpenSearch, Object Storage and the secret store; ArgoCD owns ingress, certificates, monitoring and Camunda from the GitOps repository. Terraform pushes. ArgoCD pulls.</p><p>Infrastructure changes less frequent and behind a heavy review gate; application config changes all the time. Terraform&#8217;s identity never edits a running workload like Camunda, and ArgoCD&#8217;s Git token never touches Terraform state. Terraform hands ArgoCD one repository credential and a root Application, then leaves the application layer to reconcile itself.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w1zB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w1zB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png 424w, https://substackcdn.com/image/fetch/$s_!w1zB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png 848w, https://substackcdn.com/image/fetch/$s_!w1zB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png 1272w, https://substackcdn.com/image/fetch/$s_!w1zB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!w1zB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png" width="1456" height="534" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:534,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146990,&quot;alt&quot;:&quot;Diagram showing the infrastructure repository deploying SKE while ArgoCD reads the GitOps repository and deploys Camunda&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211162772?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Diagram showing the infrastructure repository deploying SKE while ArgoCD reads the GitOps repository and deploys Camunda" title="Diagram showing the infrastructure repository deploying SKE while ArgoCD reads the GitOps repository and deploys Camunda" srcset="https://substackcdn.com/image/fetch/$s_!w1zB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png 424w, https://substackcdn.com/image/fetch/$s_!w1zB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png 848w, https://substackcdn.com/image/fetch/$s_!w1zB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png 1272w, https://substackcdn.com/image/fetch/$s_!w1zB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fef96b-86db-4d9f-8dbf-47e2834c3cb0_2158x792.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The two-repo split: Terraform builds the foundation, ArgoCD reconciles everything on top.</em></figcaption></figure></div><p>Each environment runs its own ArgoCD syncing an app-of-apps: one root Application that owns the child Applications for ingress, cert-manager, monitoring, Camunda, and the rest, ordered by sync waves so the secret operator is up before anything that needs a secret.</p><p>The two environments deliberately track different things. Test follows the main branch, so a merge lands there and you find out quickly whether it works. Prod follows a promotion tag. Pointing both clusters at one branch would be a tempting simplification, but it means every merge would be a prod deploy.</p><p>During a necessary manual operation, we learned how literal ArgoCD ownership is. I scaled a StatefulSet to zero, and it returned within seconds. I disabled self-heal on the child Application and tried again, but the parent restored the child&#8217;s sync policy from Git. For a manual operation, we now pause reconciliation along the entire ownership chain, including the parent.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;e50460df-3b2b-44ca-b3f3-17103ee336c1&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml"># Illustrative app-of-apps child: ordered by sync wave, self-healed
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: cert-manager
  annotations:
    argocd.argoproj.io/sync-wave: "1"   # the secret operator is wave 0
spec:
  syncPolicy:
    automated:
      selfHeal: true</code></pre></div><p>A second ArgoCD problem was easier to overlook. Kubernetes filled fields inside the StatefulSet volume claim templates that Git did not contain, so the Application stayed <em>out of sync</em> in ArgoCD while self-heal kept trying to resolve the same difference. We added a narrow <em>ignoreDifferences</em> rule to the ArgoCD Application:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;043d0dc4-f901-4ffd-9528-fa28f9981a5c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">spec:
  ignoreDifferences:
    - group: apps
      kind: StatefulSet
      jqPathExpressions:
        - .spec.volumeClaimTemplates[]?.status
        - .spec.volumeClaimTemplates[]?.spec.volumeMode
        - .spec.volumeClaimTemplates[]?.metadata.annotations</code></pre></div><p><span>We ignored only the fields Kubernetes generated. Ignoring the complete </span><em>volumeClaimTemplates</em><span> list would also hide changes we want ArgoCD to report, including a new PVC size. We used the same approach for strategy fields defaulted by External Secrets.</span></p><h2>One Apply, Two Clouds, No Stored Keys</h2><p>One deploy identity across infra, test and prod would have undermined the repository split. STACKIT has no <em>AssumeRole</em>-style impersonation like e.g. in AWS. We started with local Terraform applies, where STACKIT authenticated through service-account key files.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-2-building?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading The Intermediate Catch Event! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-2-building?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-2-building?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p>When we moved the applies into GitHub Actions, carrying that approach forward would have meant copying a STACKIT key into the infra, test and prod GitHub environments. We chose federated identities for CI instead. Each STACKIT service account and Entra CI application now trusts only its matching GitHub environment and reaches only its assigned resources.</p><p>This split does not mean one apply stays inside one cloud. The shared-services stack creates STACKIT infrastructure and Entra app registrations, while the environment stacks provision STACKIT and manage Camunda&#8217;s Entra credentials. Both providers authenticate during the same run.</p><p>The job may request OIDC tokens. Each provider requests a separate GitHub token because the audiences differ: Azure expects <em>api://AzureADTokenExchange</em>, while STACKIT expects <em>sts.accounts.stackit.cloud</em>. Entra and STACKIT verify the issuer and a subject containing the repository and GitHub environment, then issue short-lived access tokens.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mwYi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mwYi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png 424w, https://substackcdn.com/image/fetch/$s_!mwYi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png 848w, https://substackcdn.com/image/fetch/$s_!mwYi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png 1272w, https://substackcdn.com/image/fetch/$s_!mwYi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!mwYi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png" width="1456" height="771" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:771,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:339642,&quot;alt&quot;:&quot;GitHub Actions runner exchanging separate Azure and STACKIT OIDC tokens for Terraform&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211162772?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="GitHub Actions runner exchanging separate Azure and STACKIT OIDC tokens for Terraform" title="GitHub Actions runner exchanging separate Azure and STACKIT OIDC tokens for Terraform" srcset="https://substackcdn.com/image/fetch/$s_!mwYi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png 424w, https://substackcdn.com/image/fetch/$s_!mwYi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png 848w, https://substackcdn.com/image/fetch/$s_!mwYi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png 1272w, https://substackcdn.com/image/fetch/$s_!mwYi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7706e92b-68de-428e-977e-6ca1444e6c29_2502x1325.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The pipeline exchanges separate GitHub OIDC tokens for short-lived access to Azure and STACKIT.</em></figcaption></figure></div><p>We considered using Azure Entra as the single broker to remove one trust chain. Entra cannot mint a token with the arbitrary audience STACKIT requires, and obtaining a suitable Entra application token another way puts a stored Azure credential back into the job. That buys an extra exchange and merely moves the long-lived secret. Two direct trust chains keep provider login keyless, and their subject checks mean a test job cannot satisfy the prod trust even when someone triggers it manually.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TNxt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TNxt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png 424w, https://substackcdn.com/image/fetch/$s_!TNxt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png 848w, https://substackcdn.com/image/fetch/$s_!TNxt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png 1272w, https://substackcdn.com/image/fetch/$s_!TNxt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!TNxt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png" width="1456" height="414" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:414,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:140091,&quot;alt&quot;:&quot;STACKIT console showing GitHub issuer, STACKIT audience and prod repository subject assertions for the redacted service account&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211162772?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="STACKIT console showing GitHub issuer, STACKIT audience and prod repository subject assertions for the redacted service account" title="STACKIT console showing GitHub issuer, STACKIT audience and prod repository subject assertions for the redacted service account" srcset="https://substackcdn.com/image/fetch/$s_!TNxt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png 424w, https://substackcdn.com/image/fetch/$s_!TNxt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png 848w, https://substackcdn.com/image/fetch/$s_!TNxt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png 1272w, https://substackcdn.com/image/fetch/$s_!TNxt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc886ad-864f-461c-84be-956f8ea59522_2838x806.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The prod account accepts only GitHub tokens with STACKIT&#8217;s audience and the repository&#8217;s prod-environment subject.</em></figcaption></figure></div><p>We use access control lists (ACLs) to give access to STACKIT resources. I&#8217;ll get into the details in Part 3. Those ACLs added a requirement: a fixed source address. Hosted GitHub runners use changing address ranges, so Terraform now runs on a small self-hosted VM in the shared project. A floating public IP survives VM replacement and the allowlist contains the runner address for automation.</p><p>That runner is privileged. <em>terraform plan</em> executes provider code from the branch, so an untrusted pull request could run code from an allowlisted host with live OIDC access. Pull requests receive static analysis on GitHub-hosted runners. Plans and applies use the self-hosted runner only from trusted refs, and applies follow a merge to main.</p><p>State lives in a third, shared project. Its buckets sit outside the stacks CI applies, have versioning enabled and are checked for access-policy drift. If a pipeline can alter prod state, it can steer the next prod apply. State therefore needs its own boundary.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oAmv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oAmv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png 424w, https://substackcdn.com/image/fetch/$s_!oAmv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png 848w, https://substackcdn.com/image/fetch/$s_!oAmv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png 1272w, https://substackcdn.com/image/fetch/$s_!oAmv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!oAmv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png" width="728" height="517" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1034,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:1799376,&quot;alt&quot;:&quot;Architecture diagram showing Azure identity, shared STACKIT infrastructure, test and production projects, Kubernetes, managed data services, storage, DNS and ArgoCD&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211162772?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Architecture diagram showing Azure identity, shared STACKIT infrastructure, test and production projects, Kubernetes, managed data services, storage, DNS and ArgoCD" title="Architecture diagram showing Azure identity, shared STACKIT infrastructure, test and production projects, Kubernetes, managed data services, storage, DNS and ArgoCD" srcset="https://substackcdn.com/image/fetch/$s_!oAmv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png 424w, https://substackcdn.com/image/fetch/$s_!oAmv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png 848w, https://substackcdn.com/image/fetch/$s_!oAmv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png 1272w, https://substackcdn.com/image/fetch/$s_!oAmv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff647496b-3e1e-4c2f-b445-bcbd12406ee8_3810x2707.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Our final platform architecture and its rollout boundaries.</em></figcaption></figure></div><p><em>Blue</em> bootstrap creates <em>yellow</em> runner, identity and state resources. That runner provisions <em>green</em> infrastructure, where ArgoCD reconciles <em>red</em> applications, volume claims and policies. <em>Purple</em> marks differences between test and prod.</p><h2>You Build It, You Run It</h2><p>A platform isn&#8217;t done after it&#8217;s deployed. Someone has to operate it and make sure it runs. A platform team e.g. needs insights into the health of the cluster, and ways to analyze and act on errors.</p><p>For that we added <em>monitoring</em> to prod with the <em><a href="https://artifacthub.io/packages/helm/prometheus-community/kube-prometheus-stack">kube-prometheus-stack</a></em>. It contains Kubernetes manifests, default Grafana dashboards, and Prometheus rules combined with documentation and scripts to provide easy to operate end-to-end Kubernetes cluster monitoring with Prometheus using the Prometheus Operator. We also added some dashboards from Camunda, showing live metrics for Zeebe &amp; Co. </p><p>We&#8217;re aware that operating our monitoring stack inside the same cluster it monitors is a risk. This is a low priority open issue right now while building the platform blueprint. We might switch to managed STACKIT Observability later on.</p><p>Camunda&#8217;s secondary storage, the searchable copy behind Operate, Tasklist, and Optimize, runs on managed OpenSearch in prod and on the relational database in test. STACKIT&#8217;s managed OpenSearch tops out at version 2.x, and the application credential lacks index-lifecycle permissions. Native <em>retention</em> is therefore off, with a <em>cronjob</em> pruning old indices instead. This prevents the disk from filling up in the middle of the night and paging people out of bed. We opened a service request with STACKIT to address this issue in the future.</p><p><em>Backups</em> made the difference between rebuilding software and recovering a platform. A nightly job writes Camunda&#8217;s state to object storage, and the return path lives in a runbook. The same happens for OpenSearch, where we write regular backups to a snapshot repository in the object storage. Both the state and backup buckets are created with Object Lock, versioning and default encryption, and a weekly job verifies those settings; Part 3 covers that as well.</p><h2>Why &#8220;As Code&#8221; Is Harder Than It Looks</h2><p>Almost everything was now &#8220;as code.&#8221; A few manual boundaries remained.</p><p>ArgoCD can reconcile the platform only after ArgoCD exists. It needs a cluster, and Terraform needs an identity before it can create one. One hand-executed step remains at the bottom of the stack: an operator uses a short-lived key for the initial <em>apply</em>, revokes it and lets the keyless path take over.</p><p>We revoked the bootstrap key and initially left its identity holding owner rights on all three projects. The identity now has no active credential between uses. Removing a credential does not remove the permissions attached to its identity.</p><p>Some values don&#8217;t exist when the code is written. Terraform first has to create the managed database, password and search cluster before it can write their coordinates into the secret store; External Secrets then syncs them into Kubernetes for the application. That secret-store entry is the handoff between infrastructure and applications.</p><p>Timing crosses the repository boundary as well. Adding a database starts in Terraform, continues in the secret store and finishes when GitOps adds the sync and application configuration.</p><p>Review is the last boundary. Git reproduces a bad configuration as reliably as a good one, and ArgoCD keeps either version synchronized, so our policies inspect the rendered result and assert the details whose absence leaves everything green: the access gate, sync policies and chart versions.</p><h2>What&#8217;s Next</h2><p>Our first platform iteration is now rolled out and rebuilt by pipelines. Infrastructure and apps are structurally separated and short-lived tokens are minted for each run. The endpoints were open and the network was flat. Part 3 deals with that.</p>]]></content:encoded></item><item><title><![CDATA[Camunda On STACKIT, Part 1: The First Deploy]]></title><description><![CDATA[From A Proof Of Concept To Right-Sized Environments Without A Blueprint]]></description><link>https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-1-the-first</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/camunda-on-stackit-part-1-the-first</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 20 Aug 2026 08:01:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nyGf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.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_!nyGf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nyGf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!nyGf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!nyGf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!nyGf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nyGf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png" width="1456" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1469793,&quot;alt&quot;:&quot;Camunda on STACKIT over a stylized European data-center network&quot;,&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://theintermediatecatchevent.substack.com/i/211160866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Camunda on STACKIT over a stylized European data-center network" title="Camunda on STACKIT over a stylized European data-center network" srcset="https://substackcdn.com/image/fetch/$s_!nyGf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!nyGf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!nyGf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!nyGf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d2fe2df-1a28-4f0d-aac3-2a26eb21d2f7_1500x800.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Camunda On STACKIT (AI, 2026)</em></figcaption></figure></div><p>In the opening article I explained the reasons why I put Camunda on a European cloud. We still had to figure out what running it on STACKIT means.</p><p>Luc Weinbrecht and Sebastian Roseneck of envite had already given us a good starting point at CamundaCon 2026 in Amsterdam. Their deployment brought up Camunda 8.8 in a STACKIT environment and proved that the pieces fit together.</p><p>We used their component map as base and moved on to the decisions a platform team would need to make: an existing identity provider, separate environments, and how to operate it.</p><div><hr></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;c654f737-3ae0-4d4e-92ac-875dee458304&quot;,&quot;caption&quot;:&quot;I don&#8217;t follow American politics regularly, the few important things are reported in German news, and my Instagram or LinkedIn algorithm does the rest. The topic of cloud sovereignty prevails in the IT world for several years now and one thing caught my attention, even if it might not sound significant on the first read.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Owning Your Process Automation: The Case For A Sovereign Cloud In Europe&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:332866285,&quot;name&quot;:&quot;Stefan Schultz&quot;,&quot;bio&quot;:&quot;Technologist with 13+ years in agile software development, software architecture and process automation and orchestration.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a35ad2f9-f5cd-4b90-96e7-4c41eec68f99_1167x1164.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-08-18T08:01:23.190Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!F46l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://theintermediatecatchevent.substack.com/p/owning-your-process-automation-the-49a&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:211404773,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4704919,&quot;publication_name&quot;:&quot;The Intermediate Catch Event&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!ejxI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe3e2488-65e3-4b2b-9f3d-923f2793349c_596x596.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>Where The POC Left Off</h2><p>STACKIT is not one of Camunda's supported cloud providers, so there was no reference architecture where changing some variables produced a deployment. Sebastian and Luc used Camunda's AWS single-region architecture, preserved its shape and implemented each component with STACKIT modules.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4lCx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4lCx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png 424w, https://substackcdn.com/image/fetch/$s_!4lCx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png 848w, https://substackcdn.com/image/fetch/$s_!4lCx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png 1272w, https://substackcdn.com/image/fetch/$s_!4lCx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!4lCx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png" width="1445" height="759" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cfc78363-9869-477d-bb43-3519408567d7_1445x759.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:759,&quot;width&quot;:1445,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:119181,&quot;alt&quot;:&quot;Platform components mapped from AWS reference services to their STACKIT equivalents&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211160866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Platform components mapped from AWS reference services to their STACKIT equivalents" title="Platform components mapped from AWS reference services to their STACKIT equivalents" srcset="https://substackcdn.com/image/fetch/$s_!4lCx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png 424w, https://substackcdn.com/image/fetch/$s_!4lCx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png 848w, https://substackcdn.com/image/fetch/$s_!4lCx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png 1272w, https://substackcdn.com/image/fetch/$s_!4lCx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc78363-9869-477d-bb43-3519408567d7_1445x759.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Some mappings were direct. Object Storage is based on S3, PostgresFlex is Postgres, and a Gardener extension handles DNS. SKE hands you a bare cluster, which meant ingress, secret sync and TLS certificate automation were missing out of the box.</p><h2>Identity Without Keycloak</h2><p>Consid&#8217;s Microsoft Entra tenant was already our authority for users and groups, and because Camunda 8.9 lets each component connect via OIDC (<a href="https://en.wikipedia.org/wiki/OpenID#OpenID_Connect_(OIDC)">OpenID Connect</a>) to Entra, we could remove the Keycloak broker and database that the POC used. This already spared us some moving parts in the middle to operate.</p><p>Camunda&#8217;s OIDC setup also supports providers like Okta or Auth0. An existing Keycloak remains a good option when it already brokers SAML or Active Directory, or when other applications depend on its claim and group mappings.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;a49fa2d5-d2c2-45fa-99c8-e28627c7d53b&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml"># Camunda global identity: straight to Entra
global:
  identity:
    auth:
      type: MICROSOFT
      issuerBackendUrl: https://login.microsoftonline.com/&lt;tenant-id&gt;/v2.0
      # each web component gets its own Entra app registration</code></pre></div><p>Direct OIDC still needs careful wiring. Each web component needs its own app registration and one helm value pointing to the wring registration sent Web Modeler into a login loop. After fixing that, Camunda Admin denied everybody because our rule compared the group claim for equality even though Entra sends a list. The match had to use <em>contains</em>.</p><p>We tested the whole path after that, starting with membership in an Entra group and ending at the authorization Camunda receives. Only members of the mapped group could enter.</p><h2>Two Environments Sized For The Job</h2><p>Once login worked, we could have cloned the environment and renamed it prod. Instead, we wrote down the job of each one. Test supports developers and validates processes at a lower cost. Prod carries the full product surface and must survive a zone failure, so copying the infrastructure back 1:1 would pay for availability that test doesn&#8217;t need.</p><p>On STACKIT, each environment is a project. The project is the main boundary for resource ownership, quotas and access control. For the first local applies, I created a project-scoped service account per environment and authenticated Terraform with a service-account key on my laptop.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PLrg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PLrg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png 424w, https://substackcdn.com/image/fetch/$s_!PLrg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png 848w, https://substackcdn.com/image/fetch/$s_!PLrg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png 1272w, https://substackcdn.com/image/fetch/$s_!PLrg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!PLrg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png" width="728" height="269.92194275802257" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:855,&quot;width&quot;:2306,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:171231,&quot;alt&quot;:&quot;Diagram of a STACKIT service account minting an sa_key.json file used from a laptop to run Terraform against SKE&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211160866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F305c4c3e-d2cf-42fb-8ae3-e0f3ffc31a23_2306x855.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="Diagram of a STACKIT service account minting an sa_key.json file used from a laptop to run Terraform against SKE" title="Diagram of a STACKIT service account minting an sa_key.json file used from a laptop to run Terraform against SKE" srcset="https://substackcdn.com/image/fetch/$s_!PLrg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png 424w, https://substackcdn.com/image/fetch/$s_!PLrg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png 848w, https://substackcdn.com/image/fetch/$s_!PLrg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png 1272w, https://substackcdn.com/image/fetch/$s_!PLrg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc564ba-7e90-44ed-9f4c-8cbbeca4d2e0_2306x855.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>STACKIT Access Management</em></figcaption></figure></div><p>STACKIT has no AWS <em>AssumeRole</em>-style impersonation. When we later moved the applies to GitHub Actions, Identity Federation let each job exchange its GitHub OIDC token for a short-lived STACKIT access token. Part 2 explains that transition.</p><h3>Camunda&#8217;s Architecture</h3><p>Camunda distributes process instances across so called partitions. Each instance stays on one partition for its entire lifetime. Every partition has one leader that processes commands and followers that copy its event log. Similar to Kafka. With a replication factor of three, the partition exists on three brokers: one leader and two followers. If the leader fails, a follower can take over. If the partition loses its majority of brokers, processing stops until quorum is restored. When setting up Camunda, one has to decide how many brokers, partitions and replication the platform needs. They affect parallelism and fail safety. </p><p>Cloud providers normally offer <em>availability zones</em> (AZs) in each region. Each AZ represents a physical different server, rack or even data center. In a Kubernetes cluster we can place nodes of the same cluster in different AZs. This prevents a full outage in a cluster if one AZ goes down. We also make use of the AZs to ensure high availability.</p><h3>Our Final Environments</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ao6Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ao6Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png 424w, https://substackcdn.com/image/fetch/$s_!Ao6Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png 848w, https://substackcdn.com/image/fetch/$s_!Ao6Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png 1272w, https://substackcdn.com/image/fetch/$s_!Ao6Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ao6Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png" width="1456" height="592" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:592,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:269843,&quot;alt&quot;:&quot;Comparison of the single-node test environment using PostgreSQL with the three-node production environment using PostgreSQL and OpenSearch&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211160866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Comparison of the single-node test environment using PostgreSQL with the three-node production environment using PostgreSQL and OpenSearch" title="Comparison of the single-node test environment using PostgreSQL with the three-node production environment using PostgreSQL and OpenSearch" srcset="https://substackcdn.com/image/fetch/$s_!Ao6Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png 424w, https://substackcdn.com/image/fetch/$s_!Ao6Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png 848w, https://substackcdn.com/image/fetch/$s_!Ao6Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png 1272w, https://substackcdn.com/image/fetch/$s_!Ao6Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bd3929-4cce-4459-bf93-101d6597ee88_1884x766.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>STACKIT Environments</em></figcaption></figure></div><p><strong>Test</strong> is deliberately lean: A <em>single</em> broker setup (1 broker on 1 node, in 1 AZ running 1 partition). Camunda 8.9 uses PostgreSQL for secondary storage there, which removes managed OpenSearch, Optimize and the monitoring stack from that environment. It runs in one zone without data-store replicas. Developers still get a shared Camunda installation, while avoiding paying for a miniature copy of every prod service.</p><p><strong>Prod</strong> carries the full load: A <em>triple</em> broker setup (3 brokers on 3 nodes, in 3 AZs running 3 partitions, replicated over all 3 brokers), OpenSearch for secondary storage, Optimize for process analytics, and monitoring with Prometheus. Three availability zones and replicated data stores keep the platform running when one zone fails.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rRCE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rRCE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png 424w, https://substackcdn.com/image/fetch/$s_!rRCE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png 848w, https://substackcdn.com/image/fetch/$s_!rRCE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png 1272w, https://substackcdn.com/image/fetch/$s_!rRCE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!rRCE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png" width="1456" height="578" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:578,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:81678,&quot;alt&quot;:&quot;Comparison of SKE nodes, storage, PostgreSQL, monitoring and Zeebe configuration in test and prod&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211160866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Comparison of SKE nodes, storage, PostgreSQL, monitoring and Zeebe configuration in test and prod" title="Comparison of SKE nodes, storage, PostgreSQL, monitoring and Zeebe configuration in test and prod" srcset="https://substackcdn.com/image/fetch/$s_!rRCE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png 424w, https://substackcdn.com/image/fetch/$s_!rRCE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png 848w, https://substackcdn.com/image/fetch/$s_!rRCE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png 1272w, https://substackcdn.com/image/fetch/$s_!rRCE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0a12550-13c3-4e0c-9518-fefabbf52604_1530x607.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Both environments run the same node type, a g2i.8 (general purpose, 8 vCPU Intel Icelake, 32 GiB RAM). Everything else differs by design: secondary storage, zones, node count, Optimize and monitoring. STACKIT adds new options from time to time, as of writing this, there is already a newer generation g3i.8 (Intel Emerald Rapid) available which is slightly more expensive, but we resisted the temptation to upgrade.</p><p>Storage was the less visible difference. STACKIT defaults block volumes to 500 IOPS (input/output operations per second); the AWS reference assumes a 3.000-IOPS gp3 disk, while Zeebe expects fast SSD storage with 1.000 IOPS as the floor. Reusing the reference volume sizes without checking the storage class would have left the write-ahead log below that minimum, and Kubernetes would have reported nothing wrong.</p><p>We assigned IOPS based on workload: <strong>2.000</strong> for Zeebe&#8217;s log and snapshots, <strong>1.000</strong> for PostgreSQL, and <strong>500</strong> for node root disks that carry the OS and logs. Test and prod use the same tiers so their behavior stays comparable; only the volume sizes change.</p><p>The Helm edit took only minutes. Deciding what each value had to achieve took most of the time. When we finished, Entra logins worked and process instances completed in test and prod. That was enough to call it a real deployment.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ox-M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ox-M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png 424w, https://substackcdn.com/image/fetch/$s_!ox-M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png 848w, https://substackcdn.com/image/fetch/$s_!ox-M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png 1272w, https://substackcdn.com/image/fetch/$s_!ox-M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ox-M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png" width="1456" height="612" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:612,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:196952,&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://theintermediatecatchevent.substack.com/i/211160866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.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_!ox-M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png 424w, https://substackcdn.com/image/fetch/$s_!ox-M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png 848w, https://substackcdn.com/image/fetch/$s_!ox-M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png 1272w, https://substackcdn.com/image/fetch/$s_!ox-M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a11f95-1fa1-418c-ba20-28228f75f2a5_2440x1026.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The landing page we added for the deployment&#8217;s applications and client endpoints.</em></figcaption></figure></div><p>We added a small landing page so nobody had to keep a list of application URLs and client endpoints. It brings Operate, Tasklist, Web Modeler, Console, Admin, Management Identity, Optimize (prod), Grafana (prod) and ArgoCD together in one place. Entra and the authorization rules behind each application still decide what a user can open.</p><h2>What We Needed To Address Next</h2><p>My laptop still held credentials. Neither environment had a recovery path, the network trusted far too much, and the sizing rested on arithmetic rather than a load test.</p><p>We tackle the operational gaps first. Part 2 turns our setup into a real platform, then Part 3 narrows the network trust. Part 4 looks at what the coding agent contributed and where it failed. In Part 5 we put the platform under load, and Part 6 closes with the operating model, the bill and the verdict.</p>]]></content:encoded></item><item><title><![CDATA[Owning Your Process Automation: The Case For A Sovereign Cloud In Europe]]></title><description><![CDATA[How Cloud Sovereignty Became An Operating Decision]]></description><link>https://blog.itsmestefanjay.dev/p/owning-your-process-automation-the-49a</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/owning-your-process-automation-the-49a</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Tue, 18 Aug 2026 08:01:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!F46l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.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_!F46l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F46l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!F46l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!F46l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!F46l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F46l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png" width="1456" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1469793,&quot;alt&quot;:&quot;Camunda on STACKIT over a stylized European data-center network&quot;,&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://theintermediatecatchevent.substack.com/i/211160144?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Camunda on STACKIT over a stylized European data-center network" title="Camunda on STACKIT over a stylized European data-center network" srcset="https://substackcdn.com/image/fetch/$s_!F46l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png 424w, https://substackcdn.com/image/fetch/$s_!F46l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png 848w, https://substackcdn.com/image/fetch/$s_!F46l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png 1272w, https://substackcdn.com/image/fetch/$s_!F46l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c95feae-93f0-4a87-b788-958dfeda00ec_1500x800.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Camunda On STACKIT (AI, 2026)</em></figcaption></figure></div><p>I don&#8217;t follow American politics regularly, the few important things are reported in German news, and my Instagram or LinkedIn algorithm does the rest. The topic of cloud sovereignty prevails in the IT world for several years now and one thing caught my attention, even if it might not sound significant on the first read.</p><p>On  June 29th, 2026, the US Supreme Court ruled 6 to 3 in <a href="https://www.supremecourt.gov/opinions/25pdf/25-332_qn12.pdf">Trump v. Slaughter</a> that the president can remove commissioners of the FTC (Federal Trade Commission) at will. The decision <a href="https://www.scotusblog.com/2026/06/court-allows-trump-to-fire-ftc-commissioner-and-overturns-major-restraint-on-presidential-power/">overturned a restraint on presidential power that had held since 1935</a>.</p><p>The European Union has relied on the FTC when assessing whether US data protection is adequate. NOYB (None of your Business, an Austrian data-privacy advocacy group) has since <a href="https://noyb.eu/en/us-supreme-court-just-blew-eu-us-data-transfers">asked the European Commission to withdraw the adequacy decision</a>; <a href="https://noyb.eu/sites/default/files/2026-06/Letter_noyb_EU-US_data_transfers.pdf">its letter</a> points out that the EU-US Data Privacy Framework refers to the FTC 259 times and treats it as an independent supervisory authority. The framework is still valid. Whether it stays that way is a decision European companies do not control.</p><p>There was already another concern regarding the sovereignty of data. Under the <a href="https://www.justice.gov/criminal/cloud-act-resources">US CLOUD Act</a>, American authorities can force a US company to handover data it controls no matter where the data is stored. Frankfurt tells you where the disks are. Company ownership tells you which court can reach them.</p><p>Architects, developers and transformation leads usually don&#8217;t decide on long-term cloud strategy, but we are still asked whether the resulting architecture is safe to depend on. Our part is to translate that legal uncertainty into operational consequences so leadership can make an explicit decision. </p><h2>What Sovereignty Actually Means</h2><p>Many arguments regarding sovereignty end at the datacenter: the infrastructure is in Frankfurt (a.k.a. eu-central-1), the ops team of the managed services sits in Europe. Case closed. That answer covers location and operations. It says nothing about the law that can reach the company behind the service.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WFeV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WFeV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png 424w, https://substackcdn.com/image/fetch/$s_!WFeV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png 848w, https://substackcdn.com/image/fetch/$s_!WFeV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png 1272w, https://substackcdn.com/image/fetch/$s_!WFeV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WFeV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png" width="528" height="268.1789401238816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:738,&quot;width&quot;:1453,&quot;resizeWidth&quot;:528,&quot;bytes&quot;:97269,&quot;alt&quot;:&quot;Pyramid showing data residency above operational autonomy and legal sovereignty&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211160144?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Pyramid showing data residency above operational autonomy and legal sovereignty" title="Pyramid showing data residency above operational autonomy and legal sovereignty" srcset="https://substackcdn.com/image/fetch/$s_!WFeV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png 424w, https://substackcdn.com/image/fetch/$s_!WFeV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png 848w, https://substackcdn.com/image/fetch/$s_!WFeV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png 1272w, https://substackcdn.com/image/fetch/$s_!WFeV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9304e364-ac3c-411c-9721-9a1edc41a635_1453x738.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The Three Levels of  Sovereignty</em></figcaption></figure></div><p>The discussion should be split into three questions:</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yKU3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png 424w, https://substackcdn.com/image/fetch/$s_!yKU3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png 848w, https://substackcdn.com/image/fetch/$s_!yKU3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png 1272w, https://substackcdn.com/image/fetch/$s_!yKU3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!yKU3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png" width="728" height="202.8764705882353" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:379,&quot;width&quot;:1360,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:53493,&quot;alt&quot;:&quot;Comparison of data residency, operational autonomy and legal sovereignty for a hyperscaler's EU region&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/211160144?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Comparison of data residency, operational autonomy and legal sovereignty for a hyperscaler's EU region" title="Comparison of data residency, operational autonomy and legal sovereignty for a hyperscaler's EU region" srcset="https://substackcdn.com/image/fetch/$s_!yKU3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png 424w, https://substackcdn.com/image/fetch/$s_!yKU3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png 848w, https://substackcdn.com/image/fetch/$s_!yKU3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png 1272w, https://substackcdn.com/image/fetch/$s_!yKU3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ace643e-bf22-4e9c-acb1-e04827fe0ea5_1360x379.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div></figure></div><p>An EU region and an EU operating company answer the first two. But if the parent entity is American, the CLOUD Act can still reach it. European law still applies, but it doesn&#8217;t exclude the jurisdiction of the ownership.</p><p>For an ops team, this means two concrete things: a government policy can change access to a service, and US authorities can force the provider to hand over data.</p><h2>Process Automation Is The Wrong Place To Accept That Risk</h2><p>The type of work changes the risk level of that provider dependency. If Camunda coordinates your most critical business processes like orders, claims, or payments, losing control over the platform means losing the assets that generate revenue. If you&#8217;re dealing with sensitive data, you need to ensure privacy and integrity. Who owns the provider belongs in the business-continuity plan, even though it sits outside the architecture diagram.</p><p>Bernd R&#252;cker (Camunda co-founder) has always told developers to only keep data in the engine that drive a process forward, and I totally agree. Customer records should stay in the systems that own them. This has changed over the last years, when Camunda has grown into a platform that can also handle documents, so there is more at stake than a set of process variables. A CLOUD Act request can reach that data through the provider, with no European court in a position to stop it.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/p/owning-your-process-automation-the-49a?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading The Intermediate Catch Event! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/p/owning-your-process-automation-the-49a?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.itsmestefanjay.dev/p/owning-your-process-automation-the-49a?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><h2>Camunda on STACKIT</h2><p>Camunda 8 can be self-managed since from the beginning. You can place your platform and its process data with a provider that meets all three levels of sovereignty from above. In our case, identity and code hosting remain separate choices (Consid currently uses GitHub and Azure Entra, both of which are owned by Microsoft), and each organization has to decide how far the requirement should go.</p><p>We checked four things:</p><p>&#9745;&#65039; An entity under EU law</p><p>&#9745;&#65039; No foreign parent</p><p>&#9745;&#65039; European-owned infrastructure</p><p>&#9745;&#65039; No hidden US dependency underneath</p><p><a href="https://stackit.com/en">STACKIT</a> met all of them. <a href="https://schwarz-digits.de">Schwarz Digits</a> (part of the Schwarz Group) first built the cloud for their own retail companies, including Kaufland and Lidl. They then offered it outside the group. That operating history mattered more to me than a long feature catalogue. STACKIT&#8217;s catalogue is smaller than AWS&#8217;s and already included the services required for this platform.</p><p><em>For transparency reasons: I work for Consid, which offers the Camunda-on-STACKIT architecture described here. Consid partners with Camunda and Schwarz Digits, and I&#8217;m a Camunda Champion. Nobody pays me or provides anything in return for this series. I&#8217;m sharing our work on my blog, because I want the lessons to be available for everyone.</em></p><div><hr></div><h2>Next Up</h2><p>This is the beginning of a seven part series. The following articles show what we did: the first Camunda deployment, the platform work around it, hardening, our use of a coding agent, putting load on the platform and the resulting costs of STACKIT.</p><p>Cloud sovereignty is risk management. The events of 2026 made the dependency concrete enough to require an explicit decision, including the cost and operating consequences on either side.</p>]]></content:encoded></item><item><title><![CDATA[Inside ProcessOS]]></title><description><![CDATA[From A Brief To Solutions That Hold]]></description><link>https://blog.itsmestefanjay.dev/p/inside-processos</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/inside-processos</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 21 May 2026 12:31:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Yrtt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg" 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_!Yrtt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yrtt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Yrtt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Yrtt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Yrtt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yrtt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg" width="1027" height="666" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:666,&quot;width&quot;:1027,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:187474,&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://theintermediatecatchevent.substack.com/i/198692481?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.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_!Yrtt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Yrtt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Yrtt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Yrtt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F215c9b11-d429-4487-9d3b-d32907d95bbe_1027x666.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>&#8220;Yesterday we told you. Today we show you.&#8221; Day Two keynote at CamundaCon Amsterdam 2026.</em></figcaption></figure></div><p><a href="https://theintermediatecatchevent.substack.com/p/camunda-announces-processos?r=5i6h9p">The Day One keynote announced ProcessOS</a>. The Day Two keynote actually ran it. Bernd R&#252;cker, Co-founder and Chief Technologist, and Bastian K&#246;rber, VP Product Management, took a process from a one-paragraph brief to a deployed and running instance in under thirty minutes. They were upfront that this was lab conditions, not a production rollout. I think that honesty mattered, because the thirty-minute number is not the real point of the session.</p><p>The more hands-on half of the keynote was what sits underneath the demo. ProcessOS is not just &#8220;AI writes a BPMN file&#8221;. It is a pipeline that goes from intent to executable artifacts, plus a stack of capabilities that Camunda is building so the output actually holds up in production. The framing was direct. Generation is the easy half. Trust is the half most teams underestimate.</p><p>This article walks both halves. The demo first, because the phase model is the easiest way to understand how ProcessOS thinks. Then the Four Pillars of Trust and the roadmap to Camunda 8.10 in October 2026, where the trust half lives. If you want the announcement framing, read the Day One write-up first. This one assumes you have it.</p><h2>From Brief To Running Process</h2><p>The interesting part of the demo was not the domain. It was the sequence of phases ProcessOS runs through.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kywp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kywp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png 424w, https://substackcdn.com/image/fetch/$s_!kywp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png 848w, https://substackcdn.com/image/fetch/$s_!kywp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png 1272w, https://substackcdn.com/image/fetch/$s_!kywp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kywp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png" width="1456" height="769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:769,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:139652,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/198692481?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.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_!kywp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png 424w, https://substackcdn.com/image/fetch/$s_!kywp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png 848w, https://substackcdn.com/image/fetch/$s_!kywp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png 1272w, https://substackcdn.com/image/fetch/$s_!kywp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e00ec97-90fe-4170-b163-112563ba87f8_1510x798.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The ProcessOS loop. Intent in, running re-engineered process out, governed by organizational memory and live signals.</em></figcaption></figure></div><p>There are several phases, and each one has a clear input, an agent step, and a user review:</p><ul><li><p><strong>Brief and goals.</strong> A plain-English brief, picked KPIs (cycle time, manual effort, quality, compliance, cost, throughput), free-text constraints, and a single sentence describing the desired outcome. The brief on stage was short, a few lines pointing at the company wiki for policy and naming the backend services the process should wire up to.</p></li><li><p><strong>Discovery.</strong> The Discovery agent reads the wiki, OpenAPI specs, policies, and runbooks that are in scope. It builds a Markdown decomposition of the as-is process and a draft BPMN. A live event stream showed the discovery phase running through to phase complete.</p></li><li><p><strong>Calibrate as-is.</strong> ProcessOS does not pretend its findings are ground truth. It surfaces open questions, risks, and confirmations against specific BPMN elements, and asks you to answer per element to lock down the as-is.</p></li><li><p><strong>Design and review to-be.</strong> The agent proposes the redesign with concrete before-and-after items per step, each tied back to a KPI you picked. One step in the demo replaced a gut-feel decision with a DMN business rule producing a routing class. The BPMN diff that followed showed 47 additions, 28 removals, and 3 changes. Feedback can be left on individual steps and goes back to the agent.</p></li><li><p><strong>Generate artifacts.</strong> The Build agent produces real Camunda 8 artifacts, not pseudocode. Four artifact types: BPMN, DMN, forms, and Java workers, sitting as files in the project repository, ready to compile.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9gp7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9gp7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9gp7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9gp7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9gp7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!9gp7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg" width="962" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:962,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:194232,&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://theintermediatecatchevent.substack.com/i/198692481?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.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_!9gp7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9gp7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9gp7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9gp7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7d7cc-20fa-4244-99fa-a9b9ffab90d5_962x640.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The ProcessOS phase model. Each phase is reviewable and reversible.</em></figcaption></figure></div><p>The last phase was deploy and test. ProcessOS lints the artifacts, deploys all the BPMN, DMN, and form files to a Camunda 8 cluster, generates synthetic test variables, and starts one process instance via the Zeebe REST API. About thirty seconds. Bernd then switched to Operate and walked a live instance through its happy path. If you skip the deploy step, the artifacts stay in the project folder and you can run the generated worker scaffold yourself.</p><p>To make the openness point, Bernd also opened a coding agent in the same project folder and asked it to extend the generated Java application with a small web form. Same repo, same artifacts, different agent. The point is that ProcessOS is not a closed surface. The output is a normal Camunda 8 project that any coding agent or human can pick up from.</p><h2>Why Speed Alone Is Not The Story</h2><p>Thirty minutes from brief to running instance is a strong headline. It is also the kind of headline that gets teams in trouble. I have seen enough demos that looked good in the room and stalled in production to be careful here, and the speakers were careful too. They put it directly: &#8220;Trust is structural, not aspirational. Governance lives in the engine, the diagram, and the deploy path. Not in a policy doc.&#8221;</p><p>The strategic framing on the slide stacked three goals:</p><ul><li><p>Build solutions quicker. That is what ProcessOS is for.</p></li><li><p>Build solutions that hold. That is what agentic orchestration plus the Four Pillars of Trust is for.</p></li><li><p>Scale adoption. That only works if the first two are real.</p></li></ul><p>The middle goal is where most of the engineering investment is going. Generating BPMN was never going to be the hard part. Operating, evolving, and trusting agent-driven processes in production is.</p><h2>The Four Pillars Of Trust</h2><p>This is the framework Bernd walked through on stage. The pillars sit on top of agentic orchestration as the foundation. That foundation gives you durable state, governance, auditability, and operational control. The pillars cover what comes after a process is in production, when you have to operate it, debug it, and evolve it. Each pillar in his slide was split into what is shipping today and what is coming with 8.10.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zYVH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zYVH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png 424w, https://substackcdn.com/image/fetch/$s_!zYVH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png 848w, https://substackcdn.com/image/fetch/$s_!zYVH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png 1272w, https://substackcdn.com/image/fetch/$s_!zYVH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!zYVH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png" width="1456" height="536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:536,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:180440,&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://theintermediatecatchevent.substack.com/i/198692481?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.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_!zYVH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png 424w, https://substackcdn.com/image/fetch/$s_!zYVH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png 848w, https://substackcdn.com/image/fetch/$s_!zYVH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png 1272w, https://substackcdn.com/image/fetch/$s_!zYVH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ddd604-4100-4e06-b3d2-89d4685c95ca_2134x786.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Testing, Analytics, Instance Operations, Evolution. On top of agentic orchestration as the foundation.</em></figcaption></figure></div><p><strong>Testing.</strong> Non-determinism breaks the usual test pyramid. You cannot assert on exact strings when the LLM is in the loop.</p><ul><li><p>Today: mock the LLM with Camunda Process Test, <code>when(agent calls tool X).then(complete with Y)</code>. Assert output quality in natural language using an LLM as judge.</p></li><li><p>8.10: Test Studio for no-code acceptance tests written by business analysts.</p></li></ul><p><strong>Analytics.</strong> Problems at scale are invisible without dedicated signals. Aggregate process metrics are not enough once an agent is making decisions inside the flow.</p><ul><li><p>Today: bottleneck detection across the fleet in Optimize, plus process monitoring and incident tracking in Operate.</p></li><li><p>8.10: full agent visibility per instance, with conversation history, system prompt, tool calls, and token usage. An Agentic Control Plane for fleet-wide averages and outliers across tokens, durations, failure rates, and tool call distribution.</p></li></ul><p><strong>Instance Operations.</strong> Production problems need surgical fixes, not restarts. If your only remediation is to redeploy, you will keep redeploying.</p><ul><li><p>Today: see the incident and fix it in place. Retry, modify, migrate. Every action goes to the audit trail. Drill into individual agent runs to see the complete memory, including every tool call and reasoning step.</p></li><li><p>8.10: waiting state visibility, variable trace, and instance priority. Know what the process is waiting for without guessing.</p></li></ul><p><strong>Evolution.</strong> Everything changes. Models, prompts, business rules. The platform needs to make change cheap and traceable.</p><ul><li><p>Today: every change versioned, every instance traceable, running cases stay on their version, and you know which model ran when. Promote a proven agent pattern to a deterministic step without rewriting the process.</p></li><li><p>8.10: swap model or credentials without touching the process via environment handling and a connection manager. Optimize from production data, with token trends, tool frequency, and prompt versioning.</p></li></ul><p>Read across the pillars and the pattern is consistent. The &#8220;today&#8221; rows already give you a working production setup. The &#8220;8.10&#8221; rows close the visibility and operational gaps that agentic systems specifically introduce.</p><h2>What To Expect In The Next Months</h2><p>The roadmap puts the trust half on a calendar. The slide split it into three layers, each on a different clock:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fv0E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fv0E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fv0E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fv0E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fv0E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!fv0E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg" width="1280" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:750347,&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://theintermediatecatchevent.substack.com/i/198692481?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.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_!fv0E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fv0E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fv0E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fv0E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ee516a-087e-424f-9c3b-39b28395cffd_1280x960.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The roadmap. Foundation, Connective Tissue, Compounding Loop.</em></figcaption></figure></div><ul><li><p><strong>The Foundation.</strong> Camunda 8 as it is today. The event-streaming engine, the SDKs, BPMN as an open standard, Process Test for self-validating agents, the Docs MCP server. Most readers are running on it already.</p></li><li><p><strong>The Connective Tissue.</strong> Arrives with 8.10 in October 2026. One Camunda Hub workspace, AI Coding Assistant reaches full release, Test Studio, Agentic Control Plane, and processes exposed as MCP tools. This is where the Four Pillars deliverables show up.</p></li><li><p><strong>The Compounding Loop.</strong> Beyond 8.10. Platform-generated Solution Packs, agents that tune from production signals, and overnight experiments that surface improvements with a diff. The long bet and the one with the most execution risk.</p></li></ul><p>There is also a people side. ProcessOS is being positioned as a transformation offering, with forward-deployed engineers running discovery engagements at the customer site. Design partners are open now. If you are in a real re-engineering program, that is the program to ask about.</p><h2>Looking Ahead</h2><p>The Day Two keynote did three things well. It showed the pipeline end to end on something that looked like a real process. It admitted the demo was lab conditions and pointed at what is harder than generation. And it tied the roadmap to a clear date, October 2026 with 8.10, instead of a vague future.</p><h3>Key takeaways</h3><ul><li><p>The demo phase model is the right mental shortcut for ProcessOS. Brief, Discovery, Calibrate, Design, Artifacts, Deploy and test. Each phase is reviewable.</p></li><li><p>The artifacts are normal Camunda 8 artifacts. BPMN, DMN, forms, and Java workers in a project repo. Coding agents and humans can pick it up from there.</p></li><li><p>Bernd&#8217;s Four Pillars of Trust frame where the production story lives. Roughly half of each pillar is available today. The other half ships with 8.10.</p></li><li><p>The roadmap names three paces. Foundation today, Connective Tissue in October 2026, Compounding Loop beyond. Plan for the right one for your team.</p></li><li><p>ProcessOS is also a transformation offering. The design partner program is the way in if you have a real re-engineering program lined up.</p></li></ul><p>What I will be watching over the next months: the closed beta opening up, the 8.10 release notes for the Four Pillars deliverables, and the first platform-generated Solution Pack reaching full release. If you saw the keynote and want to compare notes, reach out. I will follow up once 8.10 is out.</p><h2>Related Articles</h2><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;f29b0c3b-a7e6-49d7-8bca-75c94faeda62&quot;,&quot;caption&quot;:&quot;Today at CamundaCon in Amsterdam, Camunda announced ProcessOS. The framing is bold: an operating system for business processes. It will be released with Camunda 8.10. If you have followed Camunda over the last year, this is the next big step after the push into agentic orchestration.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Camunda Announces ProcessOS&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:332866285,&quot;name&quot;:&quot;Stefan Schultz&quot;,&quot;bio&quot;:&quot;Technologist with 13+ years in agile software development, software architecture and process automation and orchestration.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a35ad2f9-f5cd-4b90-96e7-4c41eec68f99_1167x1164.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-20T10:31:07.039Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!TSDl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://theintermediatecatchevent.substack.com/p/camunda-announces-processos&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:198531424,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:1,&quot;publication_id&quot;:4704919,&quot;publication_name&quot;:&quot;The Intermediate Catch Event&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!ejxI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe3e2488-65e3-4b2b-9f3d-923f2793349c_596x596.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div>]]></content:encoded></item><item><title><![CDATA[Camunda Announces ProcessOS]]></title><description><![CDATA[An Operating System For Business Processes]]></description><link>https://blog.itsmestefanjay.dev/p/camunda-announces-processos</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/camunda-announces-processos</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Wed, 20 May 2026 10:31:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TSDl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg" 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_!TSDl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TSDl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TSDl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TSDl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TSDl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TSDl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg" width="1658" height="846" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:846,&quot;width&quot;:1658,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:193408,&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://theintermediatecatchevent.substack.com/i/198531424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458a4e9d-2345-4eeb-bea3-4b405c3bd7c8_1875x956.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_!TSDl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TSDl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TSDl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TSDl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e16ecf2-53f2-4e73-80ba-71ba6bed5b30_1658x846.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>ProcessOS keynote at CamundaCon Amsterdam (2026)</em></figcaption></figure></div><p>Today at CamundaCon in Amsterdam, Camunda announced ProcessOS. The framing is bold: <strong>an operating system for business processes</strong>. It will be released with Camunda 8.10. If you have followed Camunda over the last year, this is the next big step after the push into agentic orchestration.</p><p>The short version is that ProcessOS is an intelligence layer that sits inside the Camunda Hub. It uses skills and agents to help you discover, design, build, and optimize processes. It works on your company data and gets better over time. The current AI coding agent is Claude Code, but the design is open and not locked to one model or vendor.</p><p>Camunda&#8217;s framing for this is direct: <strong>Every process in your enterprise is legacy, because it was designed for a world where AI did not exist</strong>. They call the work of redesigning those old processes into AI-native ones The Great Re-engineering. ProcessOS is meant to be the layer where that work happens. That framing is the main thread of this article, not the full feature list.</p><h2>What ProcessOS Actually Is</h2><p>ProcessOS is positioned as the intelligence layer of the Camunda Hub. The Hub also covers Web Modeler, Workspaces, Catalog, Console, the Business Value Dashboard, and the Agentic Control Plane. ProcessOS pulls these surfaces together with a loop of four activities: Discover, Design, Build, Optimize:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Cap!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Cap!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png 424w, https://substackcdn.com/image/fetch/$s_!8Cap!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png 848w, https://substackcdn.com/image/fetch/$s_!8Cap!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png 1272w, https://substackcdn.com/image/fetch/$s_!8Cap!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Cap!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png" width="1456" height="769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:769,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:139652,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/198531424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.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_!8Cap!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png 424w, https://substackcdn.com/image/fetch/$s_!8Cap!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png 848w, https://substackcdn.com/image/fetch/$s_!8Cap!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png 1272w, https://substackcdn.com/image/fetch/$s_!8Cap!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e57a79a-cd36-4d0f-a775-92a75b0c3073_1510x798.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Schema showing ProcessOS position between intent and outcome</em></figcaption></figure></div><p>The inputs are intent, expressed as desired process improvements. The outputs are running, re-engineered, AI-native processes. In between, ProcessOS draws on two things. The first is organizational memory: knowledge, the catalog of connectors and building blocks, and policies. The second is signals: production data, live systems, and intelligence. That mix is what allows it to learn over time and stay grounded in the real company context, not just in a generic model.</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8WYF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.png 424w, https://substackcdn.com/image/fetch/$s_!8WYF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.png 848w, https://substackcdn.com/image/fetch/$s_!8WYF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.png 1272w, https://substackcdn.com/image/fetch/$s_!8WYF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8WYF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.png" width="1456" height="222" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:222,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85870,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/198531424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.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_!8WYF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.png 424w, https://substackcdn.com/image/fetch/$s_!8WYF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.png 848w, https://substackcdn.com/image/fetch/$s_!8WYF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.png 1272w, https://substackcdn.com/image/fetch/$s_!8WYF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3565f1a9-88ce-4698-998b-d2686995c4f3_1902x290.png 1456w" sizes="100vw"></picture><div></div></div></div><figcaption class="image-caption">The different interaction levels with ProcessOS</figcaption></figure></div><p>For the people doing the work, there are three ways to use it. You can let agents act directly in an autonomous, agentic way. You can work with agent skills through a coding agent like Claude Code, with a human in the loop. Or you can edit manually in the Web Modeler with Camunda Copilot. Same skills, different levels of automation.</p><h2>Why It Matters For Companies</h2><p>Agentic orchestration was the first step. Camunda made it possible to use AI inside a running process, with the platform handling state, retries, and human escalation. ProcessOS is the next step. It uses AI before the process is even doing something, in the work of building the process itself.</p><p>For companies, the practical promise is speed. Prototyping and shipping production grade processes can move from months to weeks. That changes the economics of process work. It also changes who can take part. If an analyst can describe intent and get a working draft to review, the bottleneck is no longer only in the modeling tool. The review is still real and the governance is still real, but the first version arrives much faster.</p><p>The other point is <strong>strategic</strong>. Everyone is doing AI right now. What Camunda is offering with ProcessOS is a path where AI is not a feature bolted on the side, but a layer that knows your processes, your data, and your policies. That is a different conversation than just calling a model from a service task. It is the actual work of The Great Re-engineering: turning legacy enterprise processes, designed without AI in mind, into AI-native ones that fit how work gets done now.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Intermediate Catch Event! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>From The Keynote</h2><p>The announcement came from two speakers. Jakob Freund, Camunda&#8217;s CEO, opened with a direct question: are you truly ready for AI? His framing was that AI bolted on top of existing processes hits an automation ceiling. The early gains show up, but then coordination breaks down and the costs of chaos rise. The way through is to re-engineer the processes themselves, not to add AI to processes that were never designed for it. He also reminded the audience that agentic orchestration, announced six months ago in New York, is now live and battle proven at scale, with 16 customers already presenting at the event.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HTli!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HTli!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HTli!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HTli!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HTli!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!HTli!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:869304,&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://theintermediatecatchevent.substack.com/i/198531424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.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_!HTli!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HTli!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HTli!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HTli!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc78a1bc0-dbfa-4e67-9d53-3641a1872763_2764x2073.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Announcing ProcessOS at CamundaCon 2026</em></figcaption></figure></div><p>Daniel Meyer, Camunda&#8217;s CTO, then walked through what ProcessOS does in practice. Camunda used its own Quote to Cash process as the pilot. That process touches about 30 people across 6 divisions, 17 roles, 12 systems, and 14 document artifacts. Every euro of Camunda&#8217;s revenue runs through it. The Discovery Agent queried the real systems and produced markdown documentation in under an hour. About 66% of the input came from systems, the rest from short questionnaires for the people involved. A 3 hour stakeholder review followed.</p><p>The Design Agent then suggested a radical transformation. Collapse 20 to 79 touchpoints down to 2 in the happy path, with Slack as the single surface for employees and a new Deal Agent coordinating the other agents behind it. Guardrails and approvals stay enforced through BPMN where they are needed. The Build Agent generated the BPMN, DMN and other artifacts from that design, with engineers handling the remaining 20%. Four weeks of calendar time replaced the 9 to 12 months Camunda estimates for the traditional approach. The outcome: cycle time dropped from 115 days to 80, error rate from 10% to about 2%, and around 6000 person-hours freed per year, or about 5 hours saved per deal. The wider pilot, enablement and rollout are still pending, but the demo was meant to make the speed concrete, not just promised.</p><h2>What&#8217;s Next</h2><p>ProcessOS is in closed beta at the announcement and will arrive with Camunda 8.10. The parts to watch are how the Quote to Cash rollout goes beyond the demo, when the closed beta opens up, and how the skills and tools extend to coding agents other than Claude Code. I will follow up with a closer look once the release is out and the first hands-on examples are available.</p><p>If you want the official framing, watch for the keynote recording and the <a href="https://camunda.com/platform/process-os/">ProcessOS announcement page</a> from Camunda after the event.</p>]]></content:encoded></item><item><title><![CDATA[Agentic Essentials #2: Agentic Vs Linear Process Vs DMN]]></title><description><![CDATA[When To Pick Agentic Orchestration Over Deterministic Processes]]></description><link>https://blog.itsmestefanjay.dev/p/agentic-essentials-2-agentic-vs-linear</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/agentic-essentials-2-agentic-vs-linear</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 16 Apr 2026 08:01:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Jntj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg" 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_!Jntj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jntj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Jntj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Jntj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Jntj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jntj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg" width="1536" height="804" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:804,&quot;width&quot;:1536,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:455885,&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://theintermediatecatchevent.substack.com/i/193768978?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ae405-68e4-4675-8a30-8f3c50fac2a7_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Jntj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Jntj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Jntj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Jntj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54530a4d-dc53-40c3-b8fa-2d3b7470d75a_1536x804.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://theintermediatecatchevent.substack.com/p/ai-bpm-the-best-of-both-worlds?r=5i6h9p">The first agentic essentials article</a> was about how agentic orchestration works. This one is about when to use agentic orchestration at all. That is a different question, and I think it matters more. Teams often reach for AI before they have confirmed it fits the problem they actually have. </p><p>In this article I compare three problem shapes in the same baggage-support world: a fixed workflow, a rule-based decision, and a messy inbound email that neither of those can handle cleanly. The rule-based part uses DMN, short for Decision Model and Notation, which is a standard way to write business decisions as explicit rule tables. The goal is one honest threshold for when agentic orchestration is the right call and when it is not. I will continue to use the missing-baggage example here.</p><h2>Three Different Problem Shapes</h2><p>All three examples below stay in the same baggage-support world. What changes is how much the system already knows when the case arrives, and how hard the next step is to pre-model.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QqHk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QqHk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic 424w, https://substackcdn.com/image/fetch/$s_!QqHk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic 848w, https://substackcdn.com/image/fetch/$s_!QqHk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic 1272w, https://substackcdn.com/image/fetch/$s_!QqHk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QqHk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic" width="642" height="276.2026666666667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:484,&quot;width&quot;:1125,&quot;resizeWidth&quot;:642,&quot;bytes&quot;:75620,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/193768978?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QqHk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic 424w, https://substackcdn.com/image/fetch/$s_!QqHk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic 848w, https://substackcdn.com/image/fetch/$s_!QqHk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic 1272w, https://substackcdn.com/image/fetch/$s_!QqHk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8620c617-3089-4625-b8d4-cf79e77ab6d6_1125x484.heic 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>When A Normal Workflow Is Enough</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WLRe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WLRe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic 424w, https://substackcdn.com/image/fetch/$s_!WLRe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic 848w, https://substackcdn.com/image/fetch/$s_!WLRe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic 1272w, https://substackcdn.com/image/fetch/$s_!WLRe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WLRe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic" width="1456" height="385" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:385,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70645,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/193768978?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WLRe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic 424w, https://substackcdn.com/image/fetch/$s_!WLRe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic 848w, https://substackcdn.com/image/fetch/$s_!WLRe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic 1272w, https://substackcdn.com/image/fetch/$s_!WLRe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f1664a-3854-4997-a234-b5e1841a72d2_3855x1020.heic 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>A Deterministic Process</em></figcaption></figure></div><p>Imagine the passenger uses the portal. They pick &#8220;missing baggage&#8221;, enter a booking number and bag tag, and confirm their contact details. From there, the process follows the same order every time: query for the bag, contact the last known airport, provide a voucher and then update the passenger.</p><p>The steps are known before the case starts. I would not add AI here. Every model call adds latency and cost. On a step with no judgment in it, that overhead buys you nothing.</p><h3>When DMN Is The Better Fit</h3><p>Now look at the next action decision. A policy might allow different voucher amounts based on route length or delay. That is a business rule, not an open-ended judgment call.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qbfj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qbfj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic 424w, https://substackcdn.com/image/fetch/$s_!Qbfj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic 848w, https://substackcdn.com/image/fetch/$s_!Qbfj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic 1272w, https://substackcdn.com/image/fetch/$s_!Qbfj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qbfj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic" width="1456" height="417" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:417,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62652,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/193768978?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Qbfj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic 424w, https://substackcdn.com/image/fetch/$s_!Qbfj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic 848w, https://substackcdn.com/image/fetch/$s_!Qbfj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic 1272w, https://substackcdn.com/image/fetch/$s_!Qbfj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd47aa3e-74b5-4c18-9aaf-0a67b90536e4_2220x636.heic 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>A Simple DMN Table</em></figcaption></figure></div><p>This is where DMN fits better than AI. You put the policy into a decision table. The engine evaluates the inputs and returns a result. You can also explain later exactly why the outcome was accepted or rejected.</p><p>Every rule is visible. Every outcome is traceable. No model call needed. If you want to go deeper on DMN, I covered it in <a href="https://theintermediatecatchevent.substack.com/p/intro-to-bpmn-part-10-automating">a separate article</a>.</p><h3>When Agentic Orchestration Makes Sense</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0wjY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0wjY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic 424w, https://substackcdn.com/image/fetch/$s_!0wjY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic 848w, https://substackcdn.com/image/fetch/$s_!0wjY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic 1272w, https://substackcdn.com/image/fetch/$s_!0wjY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!0wjY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic" width="1456" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:151502,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/193768978?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0wjY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic 424w, https://substackcdn.com/image/fetch/$s_!0wjY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic 848w, https://substackcdn.com/image/fetch/$s_!0wjY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic 1272w, https://substackcdn.com/image/fetch/$s_!0wjY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2092812-752e-4272-95eb-efbf3dc25131_3411x1266.heic 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The Agentic Approach</em></figcaption></figure></div><p>Now take the <em>messy</em> version. The passenger sends a plain email. Their bag didn&#8217;t arrive, they have moved to a different hotel, and they only have an old photo of the tag.</p><p>The first useful step is not obvious. The system might need to check whether a claim already exists, ask only for the missing hotel address, and then continue the search. That is a much better experience than a rigid form that asks for everything upfront or a decision table that refuses to run without clean input. That is where agentic orchestration starts to make sense. The AI works within guardrails and has access to a small set of approved tools, but it decides which tool to use first based on reading the message.</p><p>But messy intake is only one case. The same reasoning applies mid-process. A process engine follows the path it was given. A rule table matches conditions to outputs. Neither one reasons. If the passenger&#8217;s next message mentions that their medication was in the bag, a fixed flow has no branch for that. A DMN table has no row for it either. An agentic step can read the message, understand what changed, and act on it, for example by sending a care voucher or escalating the priority, without a developer having anticipated every situation the passenger might bring up.</p><h2>The Cost Of AI</h2><p>This part often gets skipped in demos. AI adds real overhead:</p><ul><li><p>Every model call costs money.</p></li><li><p>Responses are slower than a rule table.</p></li><li><p>The behavior needs evaluation on real, messy inputs.</p></li><li><p>Operations teams get one more thing to monitor.</p></li></ul><p>If there are only a few known next steps, that overhead is usually not worth it. A workflow or a decision table will be easier to run and easier to explain.</p><h2>Start From The Problem, Not The Tool</h2><p>Do not start from &#8220;where can I add AI?&#8221; Start from &#8220;where does structured modeling stop being enough?&#8221; For most processes, a workflow or a rule table is already the right answer.</p><h2>What&#8217;s Next</h2><ul><li><p>Many processes just don&#8217;t need AI. If the path is known, use deterministic BPMN. If the decision has clear rules, use DMN.</p></li><li><p>Agentic orchestration fits when the input is messy, the next step depends on interpretation, or the situation can change mid-case in ways that were never modelled.</p></li><li><p>The fundamental difference is reasoning. A process engine follows its path. A rule table matches its conditions. An LLM reads the situation and decides what to do next.</p></li><li><p>AI adds real cost and operational overhead. Start from the problem, not the technology.</p></li></ul><p>Once you decide that agentic orchestration is the right fit, the next question is practical: how does the AI step actually call tools and systems from inside the process? That is what the next article is about.</p>]]></content:encoded></item><item><title><![CDATA[The Camunda 8.9 Release Summary]]></title><description><![CDATA[An Overview Of The Most Important Changes]]></description><link>https://blog.itsmestefanjay.dev/p/the-camunda-89-release-summary</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/the-camunda-89-release-summary</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 09 Apr 2026 08:01:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lI2Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic" 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_!lI2Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lI2Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!lI2Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!lI2Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!lI2Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lI2Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:283092,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/190930777?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lI2Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!lI2Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!lI2Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!lI2Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf09f8-e810-4c3b-bf0a-130c83f49617_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Camunda 8.9 (AI, 2026)</figcaption></figure></div><p>Camunda 8.9 lands on April 14, 2026. Camunda keeps pushing the direction it made more visible in 8.8: stronger agentic orchestration building blocks, a clearer Orchestration Cluster API story, fewer migration gaps from Camunda 7, and a more mature connector runtime.</p><p>The upgrade pressure is not the same for every team. If you mostly run Camunda SaaS with standard clients, the move should feel manageable. If you run your own connector runtime, build custom SDK integrations, or rely on specific API behavior, read the breaking changes carefully. The main watch-outs are the Spring Boot 4 requirement, MCP related connector changes, and broader client and API compatibility cleanup.</p><p>The date matters for another reason as well: Camunda 8.6 reaches end of maintenance on the same day. If you are still on 8.6, it is time to move.</p><h2>Agentic AI And AI Facing Changes</h2><p>Camunda is clearly putting more weight behind agentic orchestration. In 8.9, the platform pieces around that story get more concrete.</p><p>The clearest example is the built-in <strong>MCP support</strong> in the Orchestration Cluster. Camunda can now expose operational capabilities through an MCP server, so MCP-capable clients can discover and invoke Camunda tools without custom API glue code. That includes tools around process definitions, process instances, user tasks, incidents, and variables. Streamable HTTP support makes that more practical for real MCP clients.</p><p>Camunda also adds an <strong>MCP server</strong> for the Camunda docs. Agents should not only call tools, they also need a trustworthy way to read the product documentation they depend on. In practice, this gives them a cleaner path to Camunda docs instead of relying on copied snippets or ad hoc retrieval.</p><p>There is also movement on the <strong>A2A</strong> side. Camunda adds A2A Client, A2A Client Polling, and A2A Client Webhook connectors in 8.9. That fits the same direction: agents should not only call one model or one tool, but also work across more structured agent-to-agent patterns. This is still earlier-stage than the MCP story, but it shows where the AI integration model is expanding.</p><p><em>For me this is a clear sign that Camunda keeps investing in AI, and 8.9 shows they&#8217;re serious about it.</em></p><h2>API Direction And Orchestration Cluster</h2><p>The next theme is platform consolidation around the Orchestration Cluster API. Camunda introduced the Orchestration Cluster and its API with Camunda 8.8 in October 2025. So 8.9 is not the start of that story, but a clear continuation of it.</p><p><strong>Operate</strong> now uses the Orchestration Cluster REST API as its single interface for accessing and managing process data. That reduces the distance between what the product uses internally and what customers use for their own tooling. On top of that, 8.9 adds more operational capabilities on the same path, for example deleting process and decision definitions or instances consistently through the Orchestration Cluster API and Operate. Even smaller behavior changes, like deletion endpoints now returning a response body, point in the same direction.</p><p><em>The takeaway for me is that the platform is getting more coherent around one API direction.</em> </p><p>If you have custom scripts, generated clients, internal wrappers, or direct integrations, this is the release where it makes sense to review your assumptions. If you mostly stay on supported tooling, you mainly need to know where the platform is moving.</p><h2>Migration Relevant Changes</h2><p>This part of the release closes a few gaps that Camunda 7 teams have felt for a while. Camunda has pushed Camunda 7 Enterprise Edition end of life to April 9, 2030, but it still stays on the final 7.24 minor release. That gives customers more time, but it also makes the migration path more important. In that window, Camunda keeps trying to smooth out the move to 8 where it can.</p><p>The most obvious one is <strong>BPMN conditional events</strong>. Camunda 8 now supports conditional start, boundary, and intermediate catch events. It makes BPMN models more expressive, removes some workaround patterns, and makes migration conversations from Camunda 7 a bit less awkward.</p><p><strong>Business ID</strong> is another good example. You can now create process instances with an immutable business identifier, and uniqueness validation can be enabled at cluster level for idempotent starts. That is useful far beyond migration, but migration teams will recognize the value immediately.</p><p><em>Taken together, I think this is probably the clearest &#8220;what got easier now&#8221; section in the release.</em></p><h2>Connector Runtime And SDK Details</h2><p>First, connectors now use a virtual threads executor by default. That should improve performance and scalability, especially for the I/O-heavy workloads that are typical in connector runtimes. In simple terms, the runtime should handle more concurrent jobs with lower resource consumption.</p><p>On the SDK side, the clearest headline is that the Camunda Spring Boot Starter now requires <strong>Spring Boot 4.0.x.</strong> That alone can decide how much work your upgrade takes, and Camunda ties it directly to the Spring Boot support policy, because support for Spring Boot 3 ends in June 2026. Also, <strong>OpenJDK 25</strong> is now supported across Orchestration Cluster, Connectors, Optimize, and related tooling.</p><h2>Other Practical Changes</h2><p>After the four bigger themes, the rest of the release is mostly about operational maturity. These are not the headline items, but they still improve how the platform feels in day-to-day work.</p><h3>Worth Mentioning</h3><p>One of the nicest operational additions is the new <strong>audit log</strong>. It is available in Operate, Identity, Tasklist, and the Camunda 8 REST API. That improves traceability, governance, and troubleshooting.</p><p>One strong SaaS addition is the <strong>Cluster Metrics endpoint</strong> for Orchestration Cluster. That matters because it gives teams a cleaner way to get cluster metrics into their own observability stack instead of treating SaaS metrics as something locked inside the platform.</p><h3>Self-Managed Quick Notes</h3><p>Self-Managed is not the focus of this article, but there is one change that stands out more than the others: <strong>RDBMS</strong> support for Orchestration Cluster as an alternative storage path alongside Elasticsearch or OpenSearch. </p><p>That is a big deal. For teams that want a more familiar operational model, or already run database-centric platforms, this can lower the barrier to self-managed Camunda noticeably. It does not remove the need for real platform ownership, but it changes the conversation around what self-managed Camunda can look like.</p><h2>Summary</h2><p>Taken together, Camunda 8.9 looks like a consolidation release with a purpose. It sharpens the AI and API direction introduced in 8.8, closes a few migration pain points, and improves runtime behavior where it matters.</p><p>If you are on 8.6, the maintenance deadline is the forcing function. If you are migrating from Camunda 7, a few long-standing gaps get smaller here. And if you work with connectors, AI integrations, or custom SDK code, 8.9 is the point where a careful upgrade review pays off.</p>]]></content:encoded></item><item><title><![CDATA[Testing Inbound Webhooks With Camunda Process Test]]></title><description><![CDATA[Validate Payload Mappings, Authentication, And Instance Startup]]></description><link>https://blog.itsmestefanjay.dev/p/testing-inbound-webhooks-with-camunda</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/testing-inbound-webhooks-with-camunda</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 26 Mar 2026 09:01:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vUHy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic" 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_!vUHy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vUHy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!vUHy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!vUHy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!vUHy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vUHy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:323542,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/190422906?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vUHy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!vUHy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!vUHy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!vUHy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192a29ed-0f3c-43b7-92be-90de8d3b430f_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Connector Validation (AI, 2026)</figcaption></figure></div><p>In one of my last articles, I wrote about payload validation for inbound webhooks. The model can reject bad payloads, check values with FEEL, and shape the data before the process continues. That is useful, but only half the story. At some point you need to prove that the webhook really works when the connector runtime is up and the process is deployed.</p><div><hr></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;6076100a-b6b6-422f-873a-e860e7dcd184&quot;,&quot;caption&quot;:&quot;In the previous article I talked about what Camunda&#8217;s webhook connector can do. This one looks at a very practical use case. We get data from other systems all the time and not all of it is good. Some payloads miss fields. Some are broken in creative ways. And if we let them start a process, we end up with errors halfway thr&#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;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Validating Process Payloads With Camunda's Inbound Webhook Connector&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:332866285,&quot;name&quot;:&quot;Stefan Schultz&quot;,&quot;bio&quot;:&quot;Technologist with 13+ years in agile software development, software architecture and process automation and orchestration.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a35ad2f9-f5cd-4b90-96e7-4c41eec68f99_1167x1164.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-12-02T09:01:42.583Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!QDWY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676a084f-5127-4239-b374-eff87bb12cb3_1536x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://theintermediatecatchevent.substack.com/p/validating-process-payloads-with&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:180087410,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4704919,&quot;publication_name&quot;:&quot;The Intermediate Catch Event&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!ejxI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe3e2488-65e3-4b2b-9f3d-923f2793349c_596x596.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><p>That is the point of this article. I want to show how to verify the whole inbound path: the webhook is reachable, authentication works, the payload is accepted or rejected as expected, the optional response looks right, and the process really starts or continues.</p><p>The setup is simpler than it sounds. Start the connector runtime next to the engine, point an HTTP client at the runtime address, wait until the webhook endpoint exists, then call it like a real consumer would.</p><h2>What We Need To Verify</h2><p>If the real entry point is a webhook, starting the instance directly through <em>CamundaClient</em> is not enough. It skips the exact parts that tend to break.</p><p>The main things I want to verify are:</p><ul><li><p>the webhook endpoint exists and is reachable.</p></li><li><p>the auth header is required and accepted.</p></li><li><p>the payload validation behaves as expected.</p></li><li><p>the optional response body contains the data I need.</p></li><li><p>the process starts or continues after the inbound connector fired.</p></li></ul><p>Typical failures sit right there:</p><ul><li><p>the webhook doesn&#8217;t exist.</p></li><li><p>the auth token is missing or wrong.</p></li><li><p>a FEEL check rejects a payload that used to pass.</p></li></ul><p>That is why I like testing the webhook through HTTP. It keeps the test close to the real runtime path, without needing a full external environment.</p><h2>A Shared Test Setup</h2><p>For this setup, I want three things in every test:</p><ul><li><p>the process engine</p></li><li><p>the connector runtime</p></li><li><p>a tiny HTTP helper that knows how to call the webhook</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J38E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J38E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic 424w, https://substackcdn.com/image/fetch/$s_!J38E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic 848w, https://substackcdn.com/image/fetch/$s_!J38E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic 1272w, https://substackcdn.com/image/fetch/$s_!J38E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!J38E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic" width="1456" height="990" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:990,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:106450,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/190422906?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J38E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic 424w, https://substackcdn.com/image/fetch/$s_!J38E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic 848w, https://substackcdn.com/image/fetch/$s_!J38E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic 1272w, https://substackcdn.com/image/fetch/$s_!J38E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4baa2939-b387-4c37-9f2d-2e79afb90ecc_1798x1222.heic 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Test Setup in Camunda</figcaption></figure></div><p>Camunda Process Test already gives us the first two pieces. With SpringBoot, the shared base class can hold the rest.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;dc38bf20-2736-44b9-9984-80456593c24a&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">@SpringBootTest(
    classes = TestConnectorRuntimeApplication.class,
    properties = {
      "camunda.process-test.connectors-enabled=true",
      "camunda.process-test.connectors-secrets.WEBHOOK_TOKEN=test-token",
    })
@CamundaSpringProcessTest
abstract class WebhookAwareProcessTest {

  protected static final String WEBHOOK_TOKEN = "test-token";

  @Autowired
  protected CamundaClient camundaClient;

  @Autowired
  protected CamundaProcessTestContext processTestContext;

  private RestClient webhookClient(String token) {
    return RestClient.builder()
        .baseUrl(processTestContext.getConnectorsAddress() + "/inbound/")
        .defaultHeaders(headers -&gt; {
          headers.setBearerAuth(token);
          headers.setContentType(MediaType.APPLICATION_JSON);
        })
        .build();
  }

  protected void waitForWebhookReady(String id) {
    Awaitility.await()
        .atMost(Duration.ofSeconds(30))
        .ignoreExceptions()
        .until(() -&gt; webhookStatus(id) != 404);
  }

  protected Optional&lt;Long&gt; startProcessViaWebhook(String id, String body) {
    var response = webhookClient(WEBHOOK_TOKEN)
              .post().uri(id)
              .body(body).retrieve()
              .toEntity(String.class);
    
    assertThat(response.getStatusCode().is2xxSuccessful()).isTrue();
    
    return extractProcessInstanceKey(response.getBody());
  }

  protected void continueProcessViaWebhook(String id, String body) {
    var response = webhookClient(WEBHOOK_TOKEN)
              .post().uri(id)
              .body(body).retrieve()
              .toBodilessEntity();

    assertThat(response.getStatusCode().is2xxSuccessful()).isTrue();
  }

  protected long startProcess(String processId, Map&lt;String, Object&gt; variables) {
    return camundaClient
        .newCreateInstanceCommand()
        .bpmnProcessId(processId)
        .latestVersion()
        .variables(variables)
        .send().join().getProcessInstanceKey();
  }

  protected int triggerWebhookWithToken(String id, String body, String token) {
    return webhookClient(token)
            .post().uri(id)
            .body(body).retrieve()
            .toBodilessEntity()
            .getStatusCode().value();
  }

  private int webhookStatus(String id) {
    return webhookClient(WEBHOOK_TOKEN)
        .get().uri(id)
        .exchange((request, response) -&gt; response.getStatusCode().value());
  }
}</code></pre></div><p>If you prefer file based config, the same connector setup can live in <em>src/test/resources/application.yaml</em>.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;695fdf1e-f487-4566-9be8-0ebff48a702f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">camunda:
  process-test:
    connectors-enabled: true
    connectors-secrets:
      WEBHOOK_TOKEN: test-token</code></pre></div><p>And if you already package your connector runtime as a Spring Boot app, use that same app in the test. That keeps the test setup close to the real runtime behavior. The only thing I swap is the secret values.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Intermediate Catch Event! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Trigger, Reject, And Continue Through Webhooks</h2><p>Once the base class exists, the actual tests get small.</p><p>The first test covers the happy path. It waits for the route, starts the process through the webhook, and reads the optional instance key from the response.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;a647c32f-6e5f-48a5-aa11-cce093246d0a&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">class CustomerWebhookStartTest extends WebhookAwareProcessTest {

  @BeforeEach
  void setup() {
    waitForWebhookReady("missing-bag");
  }

  @Test
  void test_process_should_start_as_expected() {
    // given
    var key = startProcessViaWebhook("missing-bag", "{\"bagId\":\"BAG-42\",\"customerId\":\"C-100\",\"lastAirport\":\"BER\"}");

    // then
    assertThat(key).isPresent();
    assertThat(byKey(key.get())).isCompleted();
  }
}</code></pre></div><p>This example assumes your webhook response expression returns the <em>processInstanceKey</em> in <em>correlation</em>. If that field is not part of the response, <em>startProcessViaWebhook(...)</em> returns <em>Optional.empty()</em>. That is why the return type is optional. Once you have the key, you can use your regular process assertions or search API to inspect the instance in more detail.</p><p>The next useful test is the negative auth case.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;9d0164c2-af27-4a9d-af92-ffd8515ec1c8&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">class CustomerWebhookAuthTest extends WebhookAwareProcessTest {

  @Test
  void test_webhook_call_rejected_if_unauthorized() {
    // when
    var status = triggerWebhookWithToken("missing-bag", "{\"bagId\":\"BAG-42\"}", "wrong-token");

    // then
    assertThat(status).isEqualTo(401);
  }
}</code></pre></div><p>This is a cheap test, but it covers a real production risk. Someone changes the auth setup, or the token header is configured differently than expected, and suddenly the webhook is either too open or unusable.</p><p>The third test covers the callback case. Sometimes the webhook does not start a new instance. It continues an existing one that is waiting for external input. In that case I still use <em>CamundaClient</em>, but only to move the instance into the waiting state. The continuation itself still happens through the webhook.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;666cfe24-2995-423b-9985-8e1ca6914aa4&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">class ShipmentWebhookContinuationTest extends WebhookAwareProcessTest {

  @Test
  void test_process_continues_if_webhook_is_triggered() {
    // when
    var key = startProcess("shipment-update-process", Map.of("shipmentId", "S-42", "customerId", "C-100"));

    // check for wait state
    assertThat(byKey(key.get())).hasActiveElements("WaitingForWebhook");

    // when
    continueProcessViaWebhook("shipment-update", "{\"shipmentId\":\"S-42\",\"status\":\"DELIVERED\"}");

    // then
    assertThat(byKey(key.get())).isCompleted();
  }
}</code></pre></div><p>In this case the instance key comes from <em>startProcess(...)</em>, because the webhook is only used for the continuation step. After the callback, assert the completed path or variables with the same process assertion style you already use in the rest of your test suite.</p><p>That is the split I would keep:</p><ul><li><p>use HTTP for the real webhook interaction.</p></li><li><p>use <em>CamundaClient</em> only when you need to prepare state before the callback.</p></li><li><p>return a process instance key where you can.</p></li><li><p>optionally, you can query for the instance key by using a <em>ProcessInstanceSearchRequest.</em></p></li></ul><p>If you already have complex FEEL expressions in your webhook, this is also the place to prove it. Send one payload that should pass and one that should fail. Then check both the response and the process path.</p><h2>Start Event Or Message Start Event</h2><p>There is one current detail that is worth calling out. Right now, an inbound webhook can effectively behave in different ways:</p><ul><li><p>as a message start event</p></li><li><p>as a none start event</p></li></ul><p>The difference is whether the inbound webhook connector has a message attached to it or not. In my setup, getting the none start variant meant manually deleting the attached message event definition from the BPMN Xml. There is no visible way in the Web Modeler to do it.</p><p>Why does that matter? Because the returned correlation data is different.</p><p>With the <strong>none start variant</strong>, the response can include the <em>processInstanceKey</em> through the <em>correlation</em> object. That is useful when you want to follow the created instance directly from the webhook response.</p><p>With the <strong>message start variant</strong>, the response gives you the message correlation data, not the process instance key. In practice that means you get a <em>messageKey</em>, which is less useful when you want to inspect the created instance right away. You need to look up the started instance yourself.</p><p>So if your test needs to assert on the created process instance through the webhook response itself, the plain start variant is currently the better fit. I would treat this as current behavior, not as a permanent rule. Camunda may improve that later.</p><h2>Summary</h2><p>If you build validation logic into inbound webhooks, test the webhook itself. Do not bypass the route and then assume the rest will work.</p><p>The setup I would start with is:</p><ul><li><p>start the engine and connector runtime together.</p></li><li><p>deploy the process with the real inbound webhook.</p></li><li><p>wait until the webhook route exists.</p></li><li><p>trigger it through a small HTTP helper.</p></li><li><p>inspect the (optional) response body.</p></li></ul><p>The best practices I would keep are:</p><ul><li><p>keep webhook related calls in a shared base class for others to use.</p></li><li><p>reuse production secret names (not values) in tests.</p></li><li><p>test both accepted and rejected payloads.</p></li><li><p>use the <em>CamundaClient</em> only to reach a waiting state before a webhook callback.</p></li><li><p>if you need the created instance key in the response, prefer the plain start variant for now.</p></li></ul><p>That gives you a practical way to verify the webhook behavior you modeled, not just describe it.</p>]]></content:encoded></item><item><title><![CDATA[Agentic Essentials #1: Agentic Orchestration Basics]]></title><description><![CDATA[How Agentic Orchestration Brings AI To Process Automation]]></description><link>https://blog.itsmestefanjay.dev/p/ai-bpm-the-best-of-both-worlds</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/ai-bpm-the-best-of-both-worlds</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 19 Mar 2026 09:02:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!F337!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg" 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_!F337!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F337!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F337!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F337!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F337!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F337!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg" width="1536" height="804" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:804,&quot;width&quot;:1536,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:451758,&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://theintermediatecatchevent.substack.com/i/190219624?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc36123-94fd-496b-9f74-a369c091d859_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F337!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F337!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F337!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F337!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bac8844-851e-4d64-95c1-971a86d06314_1536x804.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You land after a long flight. At baggage claim, your bag never shows up. You report it and ask a simple question: &#8220;Can you find it and tell me what happens next?&#8221;</p><p>Behind the scenes, it is a mix of predictable steps and messy work. Someone checks tracking systems, waits for replies, asks you for missing details, and keeps you updated. I found the missing-baggage example below in <a href="https://camunda.com/blog/2025/05/agentic-orchestration-automations-next-big-shift/">an early blog post by Camunda&#8217;s CEO Jakob Freund</a>, and it is a good way to picture agentic orchestration.</p><p>This article is a non-technical introduction to agentic orchestration with Camunda. I keep it simple on purpose: no code, no deep platform details, and as little jargon as possible. The goal is to explain the basic idea and why BPM and AI fit together.</p><h2>The Advantages of BPM</h2><p>Business Process Management (BPM) is running work as a defined process. A process engine executes it step by step and keeps it moving.</p><p>Many organizations already use a BPM suite to manage and automate processes. In Camunda, agentic orchestration lets you add AI without replacing that foundation.</p><p>Where you put the AI matters. If it sits outside the process, you lose end-to-end visibility. With agentic orchestration, AI work happens inside the process, so the case history stays complete.</p><p>BPM is great at the things you want to be linear and reliable:</p><ul><li><p>Traceability per case (an &#8220;instance&#8221;).</p></li><li><p>Waiting, timers, and escalation (like a 48-hour handoff).</p></li><li><p>Built-in human review via user tasks.</p></li></ul><h2>The Power of Generative AI</h2><p>A Large Language Model (LLM) is good at working with unstructured information, like free text or documents. It is also useful when a system needs to interpret a situation and decide what to do next.</p><p>In the baggage example, the passenger might write a short description or provide pictures instead of using a form. The LLM can:</p><ul><li><p>Extract key details.</p></li><li><p>Classify information.</p></li><li><p>Find the next best action through reasoning.</p></li><li><p>Draft a clear status update.</p></li></ul><p>But the LLM should only act inside guardrails.</p><p>So the question is not &#8220;BPM or GenAI?&#8221;. The question is how to combine them without losing the advantages of BPM.</p><h2>Agentic Orchestration: The Best Of Both Worlds</h2><p>This is where both parts come together. The BPM engine runs the reliable path, provides guardrails, and keeps the case history. The LLM chooses the next approved task until a solution is reached, or until the process adds a human to the loop.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!92Ga!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!92Ga!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic 424w, https://substackcdn.com/image/fetch/$s_!92Ga!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic 848w, https://substackcdn.com/image/fetch/$s_!92Ga!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic 1272w, https://substackcdn.com/image/fetch/$s_!92Ga!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!92Ga!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic" width="1200" height="445.05494505494505" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:540,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:151502,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/190219624?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic&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_!92Ga!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic 424w, https://substackcdn.com/image/fetch/$s_!92Ga!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic 848w, https://substackcdn.com/image/fetch/$s_!92Ga!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic 1272w, https://substackcdn.com/image/fetch/$s_!92Ga!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542622da-2149-435b-99d2-2fd691b6e542_3411x1266.heic 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Example: A missing-baggage process with an AI loop and human escalation points.</em></figcaption></figure></div><h3>The AI Toolbox And Loop</h3><p>Most cases should still run straight through. The AI loop is for exceptions where a human would normally try a few steps to get unstuck.</p><p>For missing baggage, the AI loop has a clear goal: reach a stable outcome with safe escalation. The engine exposes a toolbox of approved tasks and blocks everything else:</p><ul><li><p>Query tracking database</p></li><li><p>Ask last known airport for confirmation</p></li><li><p>Request more data from passenger</p></li><li><p>Issue voucher</p></li><li><p>Organize delivery</p></li><li><p>Send status update</p></li></ul><p>The loop is simple:</p><ol><li><p>The LLM picks the next best task from the toolbox.</p></li><li><p>The engine validates and runs it, stores the result, and pauses if it must wait.</p></li><li><p>The loop ends when the goal is reached, or escalates when it is not safe.</p></li></ol><p>The engine logs each task call and result, so the work stays visible.</p><h3>Status Messages And Safe Escalation</h3><p>While the AI loop runs, the passenger might ask for updates. In our example, you can send a status message without interrupting the main work. In BPMN, a process diagram language, this is a non-interrupting message boundary event.</p><p>You also define clear &#8220;stop and ask a human&#8221; rules, like:</p><ul><li><p>Low-confidence: the LLM cannot match the bag safely, or the data conflicts.</p></li><li><p>24-hour timer: too much time has passed without progress.</p></li></ul><p>In both cases, BPM creates a user task for a human to review and decide. A reviewer sees what the AI tried, decides what to do next, and the case continues or ends.</p><h3>A Clear End State</h3><p>When the AI loop finishes, BPM makes the outcome explicit:</p><ul><li><p>If the bag is found and delivery is arranged, the case ends.</p></li><li><p>If the bag is not found, BPM routes into a compensation decision and claim handling, or escalates for approval.</p></li></ul><h2>What&#8217;s Next</h2><p>If the basic idea makes sense, do not jump to model choice yet. The first question is whether the problem really needs agentic orchestration at all.</p><p>That is where I go next. I stay with the baggage example and look at what should stay a normal workflow, what fits DMN, and where an agentic step is worth the extra effort.</p>]]></content:encoded></item><item><title><![CDATA[The Last Mile To Production, Part 2]]></title><description><![CDATA[Staging Processes and Connectors Without Breaking the Contract]]></description><link>https://blog.itsmestefanjay.dev/p/the-last-mile-to-production-part-b84</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/the-last-mile-to-production-part-b84</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 12 Mar 2026 09:00:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wCMP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic" 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_!wCMP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wCMP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!wCMP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!wCMP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!wCMP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wCMP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:411407,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/190192413?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wCMP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!wCMP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!wCMP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!wCMP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ac446e0-0b77-4d66-9b08-5d4e6c475ee6_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The Last Mile To Production (AI, 2026)</em></figcaption></figure></div><p>I&#8217;m implementing Camunda 8 at a customer, and the hardest part isn&#8217;t modeling or coding. It&#8217;s keeping acceptance high when changes keep coming.</p><p>In part 1, I introduced compatibility as a contract between models, mappings, and runtime code. But rules on paper are not enough.</p><div><hr></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;c29e9741-80fd-49cb-af29-10ed80bd3263&quot;,&quot;caption&quot;:&quot;I&#8217;m currently implementing Camunda 8 with a customer (great project, learning a lot). Modeling and implementation are the visible parts of the work, and they usually go well. The pain starts when testers expect stability and the system changes under running instances.&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;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;The Last Mile To Production, Part 1&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:332866285,&quot;name&quot;:&quot;Stefan Schultz&quot;,&quot;bio&quot;:&quot;Technologist with 13+ years in agile software development, software architecture and process automation and orchestration.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a35ad2f9-f5cd-4b90-96e7-4c41eec68f99_1167x1164.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-01-22T09:02:34.797Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!zogq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744ecbc6-0460-4929-8789-3249cc9269d0_1536x1024.heic&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://theintermediatecatchevent.substack.com/p/the-last-mile-to-production-part&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:184319988,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:4,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4704919,&quot;publication_name&quot;:&quot;The Intermediate Catch Event&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!ejxI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe3e2488-65e3-4b2b-9f3d-923f2793349c_596x596.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><p>This part is about enforcing compatibility with automation. Our target setup has three pipelines:</p><ul><li><p>A <em>connector</em> pipeline that validates connector code and deploys generated templates to Web Modeler.</p></li><li><p>A <em>runtime</em> pipeline that runs the latest runtime code against deployed models and deploys and tags code if tests are green.</p></li><li><p>A <em>model</em> pipeline that runs the latest models against deployed code and deploys and tags models if tests are green. If it fails, it reruns the tests against the latest runtime code and, if that works, deploys runtime and models together.</p></li></ul><p>We&#8217;re currently in the middle of implementation, in the first stage the pipelines check changes against the latest code or model version. The rest will follow in the next weeks. But the theory behind it is still relevant.</p><h2>Staging Is Where Trust Breaks</h2><p>Most late surprises are not BPMN errors. They are environment and ownership problems. Most common cases are:</p><ul><li><p>the runtime code changed and the model didn&#8217;t adapt</p></li><li><p>the model changed and the runtime code didn&#8217;t adapt</p></li><li><p>connector secrets are not working</p></li></ul><p>If you only have one environment, every deploy is a gamble. If you have staging but people can still patch things in place, you end up with drift and a false sense of safety.</p><p>At the customer, coding and modeling both happen in dev. That keeps one place where new ideas are allowed to break.</p><p>Right now we only run two clusters, dev and prod. That works for now, but it keeps the distance short. You can get away with two clusters, but you still need one place to break things before testing starts. We are thinking about a third clusters:</p><ul><li><p>Dev for fast iteration.</p></li><li><p>Test or QA for integration and business testing.</p></li><li><p>Prod for stable operations.</p></li></ul><p>And we try hard to prevent changes in test and prod. Modeling happens in dev only. In test and prod, Web Modeler access should be limited to admins for analysis, not editing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gMjQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gMjQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic 424w, https://substackcdn.com/image/fetch/$s_!gMjQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic 848w, https://substackcdn.com/image/fetch/$s_!gMjQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic 1272w, https://substackcdn.com/image/fetch/$s_!gMjQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!gMjQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic" width="1456" height="772" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:772,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:216044,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/190192413?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gMjQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic 424w, https://substackcdn.com/image/fetch/$s_!gMjQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic 848w, https://substackcdn.com/image/fetch/$s_!gMjQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic 1272w, https://substackcdn.com/image/fetch/$s_!gMjQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ba99be-fd27-4ff2-b482-483960426146_2411x1279.heic 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Camunda Cluster Setup</em></figcaption></figure></div><p><em>Note: We keep clusters separated by having different stage organizations. Otherwise we&#8217;d need to maintain manual RBAC (resource based access control) rules to prevent access to certain models or cluster. This might change with future releases of Camunda 8 and its API.</em></p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/p/the-last-mile-to-production-part-b84?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading The Intermediate Catch Event! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.itsmestefanjay.dev/p/the-last-mile-to-production-part-b84?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.itsmestefanjay.dev/p/the-last-mile-to-production-part-b84?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><h2>Handle Models and Templates as Artifacts</h2><p>The first shift is treating models like artifacts, not like &#8220;the thing in Web Modeler&#8221;.</p><p>Camunda&#8217;s Web Modeler can sync models into a Git repo. Once they&#8217;re in Git, you can handle them like code:</p><ul><li><p>Version them via commits.</p></li><li><p>Test them in CI.</p></li><li><p>Promote the same model version through stages.</p></li></ul><p>This matters because a BPMN deployment is an artifact. If you redeploy from a different source in each stage, you are not promoting. You are rebuilding.</p><p>The same applies to connector templates. If you generate them in your connector repo, they are already versioned in Git and can be deployed via a pipeline. If you create them in Web Modeler, sync them to Git.</p><h2>Using Pipelines That Catch Breakage</h2><p>Contracts drift unless they&#8217;re checked continuously. For us, process tests are the gate: not unit tests, not &#8220;it compiled&#8221;, but end to end tests that deploy a model, run a realistic path, and assert variables and mappings.</p><p>Like I mentioned in part 1: compatibility breaks in both directions, so the process tests must run in both directions too.</p><h3>Connector Pipeline</h3><p><strong>Trigger</strong>: a code commit in the connector repo.</p><p><strong>Goal</strong>: prove the connector code is valid and the generated templates are valid and safe to publish.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HEYj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HEYj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic 424w, https://substackcdn.com/image/fetch/$s_!HEYj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic 848w, https://substackcdn.com/image/fetch/$s_!HEYj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic 1272w, https://substackcdn.com/image/fetch/$s_!HEYj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!HEYj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic" width="530" height="359.863813229572" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:698,&quot;width&quot;:1028,&quot;resizeWidth&quot;:530,&quot;bytes&quot;:37302,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/190192413?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HEYj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic 424w, https://substackcdn.com/image/fetch/$s_!HEYj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic 848w, https://substackcdn.com/image/fetch/$s_!HEYj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic 1272w, https://substackcdn.com/image/fetch/$s_!HEYj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf7e9e98-ccbc-4aac-8c31-aa517dd59873_1028x698.heic 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Connector Pipeline: New Connector and Template</figcaption></figure></div><p>High Level Steps:</p><ul><li><p>Check out the latest code.</p></li><li><p>Run unit tests.</p></li><li><p>Generate connector templates.</p></li><li><p>Copy generated connector templates to Web Modeler.</p></li><li><p>Publish them to a project or organization.</p></li></ul><p>If you model templates directly in Web Modeler instead of generating them from code, they belong to the model&#8217;s lifecycle and should be handled by the model pipeline.</p><h3>Runtime Pipeline</h3><p><strong>Trigger</strong>: a code commit in the runtime repo (worker updates, connector updates, connector runtime config).</p><p><strong>Goal</strong>: prove that new code is compatible with what is already deployed in the target stage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BsT6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BsT6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic 424w, https://substackcdn.com/image/fetch/$s_!BsT6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic 848w, https://substackcdn.com/image/fetch/$s_!BsT6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic 1272w, https://substackcdn.com/image/fetch/$s_!BsT6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!BsT6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic" width="544" height="360.46355140186915" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:709,&quot;width&quot;:1070,&quot;resizeWidth&quot;:544,&quot;bytes&quot;:57656,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/190192413?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BsT6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic 424w, https://substackcdn.com/image/fetch/$s_!BsT6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic 848w, https://substackcdn.com/image/fetch/$s_!BsT6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic 1272w, https://substackcdn.com/image/fetch/$s_!BsT6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b5d7192-3f27-41f4-9428-86f862f16e01_1070x709.heic 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Runtime Pipeline: New Code Against Deployed Models</em></figcaption></figure></div><p>High level steps:</p><ul><li><p>Check out the <strong>deployed</strong> model baseline for that stage.</p></li><li><p>Deploy those models into your test engine (Camunda offers an in-memory engine for that).</p></li><li><p>Start the current runtime with your changes.</p></li><li><p>Run process tests.</p></li></ul><p>If this fails, do not deploy the runtime. The new code is not compatible with the models deployed in that stage. You need updated models now, and that handoff goes to the model pipeline.</p><p>In the full setup, if this succeeds, deploy the runtime to the next stage and update the runtime stage tag.</p><h3>Model Pipeline</h3><p><strong>Trigger</strong>: a commit in the model repo, usually from Web Modeler sync.</p><p><strong>Goal</strong>: prove that new models are compatible with the runtime currently deployed in the target stage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sHyU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sHyU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic 424w, https://substackcdn.com/image/fetch/$s_!sHyU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic 848w, https://substackcdn.com/image/fetch/$s_!sHyU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic 1272w, https://substackcdn.com/image/fetch/$s_!sHyU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!sHyU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic" width="691" height="360.39224137931035" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:726,&quot;width&quot;:1392,&quot;resizeWidth&quot;:691,&quot;bytes&quot;:71830,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/190192413?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sHyU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic 424w, https://substackcdn.com/image/fetch/$s_!sHyU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic 848w, https://substackcdn.com/image/fetch/$s_!sHyU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic 1272w, https://substackcdn.com/image/fetch/$s_!sHyU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9602a5-7727-46f9-94ff-396a93ff9017_1392x726.heic 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Model Pipeline: New Models Against Deployed and Latest Runtime</em></figcaption></figure></div><p>High level steps:</p><ul><li><p>Check out the <strong>deployed</strong> runtime baseline for that stage.</p></li><li><p>Deploy the new models into your test engine.</p></li><li><p>Keep the runtime version pinned to the deployed baseline.</p></li><li><p>Run the same process tests against that setup.</p></li></ul><p>In the full setup, if the first test succeeds, deploy the models to the next stage and update the model stage tag.</p><p>If this fails, the model change is breaking against the deployed runtime. Do one additional step:</p><ul><li><p>Check out the <strong>latest</strong> runtime baseline for that stage.</p></li><li><p>Deploy the new models into your test engine.</p></li><li><p>Run the same process tests again, this time against the latest runtime code.</p></li></ul><p>If the second test succeeds, you now have a compatible pair. In the full setup, deploy the runtime and models together and update both stage tags in one combined deployment.</p><p>If this still fails, there are real errors left to fix. Either the runtime change needs adjustment, the model change needs adjustment, or a migration step is missing.</p><h2>What Process Tests Need To Cover</h2><p>The tests do not need to be huge. They need to be intentional and run against the real runtime.</p><p>At the customer, process tests run against the actual workers and connectors. We usually mock downstream services to force edge cases.</p><p>For each critical process, we aim for:</p><ul><li><p>A realistic happy path with stable test data.</p></li><li><p>Edge cases that tend to break in production (missing fields, unexpected status codes, timeouts, rate limits).</p></li><li><p>Expected failure paths that prove retry and incident behavior.</p></li><li><p>Coverage for all relevant paths, not only &#8220;the process ended&#8221;.</p></li><li><p>Assertions on variable shape at key boundaries, not only outcomes.</p></li></ul><p>Testing out of the box connectors is harder. The Camunda testing framework does not cover every scenario yet, so you may need extra harness code.</p><p>This is where staging helps. If you run tests only in dev, you miss the things that break in real clusters. If you run them in test or QA, you catch drift earlier.</p><h2>Promotion And Tagging Strategy</h2><p>Once the relevant pipeline is green, promotion should be easy. Today that still involves manual glue. The target is to move the same proven artifacts from dev to the next stage.</p><p>We are in the middle of building that full promotion flow. Prod is different. We do not deploy to prod continuously. Production deployment is planned and manual.</p><p>To keep this honest, you need to know what is running where. That is why stage tags matter, even if the full flow is still being built.</p><p>In the target setup, after a successful deployment, the responsible pipeline updates the stage tag. For a combined deployment, both tags move together. Then every compatibility pipeline can resolve <em>refs/tags/latest-test</em> to a specific revision and test against it.</p><p>This also helps during incidents. When test fails, you can answer quickly: did we change the model, the runtime, or both.</p><p>Of course a detailed branching strategy is also possible, if you&#8217;re not into using Git tags. You can use whatever helps pinning deployed versions down. </p><h2>TL;DR</h2><p>Staging is not overhead. It&#8217;s the price of predictable acceptance.</p><ul><li><p>Treat models as artifacts and promote the same versions through all stages.</p></li><li><p>Use Camunda process tests as the compatibility gate, and run them in both directions, and against different baselines.</p></li><li><p>Prevent drift between connector code and element template by generating your templates and publishing them to the Web Modeler for everyone to use.</p></li><li><p>Tag deployed versions per stage so everyone knows what is running where.</p></li><li><p>Lock down access to test and prod so trust does not decay through drift.</p></li></ul><p>If you already do some of this, pick one gap and close it this week. A single stage tag and one process test can already make acceptance feel less random.</p>]]></content:encoded></item><item><title><![CDATA[Intentional Retries In Camunda Connectors]]></title><description><![CDATA[Classify Errors So Retries Make Sense]]></description><link>https://blog.itsmestefanjay.dev/p/deliberate-retries-in-camunda-connectors</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/deliberate-retries-in-camunda-connectors</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 05 Mar 2026 09:00:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dHlR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic" 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_!dHlR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dHlR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!dHlR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!dHlR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!dHlR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dHlR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:652124,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/189359274?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dHlR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!dHlR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!dHlR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!dHlR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397fccf-6c2b-48b3-94b2-d12593d78005_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Embroidering (AI, 2026)</figcaption></figure></div><p>If you build Camunda connectors long enough, you stop thinking about the happy path. You start thinking about rate limits, flaky networks, and APIs that return the same error for five different root causes. That&#8217;s where retry logic in a connector becomes part of the connector design.</p><p>The tricky part is that retries are not automatic. In Camunda, an outbound connector runs as a job in the connector runtime. You can configure retries (and retry backoff) on the BPMN service task in Camunda Modeler, but the connector still needs to tell the Camunda engine when a failure is retryable. If you throw the wrong exception type from the Camunda Connector SDK, the engine won&#8217;t retry. In the worst case, you&#8217;ll see retries get set to 0 and your activity level retry settings are ignored for that failure path. The message of this post is simple: know your errors and act accordingly.</p><p>I&#8217;ll use a small REST API example where the connector gets a rate limit response. Of course, Java technologies like WebFlux <em>WebClient</em> can be wrapped with client side retries, but for this article I want the Camunda engine to retry (including backoff) so the behavior is visible in Operate and consistent across connectors.</p><h2>Why Retries Matter</h2><p>Imagine that your Camunda connector calls an external REST API. Most of the time, it works. Sometimes, the API rate limits you and returns something like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;4a0290af-9391-4f4b-889b-6f80ba9e0c53&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">HTTP/1.1 429 Too Many Requests
Content-Type: application/json; charset=utf-8
Retry-After: 30
X-Request-Id: 049c9564-e6c7-7bc3-8a47-d955de067599

{
  "id": "019c9f14-b575-722b-a0c2-f1ac5834faef",
  "error": "Too Many Requests",
  "message": "Rate limit exceeded.",
  "timestamp": "2026-02-27T12:34:26Z"
}</code></pre></div><p>If you fail fast with a non retry-able error, you create incidents for something that would have resolved itself in 30 seconds.</p><p>That is the key difference between a good connector and a noisy connector. A good connector turns transient failures into retries and permanent failures into clear incidents in Camunda Operate.</p><h2>Force The Camunda Engine To Retry</h2><p>The Camunda engine can only apply the retry configuration when the connector tells it that a task is retry-able. Otherwise it can end up creating an incident even though you configured retries. </p><p>For connectors this makes sense: a low-code modeler can set max retries and backoff on the BPMN task, but they usually don&#8217;t know how the connector is implemented. They can define the frame, but the connector decides whether it&#8217;s applied. The connector runtime sees the HTTP status, response body, and Java exception types, so it is the only place that can reliably decide between &#8220;try again later&#8221; and &#8220;this will never work&#8221;. With job workers, the situation is often different. A technical team usually implements the worker, wires the variables, and owns the activity configuration, so retry behavior is part of the worker contract. That is why connector retries need an explicit error classification policy inside the connector code.</p><p>In the Camunda Connector SDK for Java, that signal is a <em>ConnectorRetryException</em> (created via <em>ConnectorRetryExceptionBuilder</em>). If you throw a generic exception or a plain <em>ConnectorException</em>, the connector runtime treats it as non retry-able and the task level retry settings are effectively ignored for that failure path.</p><p>As soon as you throw <em>ConnectorRetryException</em>, the retry configuration on the task becomes active. You do not need to encode &#8220;retry three times&#8221; into the exception. The task already knows how many retries and what backoff it should use.</p><h2>Classify Errors And Exceptions</h2><p>Start with a small classification table. Keep it intentionally boring. HTTP status codes are a good starting point, but also exceptions from underlying libraries:</p><p><strong>Retryable</strong></p><ul><li><p>Rate limits (<em>HTTP 429</em>)</p></li><li><p>Some server errors (like temporary errors: <em>HTTP 502, 503 or 504</em>)</p></li><li><p>Timeouts (<em>SocketTimeoutException</em>)</p></li><li><p>Temporary network failures (<em>UnknownHostException</em>, <em>ConnectException</em>)</p></li><li><p>etc.</p></li></ul><p><strong>Non retryable</strong></p><ul><li><p>Authentication and Authorization (<em>HTTP 401, HTTP 403</em>)</p></li><li><p>Invalid input (<em>HTTP 400</em>)</p></li><li><p>Missing resources (<em>HTTP 404</em>)</p></li><li><p>Some server errors (like an unspecific <em>HTTP 500</em>)</p></li><li><p>Most other <em>HTTP 4xx</em> responses, unless you have a clear reason to retry</p></li></ul><h2>Code Examples</h2><p>This example shows one Camunda outbound connector function that calls a REST API and throws either <em>ConnectorException</em> (non retryable) or <em>ConnectorRetryException</em> (retryable). These exception types come from the Camunda Connector SDK. The important part is the mapping, not the HTTP client details.</p><h3>Non Retryable: 401 Unauthorized</h3><p>If credentials are wrong, retries won&#8217;t fix it. Fail fast with a clear error message and keep the root cause.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;4d97f9a7-ff10-478e-91bb-5e96eaba4764&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">public CustomerResponse fetchCustomer(String customerId) {
  try {
    return webClient
        .get()
        .uri("/customers/{id}", customerId)
        .retrieve()
        .bodyToMono(CustomerResponse.class)
        .block();
  } catch (WebClientResponseException.Unauthorized e) {
    throw new ConnectorRetryExceptionBuilder()
        .message("API request failed: not authorized (401)")
        .errorCode("UNAUTHORIZED")
        .cause(e)
        .retries(0)
        .build();
  }
}</code></pre></div><h3>Retryable: 429 Too Many Requests</h3><p>If you get rate limited, throw <code>ConnectorRetryException</code>. This activates the retry configuration on the task.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;fb9b093a-8f95-4f44-8377-3a41e828430d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">public CustomerResponse fetchCustomer(String customerId) {
  try {
    return webClient
        .get()
        .uri("/customers/{id}", customerId)
        .retrieve()
        .bodyToMono(CustomerResponse.class)
        .block();
  } catch (WebClientResponseException.TooManyRequests e) {
    throw new ConnectorRetryExceptionBuilder()
        .message("API rate limited us (429). Please retry.")
        .errorCode("RATE_LIMIT")
        .build();
  }
}</code></pre></div><h3>Advanced: Retry-After And Backoff</h3><p>Many APIs return a<em> Retry-After</em> header with status <em>429</em>. If you have it, you can use it as a retry backoff candidate for the next attempt. You still rely on the task retry configuration for the overall retry behavior, but this gives the Camunda engine a better starting point for the next retry.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;45e92a9c-2a9e-4628-b5dc-b2ff44f5ec20&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">} catch (WebClientResponseException.TooManyRequests e) {
  Duration retryAfter = parseRetryAfterHeader(e.getHeaders()); // example helper

  ConnectorRetryExceptionBuilder builder = new ConnectorRetryExceptionBuilder()
      .message("API rate limited us (429). Please retry.")
      .errorCode("RATE_LIMIT");

  if (retryAfter != null) {
    builder.backoffDuration(retryAfter);
  }

  throw builder.build();
}</code></pre></div><h2>Some Additional Notes</h2><p>These are a few advanced topics that often come up once a connector runs under real load. They help you prevent new failure modes while you add retries.</p><ul><li><p>Pick <strong>one</strong> retry layer. Mixing e.g. WebFlux retries and Camunda engine retries is usually a bad idea because you multiply calls and make backoff unpredictable.</p></li><li><p>Think about <strong>idempotence</strong>. Retrying a &#8220;send mail&#8221; connector can send the same mail twice if you retry the wrong failure. If the operation has side effects, you either need idempotency keys, deduplication, or a very strict retry policy.</p></li><li><p>Always keep the root cause. Whatever you throw should include the original exception as the cause. It will show up in Operate, and someone needs to understand what actually went wrong.</p></li></ul><h2>Key Takeaways</h2><ul><li><p>The Camunda engine retries only when you throw <em>ConnectorRetryException</em>.</p></li><li><p>If you want to create an incident right away, set retries to <em>0</em>.</p></li><li><p>Model retries and backoff live on the BPMN service task, not in your code.</p></li><li><p>Classify exceptions as non retryable and retryable.</p></li><li><p>Honor meta information like <em>Retry-After</em> as a backoff hint when you get it.</p></li><li><p>Don&#8217;t mix client side retries with Camunda engine retries.</p></li><li><p>Retry only idempotent operations, or make them idempotent.</p></li><li><p>Always attach the root cause so Camunda Operate shows what happened.</p></li></ul>]]></content:encoded></item><item><title><![CDATA[An Introduction to Camunda's Message Sending Connector]]></title><description><![CDATA[Publish Messages Without A Custom Worker]]></description><link>https://blog.itsmestefanjay.dev/p/an-introduction-to-camundas-message</link><guid isPermaLink="false">https://blog.itsmestefanjay.dev/p/an-introduction-to-camundas-message</guid><dc:creator><![CDATA[Stefan Schultz]]></dc:creator><pubDate>Thu, 26 Feb 2026 11:03:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!OY7P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic" 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_!OY7P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OY7P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!OY7P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!OY7P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!OY7P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OY7P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:567245,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/189238141?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OY7P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!OY7P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!OY7P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!OY7P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F156c5092-9172-473c-9cad-da2d199d8957_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>A Message Finds Its Way (AI, 2026)</em></figcaption></figure></div><p>Imagine you are waiting for a text message with a one-time code. You cannot log in without it. And it is not just any code. It is your code, for your login attempt.</p><p>In Camunda, that is a message. Your process instance waits, and something has to publish the message that wakes it up. The boring part is that you often end up writing the same tiny &#8220;publish a message&#8221; worker again and again.</p><p>This post is about avoiding that work. With the Message Sending Connector, you can use the connector runtime to publish messages for you. You only configure message name, correlation key, and payload mapping. No custom worker code for every new message.</p><h2>When A Process Waits For A Message</h2><p>Let&#8217;s use a simple example. An order process reserves stock, then waits for a payment confirmation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y5zU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y5zU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!y5zU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!y5zU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!y5zU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y5zU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic" width="1456" height="708" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:708,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50056,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/189238141?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!y5zU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!y5zU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!y5zU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!y5zU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fa521f3-77d8-4090-aa2b-2179dcfbc049_2220x1080.heic 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>A process waiting for a message</em></figcaption></figure></div><p>In BPMN, that waiting point is e.g. an intermediate message catch event. It means: &#8220;wait here until a message arrives.&#8221;</p><p>Many instances can be running and waiting for the same message name. So we need a way to make sure the right message wakes up the right instance.</p><p><em>Note: Message correlation also matters in other places, like message start or boundary events. The matching idea is the same. I use the intermediate catch example because it makes the &#8220;waiting instance&#8221; easy to picture.</em></p><h2>A Quick Intro to Correlation</h2><h3>The Three Pieces: Subscription, Message, Match</h3><p>When a process instance reaches an intermediate message catch event, it creates a subscription in the engine. The subscription is like a note pinned on the wall:</p><ul><li><p>Message name: what the instance is waiting for (for example, <code>PaymentReceived</code>)</p></li><li><p>Correlation key: which instance it is meant for (for example, the <code>orderId</code>)</p></li></ul><p>An incoming message has the same two fields, plus optional payload data (variables).</p><p>Now the engine correlates:</p><ol><li><p>Find subscriptions with the same message name.</p></li><li><p>Compare the correlation key on those subscriptions with the correlation key on the incoming message.</p></li><li><p>If there is a match, continue that instance.</p></li></ol><p>If the message arrives too early, Camunda can buffer it for a limited time and correlate it later when the instance reaches the waiting point.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X4g3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X4g3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic 424w, https://substackcdn.com/image/fetch/$s_!X4g3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic 848w, https://substackcdn.com/image/fetch/$s_!X4g3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic 1272w, https://substackcdn.com/image/fetch/$s_!X4g3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!X4g3!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic" width="1200" height="391.4835164835165" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:138716,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/189238141?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic&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_!X4g3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic 424w, https://substackcdn.com/image/fetch/$s_!X4g3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic 848w, https://substackcdn.com/image/fetch/$s_!X4g3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic 1272w, https://substackcdn.com/image/fetch/$s_!X4g3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64c0637f-e435-4a00-bc73-cb3682619fdf_3543x1157.heic 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Two waiting instances, one incoming message, one match</em></figcaption></figure></div><p>The correlation key is the address of the message.</p><p>A correlation key is usually something you already have in the business:</p><ul><li><p>Order id</p></li><li><p>Claim id</p></li></ul><p>The key should be stable and specific. If two instances could share the same key, it is not specific enough.</p><h2>Before The Connector: A Custom Worker Every Time</h2><p>Imagine you want to send a message to another process. This can be an intermediate throw and catch event, or even a message end event.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cSXR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cSXR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic 424w, https://substackcdn.com/image/fetch/$s_!cSXR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic 848w, https://substackcdn.com/image/fetch/$s_!cSXR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic 1272w, https://substackcdn.com/image/fetch/$s_!cSXR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!cSXR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic" width="1456" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:42932,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://theintermediatecatchevent.substack.com/i/189238141?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cSXR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic 424w, https://substackcdn.com/image/fetch/$s_!cSXR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic 848w, https://substackcdn.com/image/fetch/$s_!cSXR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic 1272w, https://substackcdn.com/image/fetch/$s_!cSXR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc371f8-a2aa-4d34-b5d7-1a2dc6257618_2070x1119.heic 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Messages sending in the model</figcaption></figure></div><p>Typically, that means a small job worker that publishes the message, since the engine only waits for the external trigger. It is rarely hard, but it is repetitive. <strong>Both</strong> send events have to be implemented.</p><p>It sounds small, and it often is. But it comes with real work:</p><ul><li><p>Credentials and environment configuration</p></li><li><p>Mapping and validation (what if the <em>orderId</em> is missing?)</p></li><li><p>Retries and operations (logs, monitoring)</p></li></ul><p>And you repeat it for every process that needs message based waiting.</p><p>Here is what &#8220;publish a message&#8221; can look like in code. It can feel too small to deserve its own worker:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;03113772-3287-49c9-8c3a-d26127cf8c86&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">client.newPublishMessageCommand()
  .messageName("PaymentReceived")
  .correlationKey(orderId)
  .variables(Map.of("paymentId", paymentId))
  .send().join();</code></pre></div><p>It is straightforward. But &#8220;straightforward&#8221; still means code to write, deploy, and run.</p><p>And if you have more than one process waiting for messages, you repeat the same pattern. Each new message tends to create another &#8220;small worker&#8221;, another deployment, another thing to operate.</p><h2>After The Connector: Use The Runtime</h2><p>The Message Sending Connector is an outbound connector that publishes a message for you. Instead of implementing message publishing as code, you model a step and configure it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_Xx-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_Xx-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_Xx-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_Xx-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_Xx-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!_Xx-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg" width="1102" height="1115" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1115,&quot;width&quot;:1102,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:117175,&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://theintermediatecatchevent.substack.com/i/189238141?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c60efb-aeab-4349-b019-5bb5d37f45a6_1108x1276.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_Xx-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_Xx-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_Xx-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_Xx-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198dfc1b-219c-4dcd-a41f-e3f06d93d5a0_1102x1115.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Modeler UI for the connector</em></figcaption></figure></div><p>The key idea is simple: you stop rebuilding the &#8220;publish a message&#8221; runtime. You use the one you already have, if you run connectors.</p><p>It is also a nice companion to the inbound Webhook Connector. Webhooks bring events into the engine. This connector helps you send events inside the engine for inter-process communication.</p><h3>What You Configure</h3><p>At a high level, you configure three things:</p><ul><li><p>Message name</p></li><li><p>Correlation key</p></li><li><p>Variables (payload mapping)</p></li></ul><p>You still need to understand correlation. The connector cannot guess the right key for you. But it removes the repeated implementation work.</p><h3>What The Runtime Gives You</h3><p>The connector runtime gives you the operational basics you usually have to rebuild in custom code:</p><ul><li><p>Auth and connectivity to the engine</p></li><li><p>Retries and Idempotence (via message id)</p></li><li><p>A standard place to configure and change the mapping</p></li></ul><p>If you are teaching a process to talk to another process, or sending a &#8220;ping&#8221; back into a waiting instance, this connector removes a lot of friction. Your BPMN model shows clearly where the message gets published, and your runtime stays smaller.</p><h2>Summary</h2><ul><li><p>Message correlation matches a message name and correlation key to a waiting subscription.</p></li><li><p>Before the connector, teams often implement message publishing as a small custom worker, over and over again.</p></li><li><p>With the Message Sending Connector, you configure publishing and reuse the connector runtime instead of writing worker code each time.</p></li></ul>]]></content:encoded></item></channel></rss>