<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Piotr Paradiuk</title>
    <description>The latest articles on DEV Community by Piotr Paradiuk (@piotrdiuk).</description>
    <link>https://dev.to/piotrdiuk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3397488%2Fff9ef875-15b9-4df2-a842-8ce8816a10cd.jpg</url>
      <title>DEV Community: Piotr Paradiuk</title>
      <link>https://dev.to/piotrdiuk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/piotrdiuk"/>
    <language>en</language>
    <item>
      <title>Scaling Local Automations Without Losing Control</title>
      <dc:creator>Piotr Paradiuk</dc:creator>
      <pubDate>Thu, 07 Aug 2025 11:51:39 +0000</pubDate>
      <link>https://dev.to/piotrdiuk/scaling-local-automations-without-losing-control-5e10</link>
      <guid>https://dev.to/piotrdiuk/scaling-local-automations-without-losing-control-5e10</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Automation systems must choose a mutability and control model.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Loose models are fast and flexible, but can override user intent and burn compute quickly under load.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are semi-controlled alternatives that maintain intent and respect platform boundaries.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;In this post, I explore the design of an automation engine — specifically one focused on operating on local entities.&lt;/p&gt;

&lt;p&gt;The goal is to examine how different architectural choices affect &lt;strong&gt;user control, execution integrity,&lt;/strong&gt; and &lt;strong&gt;system performance&lt;/strong&gt; —especially under scale.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Automation Gold Rush
&lt;/h1&gt;

&lt;p&gt;We’re in the middle of an &lt;strong&gt;automation gold rush&lt;/strong&gt;—or as I called it in &lt;a href="https://dev.to/piotrdiuk/automation-at-scale-why-one-item-at-a-time-is-breaking-down-1j2n"&gt;Automation at Scale: Why ‘One Item at a Time’ Is Breaking Down&lt;/a&gt;, the &lt;em&gt;automation computation race.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Platforms like &lt;strong&gt;Zapier&lt;/strong&gt;, &lt;strong&gt;Make&lt;/strong&gt;, &lt;strong&gt;Monday.com&lt;/strong&gt;, and others are battling it out to win users with the promise of ever more automation tokens—executions per month. The result? An escalating optimization race, where new players must offer &lt;strong&gt;tens of thousands of automations per plan&lt;/strong&gt; just to be competitive.&lt;/p&gt;

&lt;p&gt;Some platforms are already falling behind. Take &lt;strong&gt;ClickUp&lt;/strong&gt;, for example—its non-enterprise plans offer under 1-5k automation runs per month, while &lt;strong&gt;Monday.com&lt;/strong&gt; offers 25,000 at a similar price point. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjkf94jd61iqn42ti7t0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjkf94jd61iqn42ti7t0c.png" alt="Automation cap comparison"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s great for customers — scale has never been more accessible. &lt;/p&gt;

&lt;p&gt;For developers and platform architects, it means rising pressure to build &lt;strong&gt;smarter engines, more efficient schedulers&lt;/strong&gt;, and &lt;strong&gt;cost-aware infrastructure&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope and Framing Matter
&lt;/h2&gt;

&lt;p&gt;When designing systems, there’s a trap we all fall into: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Trying to solve everything at once — retries, APIs, audit logs, cross-region state, failovers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those all matter — but not at the start.&lt;/p&gt;

&lt;p&gt;Think of the system like a massive whiteboard that doesn’t fit on one screen. To make progress, you need a &lt;strong&gt;minimap&lt;/strong&gt;—a way to zoom in on the part that matters right now, without getting distracted by everything else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfgll0cxt8u7ma1883ww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfgll0cxt8u7ma1883ww.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this post, we’ll focus on one specific layer of the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A self-contained, local-only automation engine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Built to resolve conflicts between users and automations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Designed to scale up cleanly — not get tangled in global queues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;External triggers? Future work. We're zoomed in for now.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fast Track vs. Slow Track
&lt;/h2&gt;

&lt;p&gt;From the start, we’ve drawn a clear line between local and external executions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3ecfcir7c2nuzw0h415.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3ecfcir7c2nuzw0h415.png" alt="Slow vs Fast track"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This distinction isn't just technical—it's philosophical.&lt;/p&gt;

&lt;p&gt;External executions come with significant overhead: failover policies, authentication layers, networking dependencies, rate limiting, retries, monitoring, and more. Designing them well requires a different focus.&lt;/p&gt;

&lt;p&gt;In contrast, local executions are where the platform has full control: integrity is managed by the domain model itself, latency is minimal, and automation can provide immediate feedback to the user. These are the "fast track" paths — our focus.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Even if we later support external actions, the kernel should still operate independently — as a self-contained engine inside the platform.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Designing the Kernel
&lt;/h1&gt;

&lt;p&gt;Let’s zoom in on &lt;strong&gt;the kernel&lt;/strong&gt; — the beating heart of the system. &lt;br&gt;
It listens for changes, matches relevant automations, and applies them safely.&lt;/p&gt;

&lt;p&gt;It assumes that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Both users and automations can mutate the same item.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;These mutations may overlap or conflict.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Our job is to resolve that gracefully, without external queues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's sketch a conceptual draft:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2u3ejzo5r9qoomrvc9s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2u3ejzo5r9qoomrvc9s.png" alt="kernel sketch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The highlighted section (in red) shows the primary “blood flow” of our automation engine.&lt;/p&gt;

&lt;p&gt;Execution starts with a change — from the UI or an automation. A trigger listener catches it and hands it to the engine.&lt;/p&gt;

&lt;p&gt;The engine finds matching automations and creates intents — lightweight plans for what will happen. These don't run right away. A scheduler steps in to merge, deduplicate, and throttle them in a short time window. This smooths out bursts and avoids waste.&lt;/p&gt;

&lt;p&gt;Once ready, each intent goes through a state manager, which compares it to the current state. If the change is valid, it’s committed to local storage.&lt;/p&gt;

&lt;p&gt;This is our execution core.&lt;/p&gt;

&lt;p&gt;Here’s how this flow looks in action, using a CodePen demo:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/piotrdiuk/embed/PwPjwOv?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  Three Control Models
&lt;/h1&gt;

&lt;p&gt;To further ground this discussion, let’s use the example of Monday.com, a task management system where automations revolve around “items” (essentially structured tasks). Think of items as interactive graph nodes for users: they carry state, history, and serve as the control points of the system.&lt;/p&gt;

&lt;p&gt;We can imagine three models for how Monday-like automation might behave:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. High-control&lt;/strong&gt; – A strict, deterministic model where automation executions are immutable once started. Think: banking transactions. If a transfer begins, its execution path is locked—even if the automation definition changes later. The old run follows the old logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Loose-control&lt;/strong&gt; – Automations simply mimic user actions. Everything is mutable. If two automations change the same item at the same time, the system doesn’t enforce order or consistency. Power and responsibility lie entirely with the user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Semi-control&lt;/strong&gt; – A hybrid. Some operations compete and override each other. Others are locked or atomic. The user can choose which logic to enforce where.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkavgohoak5g4q2txav7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkavgohoak5g4q2txav7v.png" alt="Control scenarios"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's worth considering: which of these models best fits real-world use? And how would the answer change if we scoped it to only local, fast-path operations?&lt;/p&gt;

&lt;h2&gt;
  
  
  What Monday.com Actually Does
&lt;/h2&gt;

&lt;p&gt;Monday.com today leans toward Loose-control.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://support.monday.com/hc/en-us/articles/360001222900-Get-started-with-monday-automations" rel="noopener noreferrer"&gt;Automations&lt;/a&gt; (available on all plans)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://support.monday.com/hc/en-us/articles/14127956326290-What-is-the-workflow-builder" rel="noopener noreferrer"&gt;Workflow Builder&lt;/a&gt;(available only in Enterprise plan)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These tools look similar conceptually, but they differ in execution design. I’ve written a deeper breakdown in &lt;a href="https://dev.to/piotrdiuk/the-product-tension-between-automations-and-workflows-in-mondaycom-3if5"&gt;The Product Tension Between Automations and Workflows in Monday.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Key difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Automations run per-item, with an execution delay of ~1–2 seconds - as documented in &lt;a href="https://dev.to/piotrdiuk/infinite-cycles-in-mondaycom-automations-51kp"&gt;Infinite Cycles in Monday.com Automations&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Workflow Builder executes broader item flows from start to finish.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why the Delay Exists?
&lt;/h2&gt;

&lt;p&gt;Because the system is highly mutable — like a shared task list where multiple agents can reorder or change the status of any item at any time.&lt;/p&gt;

&lt;p&gt;Each agent (automation or user) is allowed to queue an action. Automation actions are throttled and delayed, typically executing after ~1-2 seconds. &lt;/p&gt;

&lt;p&gt;Some changes overwrite previous ones (e.g. setting status to “Done” replaces “Stuck”). Other changes add up, like moving a task repeatedly.&lt;/p&gt;

&lt;p&gt;As a consequence, no one has absolute control — all changes are respected, just not immediately. &lt;/p&gt;

&lt;p&gt;This makes the system intuitive for users — changes feel like they’re "live".&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/piotrdiuk/embed/EaVmRyO?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In this model, in case of conflict resolution - last action wins. That’s reasonable when all actions represent clear intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Real-World Conflict Example
&lt;/h2&gt;

&lt;p&gt;Let’s say we've got an automated scenario with the following flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If status is &lt;strong&gt;New&lt;/strong&gt;, change it to &lt;strong&gt;Working on it&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;If status is &lt;strong&gt;Working on it&lt;/strong&gt;, change it to &lt;strong&gt;Testing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;If status is &lt;strong&gt;Testing&lt;/strong&gt;, change it to &lt;strong&gt;Stuck&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But what if someone marks it “Done” manually during step 2?&lt;br&gt;&lt;br&gt;
It gets overridden. That creates confusion, especially when automation volume increases.&lt;/p&gt;

&lt;p&gt;This is where loose-control systems show their limits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvbdsmgpb4lza7mh3r10.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvbdsmgpb4lza7mh3r10.gif" alt="automation cycle"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see the override clearly in the activity log:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsoftbnpryuwcgbmye33g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsoftbnpryuwcgbmye33g.png" alt="Activity log"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; once an automation starts, the trigger cascade finishes even if you try to step in.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where Loose Control Breaks Down
&lt;/h2&gt;

&lt;p&gt;The loose model breaks down in two key cases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Control workflows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think of something like &lt;strong&gt;user onboarding&lt;/strong&gt;. Once a task starts, you don’t want updates to interfere with it. The flow must be protected—locked or isolated—until it completes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Execution caps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s say our plan includes only 1,000 automation runs per month. If the automations fire instantly—reacting to every user action — they can burn through that quota surprisingly fast.&lt;/p&gt;

&lt;p&gt;In highly mutable systems, where both users and automations can update the same entity rapidly, it’s worth considering scheduling - as a way to preserve intent and avoid waste.&lt;/p&gt;
&lt;h2&gt;
  
  
  Toward a Semi-Control Model
&lt;/h2&gt;

&lt;p&gt;Let’s evolve the kernel. In a semi-control model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We add an &lt;code&gt;isLocked&lt;/code&gt; flag to key automations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When triggered, the item becomes read-only to users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A lock icon appears to explain why.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once automation completes, the lock is lifted.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/piotrdiuk/embed/bNVWKOa?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The semi-control scenario allows us to go further:&lt;/p&gt;

&lt;p&gt;Not all automations need to run immediately. Locking intentionally can help us optimize performance.&lt;/p&gt;

&lt;p&gt;For example, if we're 90% into our quota, we can slow execution, delay triggers, or group updates into a batch — as explored in &lt;a href="https://dev.to/piotrdiuk/automation-at-scale-why-one-item-at-a-time-is-breaking-down-1j2n"&gt;Automation at Scale: Why ‘One Item at a Time’ Is Breaking Down&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In such cases, we can intentionally slow down execution — stretching it from 1–2 seconds to longer intervals — or even allow users to choose between real-time and scheduled execution.&lt;/p&gt;

&lt;p&gt;This saves compute without breaking logic.&lt;/p&gt;

&lt;h1&gt;
  
  
  Wrapping Up
&lt;/h1&gt;

&lt;p&gt;I hope this was a fun and hands-on way to explore the automation design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; We don’t need to solve for every edge case on day one.&lt;/p&gt;

&lt;p&gt;Start with fast, local flows. Pick the right control model. Respect user intent.&lt;/p&gt;

&lt;p&gt;Imagine if RFCs for platforms came with playful, interactive design snippets like these—not just showing what the system should do, but why it behaves the way it does.&lt;/p&gt;

&lt;p&gt;Who knows - Maybe the next gen of RFCs won’t just explain systems — they’ll let us experience them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Local-first kernels keep systems responsive and predictable.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Semi-control gives us both speed and safety.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Intent-driven scheduling reduces wasted work.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The right control model is a balance — not too rigid, and not too loose.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>automation</category>
      <category>systemdesign</category>
      <category>platformengineering</category>
      <category>productmanagement</category>
    </item>
    <item>
      <title>The Product Tension Between Automations and Workflows in Monday.com</title>
      <dc:creator>Piotr Paradiuk</dc:creator>
      <pubDate>Thu, 07 Aug 2025 11:44:04 +0000</pubDate>
      <link>https://dev.to/piotrdiuk/the-product-tension-between-automations-and-workflows-in-mondaycom-3if5</link>
      <guid>https://dev.to/piotrdiuk/the-product-tension-between-automations-and-workflows-in-mondaycom-3if5</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Monday.com Automations are perfect for simple tasks, but not built for full logic. As users push their limits, the need for a middle-ground between Automations and full Workflows is arising.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaways:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automations are fast, simple robotic arms for A→B tasks.&lt;/li&gt;
&lt;li&gt;They override manual edits if triggers are already queued.&lt;/li&gt;
&lt;li&gt;Workflow Builder handles complex, multi-step logic (available on higher tiers).&lt;/li&gt;
&lt;li&gt;Pro user feedback suggests demand for more: a simplified workflow tool could bridge the gap, reduce confusion, and drive product growth.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The story
&lt;/h2&gt;

&lt;p&gt;Automations are a fun and helpful tool in your Monday.com toolkit. But as your needs grow — especially when you want to add more trigger conditions—you may find yourself duplicating nearly identical automations, which can feel repetitive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9zrf311xani1aix30pdz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9zrf311xani1aix30pdz.png" alt="Duplicate OR" width="800" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A popular &lt;a href="https://community.monday.com/t/adding-or-not-to-automations-builder/23802" rel="noopener noreferrer"&gt;Community Hub post&lt;/a&gt; with over 10K views and 336 upvotes highlights this friction: the Pro plan automation builder lacks logical operators like OR and NOT.&lt;/p&gt;

&lt;p&gt;The answer to this challenge isn’t that Monday is deliberately withholding this functionality. The reason lies in the design of Automations — they were originally not intended to be full logic engines. &lt;/p&gt;

&lt;h2&gt;
  
  
  Automation ≠ Workflow Engine
&lt;/h2&gt;

&lt;p&gt;Let’s clear up the core idea:&lt;/p&gt;

&lt;p&gt;Monday.com Automations and Workflows may sound similar to Users at first glance — but they are designed for very different jobs. And so is their nature.&lt;/p&gt;

&lt;p&gt;When you look at Automations — you should think of them as simple robotic action triggers — let's call them robotic arms. They perform programmed tasks at a ratio of ~1-2 seconds as shown in &lt;a href="https://dev.to/piotrdiuk/infinite-cycles-in-mondaycom-automations-51kp"&gt;Infinite Cycles in Monday.com Automations&lt;/a&gt;. At any time you can pull the plug and halt any of your automations and it will come to a stop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblo70lsjq6v57e3mfmfd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblo70lsjq6v57e3mfmfd.jpg" alt="Robotic arms" width="449" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens During Conflicts?
&lt;/h2&gt;

&lt;p&gt;Let’s say you have three automations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If status is &lt;strong&gt;New&lt;/strong&gt;, change it to &lt;strong&gt;Working on it&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;If status is &lt;strong&gt;Working on it&lt;/strong&gt;, change it to &lt;strong&gt;Testing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;If status is &lt;strong&gt;Testing&lt;/strong&gt;, change it to &lt;strong&gt;Stuck&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you manually change the status to Done between steps 1 and 2, your change won’t stick. The automation will override it. Why? Because another trigger was already queued. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvbdsmgpb4lza7mh3r10.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvbdsmgpb4lza7mh3r10.gif" alt="automation cycle" width="480" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see this clearly in the activity log:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsoftbnpryuwcgbmye33g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsoftbnpryuwcgbmye33g.png" alt="Activity log" width="450" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; once an automation starts, the trigger cascade finishes even if you try to step in.&lt;/p&gt;

&lt;p&gt;I hope by this practical example above, you are beginning to see how automations are simple and differ from a classic workflow or control graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  When You Need More Power: Workflow Builder
&lt;/h2&gt;

&lt;p&gt;Now imagine a complex client onboarding flow, with conditions, approvals, and branching logic. Automations alone won’t cut it. That’s where the &lt;a href="https://support.monday.com/hc/en-us/articles/20598895919122-monday-workflows-features-and-capabilities" rel="noopener noreferrer"&gt;Workflow Builder&lt;/a&gt; shines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwr8jc08jz9owz98ud4zv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwr8jc08jz9owz98ud4zv.png" alt="Monday workflow" width="500" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It lets you build connected, conditional logic flows — something automations simply aren't built to do. Think of Automations as A→B, while Workflows are A→Z, with logic gates in between.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Thought for the Roadmap
&lt;/h2&gt;

&lt;p&gt;Monday.com’s automation builder is delightful—clean, visual, and beginner-friendly. And the enterprise Workflow Builder covers advanced needs beautifully.&lt;/p&gt;

&lt;p&gt;But community feedback suggests Pro users are already trying to stretch Automations into workflow territory. That’s a strong signal that users are ready for more.&lt;/p&gt;

&lt;p&gt;Luckily, there may be a sweet spot in offering a &lt;strong&gt;simplified Workflow Builder for Pro users&lt;/strong&gt; — perhaps scoped to a board, or with limited conditions. This would:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce user confusion around logic limits&lt;/li&gt;
&lt;li&gt;Showcase the potential of workflows early&lt;/li&gt;
&lt;li&gt;Build upgrade interest through hands-on experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Automations are great. But they’re not workflows — and that’s okay. As platforms like Zapier and Make.com expand, the hunger for advanced automation will only grow.&lt;/p&gt;

&lt;p&gt;Monday.com has a unique opportunity here: evolve automation into mini Workflows gently, without losing the simplicity that users love.&lt;/p&gt;




&lt;p&gt;Thanks for reading—and kudos to the Monday team for creating such a flexible platform. I hope this adds to the conversation!&lt;/p&gt;

</description>
      <category>automation</category>
      <category>productmanagement</category>
      <category>ux</category>
      <category>nocode</category>
    </item>
    <item>
      <title>Toward Cycle Detection in AI automation workflows</title>
      <dc:creator>Piotr Paradiuk</dc:creator>
      <pubDate>Thu, 07 Aug 2025 11:38:31 +0000</pubDate>
      <link>https://dev.to/piotrdiuk/toward-cycle-detection-in-ai-automation-workflows-oca</link>
      <guid>https://dev.to/piotrdiuk/toward-cycle-detection-in-ai-automation-workflows-oca</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Cycle detection in no-code/automation tools is often neglected — even though it's critical for user safety. This post explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why non-tech users are vulnerable to loop errors&lt;/li&gt;
&lt;li&gt;How AI (and LLMs) fail at graph-level reasoning&lt;/li&gt;
&lt;li&gt;How to detect cycles in JavaScript using Graphlib&lt;/li&gt;
&lt;li&gt;What's missing in today's tooling — and how we can fix it&lt;/li&gt;
&lt;li&gt;Why visual loop safety is a UX problem, not just a backend concern&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Story
&lt;/h2&gt;

&lt;p&gt;Automation is now table stakes in AI-enabled platforms. Prompt-chain editors, workflow builders, and logic engines are popping up in nearly every product category — from marketing to dev tools.&lt;/p&gt;

&lt;p&gt;Despite the competition, few platforms have proper implementation of cycle detection.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Side note: Notably some tools have n-loops (aka repeaters) in their workflow, but it doesn't cover loop detection rather it actually allows for a certain amount of repeats.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The human factor
&lt;/h2&gt;

&lt;p&gt;Humans get overwhelmed quickly when working with large graphs. Managing an 80–90 node decision tree? It’s easy to accidentally create an infinite loop — especially for non-developers, who make up a large share of users on workflow platforms&lt;/p&gt;

&lt;p&gt;These systems are meant to let humans focus on intent, not technical structure. But let’s be honest — today’s AI-powered workflows are starting to look like miniature neural networks:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3p4v9n2aquq4yrkci4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3p4v9n2aquq4yrkci4g.png" alt="Loop graph" width="320" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why cycle isn't just a fancy dev word
&lt;/h2&gt;

&lt;p&gt;In production, unnoticed cycles can trigger unnecessary API calls, data duplication, or even billing nightmares — especially in pay-per-execution platforms.&lt;/p&gt;

&lt;p&gt;It's rarely a good idea or user intent to spawn a flow that just keeps repeating itself. The UI should clearly notify users when their graph contains a loop that prevents execution.&lt;/p&gt;

&lt;p&gt;This isn’t just a technical safeguard — it’s a UX imperative. If a user can’t see that they’ve built a loop, or doesn’t understand why their automation breaks, the failure becomes a design problem, not a logic one. Visual loop safety is about clarity, not just correctness.&lt;/p&gt;

&lt;p&gt;It's harder to detect infinite loops when data travels back and forth different integrations and comes back to the target platform, but it's surely a job we can do when designing data flows in the platform itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real world scenario
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://dev.to/piotrdiuk/infinite-cycles-in-mondaycom-automations-51kp"&gt;Infinite Cycles in Monday.com Automations&lt;/a&gt;, I've described how Monday.com automation allow infinite loop in their automations (and also smartly protects itself from negative consequences).&lt;/p&gt;

&lt;h2&gt;
  
  
  Side note about AI
&lt;/h2&gt;

&lt;p&gt;If you pondered whether AI could help you find infinite cycles in your workflow, recent studies show that graph analysis — especially dynamic semantics like control flow or AST traversal — is one of the weak points for large language models (LLMs).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Our study highlights that while LLMs have a talent for understanding code syntax, they struggle with comprehending code semantics, particularly dynamic semantics… which include abstract syntax trees (AST), control flow graphs (CFG), and call graphs (CG).”&lt;br&gt;
— LMs: Understanding Code Syntax and Semantics for Code Analysis, Ma et al. (2023) &lt;a href="https://arxiv.org/abs/2305.12138" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2305.12138&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Looks like a job for a human
&lt;/h2&gt;

&lt;p&gt;So what can we use in the JavaScript ecosystem — the world’s most popular frontend stack — to detect loops directly in the browser?&lt;/p&gt;

&lt;p&gt;We'd need a multigraph edge-aware ability to find cycles. Each edge could be an entirely different automation trigger, and we don't always merge all processes together. Process are often quite independent recipes.&lt;/p&gt;

&lt;p&gt;Well, in JS world, there is &lt;a href="https://www.npmjs.com/package/graphlib" rel="noopener noreferrer"&gt;Graphlib&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Graphlib does support multigraphs &lt;code&gt;({ multigraph: true })&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But: its &lt;code&gt;alg.findCycles()&lt;/code&gt; does not differentiate between parallel edges (i.e., multiple edges between the same pair of nodes).&lt;/p&gt;

&lt;p&gt;That means it will properly recognise cycles, but it will not distinguish whether it was edge e1 or e2 from A → B that formed the cycle. &lt;/p&gt;

&lt;p&gt;In complex automations, where multiple rules connect the same steps under different conditions, this limitation can make it hard to trace which specific rule or edge is creating a loop — frustrating users who just want to fix the problem.&lt;/p&gt;

&lt;p&gt;Another library &lt;a href="https://www.npmjs.com/package/graphology" rel="noopener noreferrer"&gt;graphology&lt;/a&gt; also doesn't natively track edge-aware cycles in multigraphs.&lt;/p&gt;

&lt;p&gt;While there's clearly a gap in the JavaScript ecosystem for formally enumerating edge-specific cycle paths, I'll stick to a simple detection for now using graphlib to demonstrate how using graph lookup we can prevent cycle loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data structure
&lt;/h2&gt;

&lt;p&gt;As mentioned before, many tools allow customers to create infinite cycles. In example below you can see a cycle between 'Working on it' and 'Stuck' Statuses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg58ax9hed3itv0jp55xm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg58ax9hed3itv0jp55xm.png" alt=" " width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is how the above data is represented in Monday.com automation data -- while it's not a graph, we can use this format to detect nodes that have similar trigger and statusColumnValue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "automations": [
    {
      "id": 133547104,
      "config": {
        "0": {
          "statusColumnValue": {
            "index": 0
          }
        },
        "1": {
          "statusColumnValue": {
            "index": 2
          }
        }
      }
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's convert this into graph, and analyse the cycles with Graphlib.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Side note: Graphlib uses &lt;a href="https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm" rel="noopener noreferrer"&gt;Tarjan algorithm&lt;/a&gt;, see: &lt;a href="https://github.com/dagrejs/graphlib/blob/master/lib/alg/find-cycles.js" rel="noopener noreferrer"&gt;https://github.com/dagrejs/graphlib/blob/master/lib/alg/find-cycles.js&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1uyvs2cyyuvpbr1u300w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1uyvs2cyyuvpbr1u300w.gif" alt="LynX, CC BY-SA 3.0 &amp;lt;https://creativecommons.org/licenses/by-sa/3.0&amp;gt;, via Wikimedia Commons" width="410" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After streaming the automation json format from Monday.com into graphlib, it properly detects cycles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import graphlib from 'graphlib';
const { Graph, alg } = graphlib;

/**
 * Builds a directed graph using integer status indices as nodes.
 * @param {Array} automations - Array of automation config objects
 * @returns {{ activeGraph: Graph, fullGraph: Graph }}
 */
export function buildGraphs(automations) {
    const activeGraph = new Graph({ directed: true });
    const fullGraph = new Graph({ directed: true });
    automations.forEach(auto =&amp;gt; {
        const from = auto.config["0"].statusColumnValue.index;
        const to = auto.config["1"].statusColumnValue.index;

        fullGraph.setEdge(String(from), String(to), `automation #${auto.id}`);
        if (auto.active) {
            activeGraph.setEdge(String(from), String(to), `automation #${auto.id}`);
        }
    });

    return { activeGraph, fullGraph };
}

/**
 * Finds all cycles in a graph where a path loops back to the same node.
 * @param {Graph} graph
 * @returns {Array&amp;lt;Array&amp;lt;string&amp;gt;&amp;gt;} - Array of node paths forming cycles
 */
export function detectCycles(graph) {
    return alg.findCycles(graph);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Combine this with a simple test.. &lt;br&gt;
&lt;em&gt;source: &lt;a href="https://github.com/piotrdiuk/graphoman/blob/main/test/graphDetection.test.js" rel="noopener noreferrer"&gt;https://github.com/piotrdiuk/graphoman/blob/main/test/graphDetection.test.js&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;...and we'll get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes: [ '0', '2' ]
Edges: [ { v: '0', w: '2' }, { v: '2', w: '0' } ]
Cycles detected: [ [ '2', '0' ] ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This confirms that Graphlib detects the cycle properly — but not the edge-level detail.&lt;/p&gt;

&lt;p&gt;While this basic approach works for flagging loops, a more robust solution should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Track which edge (or automation) causes the cycle&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prioritise flagging the recipe that breaks most connections,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow per-recipe cycle isolation,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Offer actionable feedback to users.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Toward Better Workflow Safety
&lt;/h2&gt;

&lt;p&gt;The next step is designing a universal, edge-aware graph format that can represent automations with full traceability: not just "there's a loop" — but "this specific automation causes a loop from A to B to A".&lt;/p&gt;

&lt;p&gt;That format should be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Easy to generate from automation data,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Friendly to visualisation tools,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ready for plug-in cycle-checkers or debuggers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because in the end, automation should empower non-technical users — not trap them in invisible accidental loops.&lt;/p&gt;

&lt;p&gt;Cycle safety isn’t just a backend concern — it’s a product experience issue. If loops confuse or block users, that’s on the tool, not them. Every invisible loop puts the user at risk of frustration, wasted time, and broken trust. Smarter graph tooling, even something as lightweight as Graphlib with custom edge tracking, brings us one step closer to reliable, human-friendly automation.&lt;/p&gt;

&lt;p&gt;Let me know if you know or are building something similar to help tackle this challange in JS!&lt;/p&gt;

</description>
      <category>automation</category>
      <category>javascript</category>
      <category>productmanagement</category>
      <category>ai</category>
    </item>
    <item>
      <title>Infinite cycles in monday.com automations</title>
      <dc:creator>Piotr Paradiuk</dc:creator>
      <pubDate>Thu, 07 Aug 2025 11:35:48 +0000</pubDate>
      <link>https://dev.to/piotrdiuk/infinite-cycles-in-mondaycom-automations-51kp</link>
      <guid>https://dev.to/piotrdiuk/infinite-cycles-in-mondaycom-automations-51kp</guid>
      <description>&lt;h2&gt;
  
  
  Tl;DR
&lt;/h2&gt;

&lt;p&gt;As of 2025, Monday.com runs on a rock-solid tech stack — Redux, Pusher.js, and more — enabling real-time automatic updates. But one key thing is still missing from its automation engine: cycle detection. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key take-aways:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users can accidentally sabotage themselves with loops and burn their 25k+ executions&lt;/li&gt;
&lt;li&gt;Monday protects itself with throttling, but users are still exposed&lt;/li&gt;
&lt;li&gt;A simple &lt;code&gt;(A → B + B → A)&lt;/code&gt; check could solve this&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Peek at the Technical Solution
&lt;/h2&gt;

&lt;p&gt;I’ve published a deeper technical post on how to detect cycles in JS-based multigraphs using Graphlib in &lt;a href="https://dev.to/piotrdiuk/toward-cycle-detection-in-ai-automation-workflows-oca"&gt;Toward Cycle Detection in AI Automation Workflows&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Spoiler: as of 2025, there's still no native JS library that handles edge-aware cycle detection for multigraphs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The story
&lt;/h2&gt;

&lt;p&gt;The villain of the story resides in automations (available in the free plan) - where it's possible to create something that every developer loves - an infinite loop ∞.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43s9hsi4t596df5y9zx8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43s9hsi4t596df5y9zx8.png" alt="Infinite loop automation" width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fortunately, Monday uses a time-based throttling mechanism. Each automation tick executes with a delay (~1–2s between updates). This prevents instant overload, but still means that a board with 1,000 items could experience severe lag if each item is being mutated continuously by an automation loop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpcri9irwsrcev4y2fj3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpcri9irwsrcev4y2fj3.gif" alt="Infinite ticks in action" width="480" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As seen in the execution history, each automation runs with a ~1–2 second interval. That is a good indication that it likely doesn't hit a complex server-side event bus — but executes the mutations locally, much like user actions. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0uuel8u8mm6p4ia2nm7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0uuel8u8mm6p4ia2nm7n.png" alt="Execution time" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's something that Monday does very well - board items are extremely mutable, and merges of user actions happen instantly.&lt;/p&gt;

&lt;p&gt;Yet, I think it's a safe bet to say that creating 1k items and making them tick individually for infinite time is definitely gonna have a negative effect - considering the changes are streamed &lt;strong&gt;per item&lt;/strong&gt; and not in batch.&lt;/p&gt;

&lt;p&gt;That's one of the system design decisions made in Monday, that seems to make sense when you look at the platform on a high level. It'd hard to batch items for execution when each can have transitive states. &lt;/p&gt;

&lt;p&gt;That said, under the right conditions, a form of conditional batching becomes not only safe — but strategically valuable. I explore this in more detail in &lt;a href="https://dev.to/piotrdiuk/automation-at-scale-why-one-item-at-a-time-is-breaking-down-1j2n"&gt;Automation at Scale: Why One Item at a Time Is Breaking Down&lt;/a&gt;, including how platforms can batch intelligently without sacrificing correctness.&lt;/p&gt;

&lt;p&gt;Fortunately Monday.com comes with a simple power plug here - after 25k automation runs on Pro Plan - it's game over. No more runs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mesp9p0482ycjuzqfzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mesp9p0482ycjuzqfzg.png" alt="Automation runs" width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s generous — Monday’s Pro plan allows up to 25,000 automation runs — far more than ClickUp’s 1k–5k limit or Zapier’s pricing tier for 20k Zaps (~$160/month). Still - this rate is vulnerable if users unknowingly burn through it with a loop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0m11d33fj9tz4osq61oh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0m11d33fj9tz4osq61oh.png" alt="Clickup rates" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zapier’s pricing gets expensive fast — 20k Zaps costs over $160/month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhq2blxylyudib017yh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhq2blxylyudib017yh9.png" alt="20k zaps" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;As demonstrated, there is a real 'war' for computing power in the automation builder platform world.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Implications for Customers
&lt;/h2&gt;

&lt;p&gt;We established that Monday does a pretty good job in offering high automation execution rates, and limiting the interval in which they are fired which protects customers from instant execution depletion.&lt;/p&gt;

&lt;p&gt;Yet, there is still a scenario where customers may unwillingly sabotage their own account.&lt;/p&gt;

&lt;p&gt;Imagine a case where you have 30-50 automations (which actually happens according to Community blogs)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp75y3bbll7w1lsgl3tun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp75y3bbll7w1lsgl3tun.png" alt="Community blog post" width="800" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Say you delete one automation — thinking you’re cleaning up. But that deletion breaks a subtle dependency, and now 1,000 items on your board start ticking in a self-referencing loop. Your 25k monthly automation limit? Gone in minutes. 😬&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple UX Proposal: Detecting Cycles Visually
&lt;/h2&gt;

&lt;p&gt;From UX/UI perspective it sounds simple: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;when (A → B) + (B → A) ⇒ show warning / prevent save.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Monday already uses toast messages to warn users — so surfacing loop conflicts visually would fit their existing UI patterns. You could even highlight conflicting automations and gray out the "Save" button until resolved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3asssnf6d1yfags2ecq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3asssnf6d1yfags2ecq6.png" alt="Cycle detection" width="488" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here this may just not be enough - you might want to highlight the conflicting automations and find the last conflicting cycle and freeze the recipe that is causing it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43qlr5st6letxi38pyxv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43qlr5st6letxi38pyxv.png" alt="Automation loop" width="800" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Slightly more verbose sketch of loop prevention)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now, this isn't to say that Monday has to explicitly block infinite loops - but they can at least warn User of the risk involved.&lt;/p&gt;

&lt;p&gt;In fact some companies went as far as to block repetitive cycles upon  hitting certain execution threshold, but that's a scenario that should usually be avoided (it can interrupt a crucial user network).&lt;/p&gt;

&lt;h2&gt;
  
  
  Potential Trial-Based Synthetic Load Attack
&lt;/h2&gt;

&lt;p&gt;Let’s take this a step further: imagine someone spins up trial accounts and sets up infinite loops across thousands of items. Since automations are server-side operations, no active user input is needed — just a ticking time bomb that eats through 25k executions, spiking load.&lt;/p&gt;

&lt;p&gt;As Monday scales and raises rate limits to stay competitive, it may also become more vulnerable to synthetic load attacks — especially from trial users exploiting infinite loops.&lt;/p&gt;

&lt;p&gt;When analysing logs it may also be relatively hard to find actors who have crossed a certain threshold of operations if items would be removed occasionally.&lt;/p&gt;

&lt;p&gt;Obviously for this kind of stress test that would mean an enormous inflation of per item logs (I generated around 120 ticks in 1-2 minutes):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihv5kahlnlqmi86dglkb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihv5kahlnlqmi86dglkb.png" alt="Tick amount" width="500" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As mentioned on monday.com technical blog - there is occasionally an issue with noisy customers stressing the shared traffic bandwidth. Silent infinite loops like this are one of the things that may be harder to detect in the huge lake of customer data, and can silently generate traffic costs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;So at this scale we occasionally observed individual users generating 20-30% of the overall system load! We needed a way to quickly (in a matter of minutes) discover such individuals and take some precautions. This phenomenon is often called noisy neighbor and it doesn’t only apply to cloud hardware being overutilized by other tenants. For the time being, we simply ban problematic user accounts for a few minutes. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Monday.com does a great job balancing speed — but invisible automation loops remain a real risk. Execution throttling and quota caps help protect the system, but users are still vulnerable to accidental sabotage.&lt;/p&gt;

&lt;p&gt;A simple cycle detector — even just a UI warning — could go a long way in protecting both users and the platform from runaway automations.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>systemdesign</category>
      <category>productmanagement</category>
      <category>ux</category>
    </item>
    <item>
      <title>Automation at Scale: Why ‘One Item at a Time’ Is Breaking Down</title>
      <dc:creator>Piotr Paradiuk</dc:creator>
      <pubDate>Thu, 07 Aug 2025 11:29:49 +0000</pubDate>
      <link>https://dev.to/piotrdiuk/automation-at-scale-why-one-item-at-a-time-is-breaking-down-1j2n</link>
      <guid>https://dev.to/piotrdiuk/automation-at-scale-why-one-item-at-a-time-is-breaking-down-1j2n</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Automation platforms are turning into CPUs — they just don’t realize it yet.&lt;/p&gt;

&lt;p&gt;Like early processors, most automation systems still execute every trigger in isolation. But as scale, cost, and latency pressures rise, this model breaks down.&lt;/p&gt;

&lt;p&gt;The next leap is to treat automation like compilers or LLM engines: detect shared logic, batch similar work (aka hot path), optimize the graph — not just react to every trigger individually.&lt;/p&gt;

&lt;p&gt;Batching is often avoided due to fear of side effects from transitive state changes. But under the right conditions — when items share state, logic, and no dependencies — conditional batching becomes both safe and performance-critical. It’s a latent superpower waiting to be unlocked in platforms already strained by their own flexibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Computation Race Is On
&lt;/h2&gt;

&lt;p&gt;Thanks to AI, we’ve entered a new era in workflow automations — one defined by compute budgets, latency races, and infrastructure constraints. Let's call it what it is: the computation race.&lt;/p&gt;

&lt;p&gt;Every modern automation engine is locked in a quiet arms race to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cut compute cost per automation.&lt;/li&gt;
&lt;li&gt;Increase throughput under load.&lt;/li&gt;
&lt;li&gt;Reduce lag without compromising correctness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why? Because compute cost shapes pricing. The more efficiently automations run, the more generously a platform can structure its plans.&lt;/p&gt;

&lt;p&gt;Just look at &lt;a href="https://www.make.com/en/pricing" rel="noopener noreferrer"&gt;Make.com’s pricing&lt;/a&gt; — the “Ops” selector is one of the first decisions a customer makes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febfo9v1qj5wpr0wigri9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febfo9v1qj5wpr0wigri9.png" alt="make.com pricing" width="438" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As users create more workflows and expect real-time responsiveness, the old model — process each item one at a time — starts to break down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two sides of the story
&lt;/h2&gt;

&lt;p&gt;There are two angles to automation optimization:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. User-side: How users structure and trigger automations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Platform-side: How the system processes those automations under the hood&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s explore both.&lt;/p&gt;

&lt;h2&gt;
  
  
  User-Side: Real-Time vs. Batch-Aware
&lt;/h2&gt;

&lt;p&gt;Consider this common workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Real-Time Per-Item Automation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trigger: When a project is marked "Complete"&lt;br&gt;
Action: Call external invoicing API to create invoice&lt;/p&gt;

&lt;p&gt;If 100 projects are completed in a day, the system fires 100 API calls. Each one carries overhead — auth, retries, latency. It feels immediate, but it’s noisy and costly at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Batch-Aware Automation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trigger: When a project is marked "Complete" → Add to 'Ready to Invoice' queue&lt;br&gt;
Scheduled Automation: Every day, send a single API request with a batch of all pending projects&lt;/p&gt;

&lt;p&gt;Same business logic — 100 invoices are created. But now: 1 automation run, 1 API call, fewer retries, less noise, better scaling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Suggest It in the Builder
&lt;/h2&gt;

&lt;p&gt;Platforms could detect high-volume, per-item trigger patterns and suggest batch-aware upgrades. This is where AI-assisted automation building comes in.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Looks like you're creating an invoice every time a project is completed. Want to switch to hourly batch invoicing instead?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The outcome is the same. The performance cost isn’t. &lt;/p&gt;

&lt;h2&gt;
  
  
  What we can learn from JVM and LLM
&lt;/h2&gt;

&lt;p&gt;I'd go as far as to say that I'd let my automation runtime suggest such "hot path" optimisations as explained above.&lt;/p&gt;

&lt;p&gt;In the JVM, HotSpot profiling identifies "hot" paths (frequently executed code), and rewrites bytecode on the fly with faster native instructions. It inlines methods, eliminates dead branches, and reorganizes memory based on real workload characteristics.&lt;/p&gt;

&lt;p&gt;In LLM, PyTorch tracks frequently-used computation graphs. It also uses JIT (just in time) compilation (via TorchScript) to trace and compile hot subgraphs.&lt;br&gt;
Operator fusion combines layers into a single fused operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Platform-side (computation race)
&lt;/h2&gt;

&lt;p&gt;Let’s switch to the platform's challenge fully: offering efficient automation runs while keeping infrastructure costs low.&lt;/p&gt;

&lt;p&gt;Every "when X then Y" hides a chain of processes: queuing, state validation, dependency resolution, retries, failure handling, side-effect isolation. Multiply that by millions of users triggering millions of events, and the difference between linear and batched execution becomes existential.&lt;/p&gt;

&lt;p&gt;Batching or ("Hot Pathing") enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dependency flattening — Resolve shared lookups once, not per item&lt;/li&gt;
&lt;li&gt;State scoping — Compute shared logic across similar items&lt;/li&gt;
&lt;li&gt;Throughput scaling — Use batch APIs, optimize reads, amortize costs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Platforms that lean into batching win — not just in performance, but in pricing, latency, and developer ergonomics. They aren’t stuck paying the per-item tax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Isolation Is Safe — But Expensive
&lt;/h2&gt;

&lt;p&gt;On the surface isolation makes sense: when each item can have transitive states and trigger cascading actions, batching introduces uncertainty. If updating item A causes item B to change state, then grouping items A and B in a batch could lead to race conditions or misordered side effects.&lt;/p&gt;

&lt;p&gt;In other words, individual execution ensures isolation — and isolation ensures safety. That's valuable.&lt;/p&gt;

&lt;p&gt;Here is how we can observe per-item-isolation in Monday.com automations where I created a simple trigger of status change from 'Working on it' to 'Stuck'.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExZzF5eWdqMmh1ajd0aWJocXc0MGUwMWNwcW5zMm8xbjZjd2M3NDRocCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2F3RvbT4QQERKiCVocMm%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExZzF5eWdqMmh1ajd0aWJocXc0MGUwMWNwcW5zMm8xbjZjd2M3NDRocCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2F3RvbT4QQERKiCVocMm%2Fgiphy.gif" alt="Item by item processing" width="500" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExZzF5eWdqMmh1ajd0aWJocXc0MGUwMWNwcW5zMm8xbjZjd2M3NDRocCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3RvbT4QQERKiCVocMm/giphy.gif" rel="noopener noreferrer"&gt;GIF&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the example above, web socket brings the mutation of each record in a seperate request. This safety comes at a cost: reduced throughput, increased infrastructure usage, and higher latency when dealing with large volumes of items that are eligible for automation at the same time.&lt;/p&gt;

&lt;p&gt;So the question becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can we batch some items conditionally, without sacrificing correctness?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  No-brainer batch cases
&lt;/h2&gt;

&lt;p&gt;Some cases are obviously batch-safe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Change status of 250 items to ‘Done’”&lt;/li&gt;
&lt;li&gt;“Assign 10 items to John”&lt;/li&gt;
&lt;li&gt;“Delete 80 items”&lt;/li&gt;
&lt;li&gt;“Archive 12 items”&lt;/li&gt;
&lt;li&gt;“Duplicate 15 items”&lt;/li&gt;
&lt;li&gt;“import item collection”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These can be easily triggered in batch on backend, and still be sequentially replayed on the frontend if needed: (e.g., “Running Automation on items 1…2…3…”) - or updated in one shot (depending on the scenario).&lt;/p&gt;

&lt;p&gt;Other cases are trickier. Consider known cascade zones — like a status → status → webhook chain. Detecting and batching those safely takes design foresight.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes Transitions 'Batchable'?
&lt;/h2&gt;

&lt;p&gt;To be safely batchable, a group of items should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be in the same state&lt;/li&gt;
&lt;li&gt;Trigger the same logic&lt;/li&gt;
&lt;li&gt;Have no direct or indirect dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But enabling this isn’t just about checking flags. It requires the automation engine to develop a degree of self-awareness — the ability to reason about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this automation pure or mutative?&lt;/li&gt;
&lt;li&gt;Does this action cause side effects?&lt;/li&gt;
&lt;li&gt;Is this rule idempotent and order-independent?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, the platform needs to understand what kind of work it's doing — not just execute logic in a blind, item-by-item loop.&lt;/p&gt;

&lt;p&gt;This shift — from reactive ticking to introspective execution — is what unlocks batching as a safe, composable primitive in large-scale automation systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It’s Rare — But Strategically Valuable
&lt;/h2&gt;

&lt;p&gt;Most automation platforms don’t support conditional batching — not because it’s a bad idea, but because it’s hard to retrofit into flexible, trigger-based architectures.&lt;/p&gt;

&lt;p&gt;Users can define complex logic, create circular dependencies, or rely on item-specific side effects — all of which make batching risky.&lt;/p&gt;

&lt;p&gt;But in many cases — stateless rules, disjoint segments, simple state transitions — batching is not just safe, but better.&lt;/p&gt;

&lt;p&gt;Some enterprise tools already expose batch-aware options like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Run once per group”&lt;/li&gt;
&lt;li&gt;“Run once per hour on matching items”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These unlock intelligent scheduling and reduce system load without breaking correctness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Toward Batching-Aware Automation Models
&lt;/h2&gt;

&lt;p&gt;Implementing conditional batching requires a rethink of automation internals. Options include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static analysis of automation rules to determine side-effect scope&lt;/li&gt;
&lt;li&gt;Dependency graphs between items to detect safe partitions&lt;/li&gt;
&lt;li&gt;Execution labeling, tagging automations as batchable or not&lt;/li&gt;
&lt;li&gt;Explicit batching hints from users or templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t trivial. But as automation scales from hundreds to millions of events per hour, platforms will need to get smarter about execution, not just faster at running one-off jobs.&lt;/p&gt;

&lt;p&gt;Conditional batching is one such smart move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Conditional batching and hot pathing is a quiet superpower.&lt;/p&gt;

&lt;p&gt;Not a shortcut, but an evolution — from reactive ticking to shared understanding.&lt;/p&gt;

&lt;p&gt;It’s how automation platforms can win in the computation race.&lt;/p&gt;

&lt;p&gt;Think of this: Platforms like OpenAI or Anthropic couldn’t survive if they treated every token as an isolated compute unit. They batch, compress, and share as much as possible — and that’s exactly what modern automation platforms must do as user workflows scale and become more complex.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>scalability</category>
      <category>systemdesign</category>
      <category>platformengineering</category>
    </item>
  </channel>
</rss>
