<?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: Samay Thakkar</title>
    <description>The latest articles on DEV Community by Samay Thakkar (@samaythakkar).</description>
    <link>https://dev.to/samaythakkar</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4231786%2F5e19c24d-4f88-4391-8bea-2b0d307ff946.png</url>
      <title>DEV Community: Samay Thakkar</title>
      <link>https://dev.to/samaythakkar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/samaythakkar"/>
    <language>en</language>
    <item>
      <title>AIOps for IT Operations: What It Is</title>
      <dc:creator>Samay Thakkar</dc:creator>
      <pubDate>Thu, 12 Nov 2026 14:35:52 +0000</pubDate>
      <link>https://dev.to/samaythakkar/aiops-for-it-operations-what-it-is-3dlf</link>
      <guid>https://dev.to/samaythakkar/aiops-for-it-operations-what-it-is-3dlf</guid>
      <description>&lt;p&gt;AIOps for IT operations means applying machine learning to your operational data (metrics, logs, traces, alerts and change records) to group related alerts, flag unusual behaviour and suggest likely causes, so on-call engineers can triage incidents faster. It doesn't replace monitoring or SRE practice. It can only be as good as your SLOs, alerts and telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does AIOps mean for IT operations?
&lt;/h2&gt;

&lt;p&gt;AIOps is a set of machine learning techniques that sit between your monitoring tools and your on-call engineers. They turn a flood of signals into a short list of incidents with context attached.&lt;/p&gt;

&lt;p&gt;Gartner, which coined the term, says AIOps &lt;a href="https://www.cisco.com/site/us/en/learn/topics/artificial-intelligence/what-is-aiops.html" rel="noopener noreferrer"&gt;"combines big data and machine learning to automate IT operations processes, including event correlation, anomaly detection, and causality determination"&lt;/a&gt;. In day-to-day work, that comes down to four jobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deduplication:&lt;/strong&gt; collapsing 200 copies of the same alert into one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correlation:&lt;/strong&gt; recognising that a database latency alert, an API error alert and a queue backlog alert are all one incident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anomaly detection:&lt;/strong&gt; spotting behaviour that breaks a learned pattern, such as traffic that's normal on a Monday but strange on a Sunday.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cause suggestion:&lt;/strong&gt; pointing at the likely trigger, often a deploy, config change or failing dependency, and sending the incident to the team that owns it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some platforms add a fifth job, which is running a runbook step automatically. Treat that as a separate decision with its own controls.&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Faiops-for-it-operations-explained-diagram-1.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Faiops-for-it-operations-explained-diagram-1.svg" alt="How signals reach an on-call engineer through an AIOps layer, and how outcomes feed back" width="1208" height="551"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How signals reach an on-call engineer through an AIOps layer, and how outcomes feed back&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The last arrow matters most. If engineers never record whether a grouping was correct or what actually caused the incident, the system has nothing to learn from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which problems does AIOps solve and which does it not solve?
&lt;/h2&gt;

&lt;p&gt;AIOps helps when you have too many alerts. It can't help when the alerts you need don't exist, or when nobody owns what they point at.&lt;/p&gt;

&lt;p&gt;The noise problem is real. In &lt;a href="https://www.carriermanagement.com/news/2026/04/08/286535.htm" rel="noopener noreferrer"&gt;a 2026 survey of IT production teams reported by Carrier Management&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;77% of on-call teams get at least ten alerts a day.&lt;/li&gt;
&lt;li&gt;57% say fewer than 30% of those alerts are actionable.&lt;/li&gt;
&lt;li&gt;83% of engineers ignore or dismiss alerts at least occasionally.&lt;/li&gt;
&lt;li&gt;44% had an outage in the past year linked to suppressed or ignored alerts.&lt;/li&gt;
&lt;li&gt;78% had at least one incident where no alert fired at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://cybersecureforum.co.uk/briefing/alert-fatigue-now-a-significant-issue-among-it-teams/" rel="noopener noreferrer"&gt;Splunk's State of Observability 2025 report&lt;/a&gt;, which surveyed 1,855 ITOps and engineering professionals, found that 13% of respondents globally admit to ignoring or suppressing alerts.&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Faiops-for-it-operations-explained-diagram-2.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Faiops-for-it-operations-explained-diagram-2.svg" alt="Alert fatigue figures from a 2026 survey of IT production teams (Carrier Management)" width="100" height="71.42857142857143"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Alert fatigue figures from a 2026 survey of IT production teams (Carrier Management)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Look closely at those numbers. AIOps can work on the first four, because grouping and ranking cut how many pages engineers get and how often they ignore one. It does nothing about the fifth. If no alert fired, there was no signal to correlate. That's an instrumentation gap, and you close it with better telemetry and symptom-based alerts, not a smarter model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AIOps handles well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alert storms during a cascading failure&lt;/li&gt;
&lt;li&gt;Linking incidents to recent deploys or config changes&lt;/li&gt;
&lt;li&gt;Routing to the right team when ownership data is accurate&lt;/li&gt;
&lt;li&gt;Seasonal patterns that fixed thresholds handle badly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it doesn't fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Services with no instrumentation&lt;/li&gt;
&lt;li&gt;Alerts on causes (CPU at 80%) rather than user impact&lt;/li&gt;
&lt;li&gt;Services with no clear owner&lt;/li&gt;
&lt;li&gt;Missing or outdated runbooks&lt;/li&gt;
&lt;li&gt;Unreliable releases that cause the incidents to begin with&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not every AIOps feature carries the same risk. Grouping duplicate alerts is cheap to get wrong, because an engineer can still see the underlying alerts. Automatically restarting services or closing tickets is expensive to get wrong. Start in the top-left of this chart.&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Faiops-for-it-operations-explained-diagram-3.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Faiops-for-it-operations-explained-diagram-3.svg" alt="AIOps uses placed by value and by the cost of a wrong answer" width="100" height="100.0"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;AIOps uses placed by value and by the cost of a wrong answer&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What data does AIOps need before it can help?
&lt;/h2&gt;

&lt;p&gt;AIOps needs consistent telemetry, change events, an accurate list of services and owners, and labelled incident history. Without all four, correlation is just guessing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Telemetry signals.&lt;/strong&gt; &lt;a href="https://opentelemetry.io/docs/concepts/signals/" rel="noopener noreferrer"&gt;OpenTelemetry&lt;/a&gt; currently supports traces, metrics, logs and baggage, with events and profiles still in development or at the proposal stage. A vendor-neutral standard lets you change tools later without instrumenting everything again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent labels.&lt;/strong&gt; Every alert needs the same service name, environment, severity and owning team. If one tool calls a service "checkout" and another calls it "checkout-svc-prod", correlation fails before any model runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change events.&lt;/strong&gt; Deploys, feature-flag flips, config pushes and infrastructure changes, all with timestamps. Most incidents begin with a change, so this is often the most useful data you can give AIOps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Topology and ownership.&lt;/strong&gt; Which service calls which, and who owns each one. This drives both correlation and routing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident history with outcomes.&lt;/strong&gt; Past incidents tagged with the real cause and with which alerts were noise. That's the ground truth you'll use to judge any tool.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep enough history to cover your normal cycles. If traffic follows a weekly pattern, a model trained on four days of data will flag every Monday as an anomaly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why should SLOs and clean alerts come before AIOps tools?
&lt;/h2&gt;

&lt;p&gt;SLOs tell you which alerts matter to users. If you feed AIOps alerts without that, it learns to rank noise.&lt;/p&gt;

&lt;p&gt;Google's SRE guidance is direct about this. The &lt;a href="https://sre.google/sre-book/monitoring-distributed-systems/" rel="noopener noreferrer"&gt;Monitoring Distributed Systems chapter&lt;/a&gt; says effective alerting has "good signal and very low noise". It recommends putting far more effort into catching symptoms than causes, and says alerting configuration that's rarely exercised (less than once a quarter for some teams) should be up for removal.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://sre.google/workbook/alerting-on-slos/" rel="noopener noreferrer"&gt;SRE Workbook chapter on alerting on SLOs&lt;/a&gt; shows how to put this into practice. Alert on how fast you're using up your error budget (the burn rate), not on raw thresholds. With a 99.9% SLO over 30 days, a constant 0.1% error rate uses up the budget exactly by the end of the window, which is a burn rate of 1. Spending 5% of the budget in a single hour takes a burn rate of 36. The workbook calls multiwindow, multi-burn-rate alerts the most appropriate approach in most cases.&lt;/p&gt;

&lt;p&gt;Do this before buying anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define one or two SLOs per critical service, in terms users would recognise (successful checkouts, search latency).&lt;/li&gt;
&lt;li&gt;Replace cause-based pages with burn-rate alerts. Turn cause alerts into dashboards or tickets.&lt;/li&gt;
&lt;li&gt;Delete alerts that haven't fired, or haven't led to any action, in a quarter.&lt;/li&gt;
&lt;li&gt;Make sure every remaining alert has an owner and a runbook link.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This often cuts paging by more than any tool would. It also gives you a clean definition of "an incident that mattered", which you'll need to judge an AIOps pilot. This is where our &lt;a href="https://calidadinfotech.com/engineering/observability-sre" rel="noopener noreferrer"&gt;Observability &amp;amp; SRE&lt;/a&gt; work starts: SLOs users would recognise, OpenTelemetry instrumentation, and cutting alerts down to the ones that matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you pilot AIOps on one service with a measured baseline?
&lt;/h2&gt;

&lt;p&gt;Pick one noisy service with a clear owner. Measure its on-call load for a few weeks, clean up its alerts, then run AIOps in suggest-only mode and compare against the baseline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick the service.&lt;/strong&gt; Choose one that pages often, has a single owning team and already sends telemetry. Avoid your most critical system for the first round.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Record a baseline.&lt;/strong&gt; Tag every page for two weeks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total alerts and total pages per week&lt;/li&gt;
&lt;li&gt;Share of pages that were actionable&lt;/li&gt;
&lt;li&gt;Time to acknowledge and time to restore&lt;/li&gt;
&lt;li&gt;Incidents found by users or other teams before any alert fired&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Clean up first.&lt;/strong&gt; Add the SLO and burn-rate alerts and remove dead ones. Measure again. Some of the improvement will come from this step alone, and you should credit it there, not to the tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run in shadow mode.&lt;/strong&gt; Let the AIOps tool group incidents and suggest causes, but not act. Engineers mark each suggestion right or wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decide with criteria set in advance.&lt;/strong&gt; For example: pages per week down by an agreed share, no drop in actionable rate, no missed SLO breaches, and cause suggestions correct often enough that engineers check them first. Agree a stop rule too. Our guide to &lt;a href="https://calidadinfotech.com/blog/why-ai-automation-projects-fail" rel="noopener noreferrer"&gt;why AI automation projects fail&lt;/a&gt; covers the usual ways pilots without a baseline or owner stall.&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Faiops-for-it-operations-explained-diagram-4.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Faiops-for-it-operations-explained-diagram-4.svg" alt="A nine-week plan to pilot AIOps on one service against a measured baseline" width="100" height="46.894695378151255"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A nine-week plan to pilot AIOps on one service against a measured baseline&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read recovery time together with change failure rate, not on its own. Our post on &lt;a href="https://calidadinfotech.com/blog/dora-metrics-when-ai-writes-code" rel="noopener noreferrer"&gt;DORA metrics when AI writes your code&lt;/a&gt; explains why one metric improving can hide another getting worse.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should you check when a vendor sells AIOps?
&lt;/h2&gt;

&lt;p&gt;Ask the vendor to prove the claims on your own past incidents, show why it grouped what it grouped, and keep a person in charge of any action it takes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Good answer&lt;/th&gt;
&lt;th&gt;Red flag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Proof on your data&lt;/td&gt;
&lt;td&gt;Replays your last 90 days of incidents and shows grouping accuracy&lt;/td&gt;
&lt;td&gt;Only shows benchmarks from other customers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explainability&lt;/td&gt;
&lt;td&gt;Shows which signals and changes linked alerts together&lt;/td&gt;
&lt;td&gt;"The model decided"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Noise reduction&lt;/td&gt;
&lt;td&gt;Separates deduplication from suppression and reports both&lt;/td&gt;
&lt;td&gt;One headline percentage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data standards&lt;/td&gt;
&lt;td&gt;Takes in OpenTelemetry and exports your data and rules&lt;/td&gt;
&lt;td&gt;Proprietary agents only, no export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actions&lt;/td&gt;
&lt;td&gt;Suggest-only by default; approval and audit trail for risky steps&lt;/td&gt;
&lt;td&gt;Auto-remediation switched on out of the box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data terms&lt;/td&gt;
&lt;td&gt;Clear on retention and whether your telemetry trains shared models&lt;/td&gt;
&lt;td&gt;Vague or missing answers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Pricing tied to a unit you can forecast (hosts, GB, events)&lt;/td&gt;
&lt;td&gt;Costs that grow faster than your traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One test is worth more than the rest. Hand the vendor three past incidents you already understand and see whether the tool reaches the same conclusion. If it can't explain incidents you've already solved, it won't help with the ones you haven't.&lt;/p&gt;

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

&lt;p&gt;AIOps is useful for one specific job: cutting a stream of alerts down to a few incidents with likely causes attached. It works best on top of good telemetry, SLO-based alerts, clear ownership and labelled incident history, and it can't stand in for any of them. Do the SRE groundwork first, then pilot one service against a baseline and let the numbers decide.&lt;/p&gt;

&lt;p&gt;At Calidad, DevOps and AIOps are part of our &lt;a href="https://calidadinfotech.com/services/platform-modernization" rel="noopener noreferrer"&gt;Platform Modernization&lt;/a&gt; work. We start with a paid pilot: one pod, one outcome, and success criteria agreed up front.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://calidadinfotech.com/contact-us" rel="noopener noreferrer"&gt;Talk to an engineering lead →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is AIOps the same as observability?
&lt;/h3&gt;

&lt;p&gt;No. Observability is your ability to understand a system from its telemetry: traces, metrics and logs. AIOps is an analysis layer that runs on that telemetry to group alerts, find anomalies and suggest causes. Without observability, AIOps has nothing reliable to work with.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long should an AIOps pilot take?
&lt;/h3&gt;

&lt;p&gt;Plan for about two months on one service: two weeks of baseline, two weeks of alert cleanup and SLO setup, then four weeks in shadow mode. Weekly traffic patterns mean shorter pilots tend to produce false anomalies. Set success criteria and a stop rule before the pilot starts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should AIOps be allowed to fix incidents automatically?
&lt;/h3&gt;

&lt;p&gt;Not at first. Start with suggest-only grouping and cause hints, where a wrong answer costs little. Add automated actions one runbook step at a time, with an approval step, scoped permissions and an audit trail for anything that's hard to undo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can we get AIOps benefits without buying a platform?
&lt;/h3&gt;

&lt;p&gt;Often, yes. A lot of the noise reduction comes from replacing cause-based alerts with SLO burn-rate alerts, deleting alerts nobody acts on, and adding consistent service and owner labels. Do that first. It shows whether a tool would add enough on top to justify its cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does a GCC in India need its own AIOps setup?
&lt;/h3&gt;

&lt;p&gt;Usually not. A capability center works best on the same telemetry, SLOs, alert routing and runbooks as headquarters, so incidents are handled the same way across time zones. Separate tooling tends to split ownership and makes correlation harder.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article first appeared on &lt;a href="https://calidadinfotech.com/blog/aiops-for-it-operations-explained" rel="noopener noreferrer"&gt;Calidad Infotech&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiops</category>
      <category>itoperations</category>
      <category>observability</category>
      <category>sre</category>
    </item>
    <item>
      <title>Recovering LLM Costs in SaaS Pricing</title>
      <dc:creator>Samay Thakkar</dc:creator>
      <pubDate>Thu, 12 Nov 2026 14:35:51 +0000</pubDate>
      <link>https://dev.to/samaythakkar/recovering-llm-costs-in-saas-pricing-43f4</link>
      <guid>https://dev.to/samaythakkar/recovering-llm-costs-in-saas-pricing-43f4</guid>
      <description>&lt;p&gt;Yes, you can recover LLM token costs from SaaS customers. First you need to measure those costs for each tenant and each feature. Most SaaS teams do best with a hybrid model: a subscription that includes an AI allowance sized for typical use, plus metered overage or higher tiers for heavy users. Caps on top of that protect your margin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do LLM costs break a flat SaaS price?
&lt;/h2&gt;

&lt;p&gt;Every AI request costs you money each time it runs, while a flat price stays the same however much a customer uses.&lt;/p&gt;

&lt;p&gt;In classic SaaS, serving one more user costs almost nothing. With LLM features, every prompt, retrieved document and generated answer is billed by the token. The bill also varies a lot by model. CloudZero's breakdown of OpenAI's rate card lists the current flagship at &lt;a href="https://www.cloudzero.com/blog/openai-pricing/" rel="noopener noreferrer"&gt;$10 input and $50 output per million tokens&lt;/a&gt;, while the cheapest model in the same table costs $0.20 for input. Output tokens cost several times more than input, so long answers and agent loops add up quickly.&lt;/p&gt;

&lt;p&gt;Here's a worked example using those flagship rates. Say a feature sends 3,000 input tokens and gets 800 output tokens back on each call:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input: 3,000 × $10 / 1M = $0.03&lt;/li&gt;
&lt;li&gt;Output: 800 × $50 / 1M = $0.04&lt;/li&gt;
&lt;li&gt;Cost per call: &lt;strong&gt;$0.07&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A user who runs it 50 times a working day makes about 1,050 calls a month and costs you about $73. If the seat sells for $40, every heavy user loses you money, and light users can't make up the gap if heavy users are common.&lt;/p&gt;

&lt;p&gt;Many vendors have moved away from flat pricing for this reason. Metronome's field report found the move to usage-based or hybrid pricing was often &lt;a href="https://metronome.com/blog/ai-pricing-in-practice-2025-field-report-from-leading-saas-teams" rel="noopener noreferrer"&gt;a defensive move to deal with real, variable costs&lt;/a&gt; rather than a strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you measure token usage per tenant and per feature?
&lt;/h2&gt;

&lt;p&gt;Send every model call through one gateway. The gateway tags each call with the tenant, the feature and the model, and records the token counts the provider returns.&lt;/p&gt;

&lt;p&gt;Set it up in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One path to the model.&lt;/strong&gt; Product code shouldn't call provider SDKs directly. Use a single gateway or wrapper, so nothing goes unmetered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag every request.&lt;/strong&gt; Add tenant ID, plan, feature, model and user. Without the feature tag, you can't tell which feature is losing money.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record each token type separately.&lt;/strong&gt; OpenTelemetry's generative AI conventions define &lt;a href="https://github.com/open-telemetry/semantic-conventions-genai/blob/main/docs/gen-ai/gen-ai-token-metrics.md" rel="noopener noreferrer"&gt;separate counters for input, output, cache-read, cache-write and reasoning tokens&lt;/a&gt;. The recorded value should match the count the provider returns, not your own estimate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price each call at the time it runs.&lt;/strong&gt; Multiply each token type by the rate card in force on that date and write the result to a cost ledger. Rates change, so totals recalculated later at new rates will be wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the costs that aren't tokens.&lt;/strong&gt; Count embeddings, vector search, retries and failed calls. Retries are easy to miss and can be a real share of spend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look at the spread, not the average.&lt;/strong&gt; Report cost per tenant at the median and the 95th percentile, and cost per completed task for each feature.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Collect at least one full billing cycle of this data before you change any prices. The spread decides your pricing model more than the average does. We cover the setup in more detail in our guide to &lt;a href="https://calidadinfotech.com/blog/reduce-cloud-llm-costs-saas" rel="noopener noreferrer"&gt;cutting cloud and LLM costs at a SaaS company&lt;/a&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Freduce-cloud-llm-costs-saas-diagram-2.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Freduce-cloud-llm-costs-saas-diagram-2.svg" alt="How one LLM request is tied to a tenant and feature before its cost reaches the ledger" width="1142" height="601"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Each request is tagged with its tenant and feature before its cost reaches the ledger.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Which pricing models can recover LLM costs: quotas, metering or tiers?
&lt;/h2&gt;

&lt;p&gt;All three can recover costs. Which one fits depends on how uneven usage is across tenants and how much your buyers need predictable bills.&lt;/p&gt;

&lt;p&gt;Hybrid models are now the most common choice. Metronome reports that &lt;a href="https://metronome.com/blog/ai-pricing-in-practice-2025-field-report-from-leading-saas-teams" rel="noopener noreferrer"&gt;most enterprise AI deals in 2025 still rely on usage-based or hybrid pricing&lt;/a&gt;. Orb, citing Stripe, says that among AI company leaders, &lt;a href="https://www.withorb.com/blog/ai-pricing-statistics" rel="noopener noreferrer"&gt;56% use hybrid pricing and 38% use pure usage-based pricing&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;How it works&lt;/th&gt;
&lt;th&gt;Recovers cost when&lt;/th&gt;
&lt;th&gt;Main risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Absorbed (built into the price)&lt;/td&gt;
&lt;td&gt;AI is part of the plan price&lt;/td&gt;
&lt;td&gt;Usage is light and even&lt;/td&gt;
&lt;td&gt;Heavy users erode margin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Included quota + overage&lt;/td&gt;
&lt;td&gt;A set allowance, then a charge per unit&lt;/td&gt;
&lt;td&gt;Usage has a long tail&lt;/td&gt;
&lt;td&gt;Bill surprises if alerts are weak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pure metering&lt;/td&gt;
&lt;td&gt;A charge per request, task or token&lt;/td&gt;
&lt;td&gt;Usage is driven by the customer and is spiky&lt;/td&gt;
&lt;td&gt;Buyers can't budget for it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiered plans&lt;/td&gt;
&lt;td&gt;Higher tiers raise AI limits&lt;/td&gt;
&lt;td&gt;Usage tracks customer size&lt;/td&gt;
&lt;td&gt;Customers bunch up just under a tier limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prepaid credits&lt;/td&gt;
&lt;td&gt;Customers buy credits up front and spend them down&lt;/td&gt;
&lt;td&gt;Features vary in cost&lt;/td&gt;
&lt;td&gt;Credits feel abstract to buyers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outcome-based&lt;/td&gt;
&lt;td&gt;A charge per resolved task&lt;/td&gt;
&lt;td&gt;The outcome can be measured cleanly&lt;/td&gt;
&lt;td&gt;Arguments over what counts as done&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Several large vendors already use these models. GitHub Copilot business plans include a set number of premium requests, and &lt;a href="https://github.blog/changelog/2025-08-22-premium-request-overage-policy-is-generally-available-for-copilot-business-and-enterprise/" rel="noopener noreferrer"&gt;an admin policy decides whether to allow charges beyond that or block usage&lt;/a&gt;. Intercom sells &lt;a href="https://metronome.com/blog/ai-pricing-in-practice-2025-field-report-from-leading-saas-teams" rel="noopener noreferrer"&gt;annual credit buckets with optional pricing per resolution&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Charge business buyers in a unit they recognize, such as a request, a document, a report or a resolution. Use tokens only to set that price internally. That way, when you switch to a cheaper model, your margin improves and the customer's price list doesn't change.&lt;/p&gt;

&lt;p&gt;The chart places each model on two criteria. One is how predictable the bill is for the buyer. The other is how well the model protects your margin when usage spikes.&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Frecover-llm-token-costs-saas-pricing-diagram-1.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Frecover-llm-token-costs-saas-pricing-diagram-1.svg" alt="Pricing models placed by buyer predictability and margin protection" width="100" height="100.0"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Pricing models placed by buyer predictability and margin protection&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you set token budgets and caps that protect margin?
&lt;/h2&gt;

&lt;p&gt;Start from the gross margin you want on each plan, work out how much AI cost each tenant can carry, and enforce that budget in the gateway.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set the AI share of revenue for each plan.&lt;/strong&gt; For example, a $500-a-month plan that may spend 15% on AI has a $75 budget per tenant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convert the budget into units.&lt;/strong&gt; At $0.07 a call, $75 covers about 1,070 calls. Set the included quota a bit lower, say 1,000, to leave room for retries and fallbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add thresholds.&lt;/strong&gt; Warn the customer's admin at 80% of the quota. At 100%, either move the tenant to a cheaper model or ask them to approve overage. The hard cap is whatever the contract allows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget expensive features separately.&lt;/strong&gt; Long-context analysis and multi-step agents can use up a whole quota in a few runs. Give them their own limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cut costs before you raise prices.&lt;/strong&gt; Under Anthropic's pricing, &lt;a href="https://tensormesh.ai/learn/anthropic-prompt-caching-pricing/" rel="noopener noreferrer"&gt;cache reads cost 0.1x the base input rate&lt;/a&gt;, a 90% discount on repeated system prompts. Sending simple requests to smaller models lowers costs further. In our &lt;a href="https://calidadinfotech.com/engineering/generative-ai" rel="noopener noreferrer"&gt;generative AI builds&lt;/a&gt;, each feature gets latency and cost targets per request, with model routing and fallbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recheck every month.&lt;/strong&gt; Provider prices change, so recalculate how many units the budget covers whenever the rate card moves.&lt;/li&gt;
&lt;/ol&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Frecover-llm-token-costs-saas-pricing-diagram-2.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Frecover-llm-token-costs-saas-pricing-diagram-2.svg" alt="Lifecycle of one tenant's AI budget within a billing period" width="395" height="455"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Lifecycle of one tenant's AI budget within a billing period&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How should you explain usage charges to customers without losing trust?
&lt;/h2&gt;

&lt;p&gt;Show customers their usage before you bill it, let them set their own limits, and charge in units they understand.&lt;/p&gt;

&lt;p&gt;Surprise bills are common. Orb cites a survey in which &lt;a href="https://www.withorb.com/blog/ai-pricing-statistics" rel="noopener noreferrer"&gt;78% of IT leaders reported unexpected charges from consumption-based or AI pricing&lt;/a&gt;. To avoid adding to that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Put a usage meter in the product&lt;/strong&gt; that shows units used, units left and the date the allowance resets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alert admins, not only users,&lt;/strong&gt; at 80% and 100% of the quota.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let customers choose what happens at the limit.&lt;/strong&gt; Like GitHub's overage policy, admins should decide whether usage continues at a charge or stops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offer a trial period&lt;/strong&gt; so buyers can estimate their usage before they commit. Intercom uses &lt;a href="https://metronome.com/blog/ai-pricing-in-practice-2025-field-report-from-leading-saas-teams" rel="noopener noreferrer"&gt;generous or extendable free AI trials&lt;/a&gt; for this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't charge for your own failures.&lt;/strong&gt; Leave retries, timeouts and answers that failed validation off the bill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give notice before changes take effect.&lt;/strong&gt; Let existing contracts run to renewal on their current terms, and publish the new units well in advance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When should you absorb LLM costs versus pass them on?
&lt;/h2&gt;

&lt;p&gt;Absorb LLM costs when the cost per tenant is small and stable compared with the price. Pass them on when usage is uneven, heavy or controlled by the customer.&lt;/p&gt;

&lt;p&gt;Absorbing tends to fit when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Even your 95th-percentile tenant stays within the AI budget for the plan.&lt;/li&gt;
&lt;li&gt;The feature is now something buyers expect, and competitors include it at no extra charge.&lt;/li&gt;
&lt;li&gt;Use is limited by how the product works, such as one summary per record.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Passing costs on tends to fit when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A small group of tenants causes most of the spend.&lt;/li&gt;
&lt;li&gt;Customers trigger the volume themselves, such as with bulk jobs, agents or API access.&lt;/li&gt;
&lt;li&gt;The feature is a new premium capability that buyers will pay more for.&lt;/li&gt;
&lt;/ul&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Frecover-llm-token-costs-saas-pricing-diagram-3.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Frecover-llm-token-costs-saas-pricing-diagram-3.svg" alt="Deciding whether to absorb LLM costs or pass them on" width="934" height="632"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Deciding whether to absorb LLM costs or pass them on&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Price LLM costs only after you can see them. Meter every call by tenant and feature, then look at how unevenly usage is spread. Most SaaS companies end up with a hybrid: an included allowance, then overage or tiers, budgets enforced in the gateway, and usage that customers can see before they're billed.&lt;/p&gt;

&lt;p&gt;Calidad's &lt;a href="https://calidadinfotech.com/consulting/cloud-cost-optimization" rel="noopener noreferrer"&gt;cloud cost optimization&lt;/a&gt; work covers this for teams whose cloud and AI bills grow faster than revenue. We show where the money goes, cut the waste and set guardrails so the savings last. Every engagement starts with a paid pilot, and there are no long-term contracts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://calidadinfotech.com/contact-us" rel="noopener noreferrer"&gt;Talk to an engineering lead →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should I show customers raw token counts on their invoice?
&lt;/h3&gt;

&lt;p&gt;Usually not for business buyers. Tokens are hard to predict and depend on which model you use. Bill in a unit customers recognize, such as requests, documents or resolved tasks, and set its price from tokens internally. Developer-facing API products are the exception, because their buyers often expect to see tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much markup should I add on top of LLM costs?
&lt;/h3&gt;

&lt;p&gt;No single markup is right. Start from the gross margin you want on each plan, and allow for retries, embeddings, infrastructure and support as well as tokens. Check what the price of your chosen unit looks like to the buyer against the value they get from it, not only against your cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  What should I do when model prices drop?
&lt;/h3&gt;

&lt;p&gt;If you charge in your own units rather than tokens, a cheaper model raises your margin without any change to the price list. Decide whether to keep the savings, add more included usage, or lower prices for competitive reasons. Recheck how many units each budget covers whenever a rate card changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I add AI usage charges to existing customer contracts?
&lt;/h3&gt;

&lt;p&gt;Doing it mid-term risks breaking trust and the contract itself. A safer approach is to keep current terms until renewal, give clear notice and show customers their actual usage beforehand. That way the new pricing reflects usage they've already seen.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long should I meter usage before choosing a pricing model?
&lt;/h3&gt;

&lt;p&gt;Collect at least one full billing cycle of data tagged by tenant and feature, and longer if usage changes with the season. You need enough data to see the 95th-percentile tenant, not only the average. Pricing on a short sample tends to set quotas too generously or too tightly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article first appeared on &lt;a href="https://calidadinfotech.com/blog/recover-llm-token-costs-saas-pricing" rel="noopener noreferrer"&gt;Calidad Infotech&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llmpricing</category>
      <category>saaspricing</category>
      <category>aimonetization</category>
      <category>usagebasedpricing</category>
    </item>
    <item>
      <title>LangGraph vs CrewAI vs AutoGen Production</title>
      <dc:creator>Samay Thakkar</dc:creator>
      <pubDate>Thu, 12 Nov 2026 08:26:22 +0000</pubDate>
      <link>https://dev.to/samaythakkar/langgraph-vs-crewai-vs-autogen-production-1dke</link>
      <guid>https://dev.to/samaythakkar/langgraph-vs-crewai-vs-autogen-production-1dke</guid>
      <description>&lt;p&gt;The right choice of LangGraph, CrewAI or AutoGen for production depends on your workflow, not on a ranking. Pick the one that passes your own tests for saved state, approval steps, tool permissions and tracing. Note that Microsoft has stopped adding features to AutoGen, so today the real comparison is LangGraph vs CrewAI vs Microsoft Agent Framework. Run all three through the same tasks before you commit.&lt;/p&gt;

&lt;p&gt;This guide is for CTOs and lead engineers whose agent workflow needs an audit trail and human sign-off. It gives you the criteria, a way to test each framework fairly, and a check for when you don't need a framework at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should a production agent framework need to support?
&lt;/h2&gt;

&lt;p&gt;A production agent framework has to save its state, pause safely for a person, limit what each tool can do, and leave a trace you can audit.&lt;/p&gt;

&lt;p&gt;A demo only has to work once. Production has to keep working through restarts, timeouts, rejected approvals and misleading tool outputs. Check every candidate against these six things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Saved state.&lt;/strong&gt; A run can survive a process restart and pick up from the last completed step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explicit control.&lt;/strong&gt; You can see and change the path a run takes, including branches and loops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval steps.&lt;/strong&gt; A run can wait hours or days for a person, then continue with their decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool permissions.&lt;/strong&gt; Each step can reach only the tools and data it needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracing.&lt;/strong&gt; Every model call, tool call and decision shows up as structured telemetry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exit cost.&lt;/strong&gt; You can leave without rewriting your business logic.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tool permissions come before features. In OWASP's 2026 ranking of LLM application risks, Excessive Agency rose from sixth to third. &lt;a href="https://cloudsecurityalliance.org/blog/2026/10/21/the-owasp-top-10-for-llm-applications-2026-what-changed-and-why-it-matters" rel="noopener noreferrer"&gt;OWASP traces it to&lt;/a&gt; "excessive functionality, overly broad permissions, or too much autonomy." A framework that makes broad access easy is a risk, however good its demos look.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do LangGraph, CrewAI and AutoGen differ in state, control and tooling?
&lt;/h2&gt;

&lt;p&gt;LangGraph gives you a graph you control directly, with saved state at each step. CrewAI adds Flows for control and approval on top of its agent crews. AutoGen is frozen, and new projects go to Microsoft Agent Framework instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LangGraph.&lt;/strong&gt; A checkpointer saves the graph's state at each step, grouped into threads. Approval uses &lt;code&gt;interrupt()&lt;/code&gt;: "When an interrupt is triggered, LangGraph saves the graph state using its persistence layer and waits indefinitely until you resume execution." The &lt;a href="https://docs.langchain.com/oss/python/langgraph/interrupts" rel="noopener noreferrer"&gt;docs say to use a durable checkpointer in production&lt;/a&gt;. You also choose a durability mode, and the trade-off matters. In &lt;a href="https://docs.langchain.com/oss/python/langgraph/checkpointers" rel="noopener noreferrer"&gt;"async" mode, there is a small risk that a checkpoint isn't written if the process crashes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CrewAI.&lt;/strong&gt; Flows are the part of CrewAI that matters for control. CrewAI's &lt;code&gt;@human_feedback&lt;/code&gt; decorator can pause a flow, show a person the output, collect their feedback, and route the flow based on the answer. Check the defaults: by default, &lt;code&gt;@human_feedback&lt;/code&gt; stops and waits for input at the console. A non-blocking async mode exists. CrewAI's paid platform adds email-based review, but &lt;a href="https://docs.crewai.com/en/enterprise/features/flow-hitl-management" rel="noopener noreferrer"&gt;those features need version 1.8.0 or later&lt;/a&gt; and apply only to Flows, not to Crews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AutoGen.&lt;/strong&gt; Microsoft no longer develops AutoGen. The repository has shown a maintenance-mode notice since 2 October 2025, the last Microsoft release was autogen-agentchat 0.7.5 on 30 September 2025, and new users are sent to Microsoft Agent Framework, which reached 1.0 on PyPI on 2 April 2026. In Agent Framework, &lt;a href="https://learn.microsoft.com/en-us/agent-framework/workflows/human-in-the-loop" rel="noopener noreferrer"&gt;approval works by request and response&lt;/a&gt;: a workflow step sends a request to a person or system and waits for the answer before going on.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;LangGraph&lt;/th&gt;
&lt;th&gt;CrewAI&lt;/th&gt;
&lt;th&gt;AutoGen → Agent Framework&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Control model&lt;/td&gt;
&lt;td&gt;Graph you define (nodes, edges)&lt;/td&gt;
&lt;td&gt;Agent crews, plus Flows for step-by-step control&lt;/td&gt;
&lt;td&gt;Group chats (AutoGen); workflows (Agent Framework)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saved state&lt;/td&gt;
&lt;td&gt;Checkpointers, with a choice of durability mode&lt;/td&gt;
&lt;td&gt;Test how Flow state survives a restart&lt;/td&gt;
&lt;td&gt;Checkpointing in workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approval step&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;interrupt()&lt;/code&gt; and resume&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@human_feedback&lt;/code&gt; in Flows&lt;/td&gt;
&lt;td&gt;Request and response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project status&lt;/td&gt;
&lt;td&gt;Actively developed&lt;/td&gt;
&lt;td&gt;Actively developed&lt;/td&gt;
&lt;td&gt;AutoGen frozen; build on Agent Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Take every cell as something to test, not a verdict. Each feature exists, but you won't know how it behaves in your setup until you run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you test each framework against the same task set?
&lt;/h2&gt;

&lt;p&gt;Build 10–20 tasks from your real workflow. Run them on every framework with the same model, prompts and tools. Then score the results against criteria you agreed before the first run.&lt;/p&gt;

&lt;p&gt;Keep the framework as the only thing that changes. Put your tools behind one shared interface. An &lt;a href="https://calidadinfotech.com/blog/mcp-vs-a2a-agent-protocol-guide" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt; works well for this, because each framework then calls the same tool code. Pin the model version too, the same way you would when &lt;a href="https://calidadinfotech.com/blog/best-llm-enterprise-applications" rel="noopener noreferrer"&gt;comparing LLMs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Your task set should include runs that go wrong on purpose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Normal run:&lt;/strong&gt; the standard case finishes correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval rejected:&lt;/strong&gt; the run stops cleanly and records why.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval after 48 hours:&lt;/strong&gt; the run resumes with the right state, on a different worker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process killed mid-run:&lt;/strong&gt; the run resumes from its checkpoint and doesn't repeat finished side effects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool error:&lt;/strong&gt; the run retries a set number of times, then hands off to a person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Injected instruction:&lt;/strong&gt; a tool result tells the agent to call an off-limits tool, and the call is blocked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The worker test is a real risk, not a theory. In a &lt;a href="https://github.com/microsoft/agent-framework/discussions/2305" rel="noopener noreferrer"&gt;GitHub discussion from November 2025&lt;/a&gt;, an Agent Framework user found that with several approval rounds, holding checkpoint state inside the framework, with no option to store it in a distributed cache, looked like a hard limit. That may have changed since. Your multi-worker test is how you find out.&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Flanggraph-crewai-autogen-production-comparison-diagram-1.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Flanggraph-crewai-autogen-production-comparison-diagram-1.svg" alt="The states one agent run must pass through in testing, including crash recovery and rejection" width="813" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The states one agent run must pass through in testing, including crash recovery and rejection&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Score each framework on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;task success rate&lt;/li&gt;
&lt;li&gt;correct resumes&lt;/li&gt;
&lt;li&gt;approval bypasses (must be zero)&lt;/li&gt;
&lt;li&gt;how complete the traces are&lt;/li&gt;
&lt;li&gt;how much connecting code you had to write&lt;/li&gt;
&lt;li&gt;how long it took to add one new step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last two show what owning the framework will cost you over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which criteria matter most for audit trails and human approval steps?
&lt;/h2&gt;

&lt;p&gt;The criteria that matter most are where approval is enforced, whether it is tied to an exact action, and whether the record lives in a store you control.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enforce approval in the tool layer.&lt;/strong&gt; A prompt that says "ask before refunding" is not a control. The tool gateway should refuse a risky call unless it comes with a valid approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tie approval to the exact action.&lt;/strong&gt; Store a hash of the tool name and its arguments with each approval. If the agent changes the amount after approval, the call fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record who, what, when and why.&lt;/strong&gt; Log the approver, the timestamp, the evidence they saw and the decision. Write it to an append-only store, not just to the framework's checkpoint tables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make side effects safe to repeat.&lt;/strong&gt; Find out whether resuming re-runs any code before the approval point. Use an idempotency key so a resumed run can't send a payment twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use standard trace names.&lt;/strong&gt; The &lt;a href="https://github.com/open-telemetry/semantic-conventions-genai/blob/main/docs/gen-ai/README.md" rel="noopener noreferrer"&gt;OpenTelemetry generative AI conventions&lt;/a&gt; define names for model calls, tool calls and agent operations (agent spans). Use them so your traces don't depend on one framework's dashboard.&lt;/li&gt;
&lt;/ul&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Flanggraph-crewai-autogen-production-comparison-diagram-2.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Flanggraph-crewai-autogen-production-comparison-diagram-2.svg" alt="How a risky tool call is paused, approved, checked and logged before it runs" width="1321" height="601"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How a risky tool call is paused, approved, checked and logged before it runs&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Calidad builds &lt;a href="https://calidadinfotech.com/engineering/ai-agents-automation" rel="noopener noreferrer"&gt;AI agents and automation&lt;/a&gt; this way: scoped permissions, a full audit trail, and a person on every risky action. Checking what the agent says before users see it is a separate job, covered in our guide to &lt;a href="https://calidadinfotech.com/blog/validate-ai-responses-production" rel="noopener noreferrer"&gt;validating AI responses in production&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the risks of vendor lock-in and how do you limit them?
&lt;/h2&gt;

&lt;p&gt;The main lock-in risks are state formats tied to one framework, features available only on a paid platform, and the project being abandoned. You limit them by keeping business logic, tools and audit records outside the framework.&lt;/p&gt;

&lt;p&gt;AutoGen shows that being abandoned is a real risk, not a theory. A framework with strong backing and a large user base still went into maintenance mode within two years. Plan for leaving on day one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep business logic in plain modules.&lt;/strong&gt; Graph nodes or flow steps should only call your own functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep tools behind your own interface or MCP&lt;/strong&gt;, so switching frameworks doesn't mean rewriting the tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Own the audit log.&lt;/strong&gt; Checkpoint tables are internal to the framework. Your compliance record shouldn't be.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know which features need a paid platform.&lt;/strong&gt; Email approvals or a hosted runtime may be worth paying for. Just write down which parts of your design depend on them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the task set.&lt;/strong&gt; It doubles as your migration test. A new framework is ready when it passes the same tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do you decide between a framework and custom orchestration code?
&lt;/h2&gt;

&lt;p&gt;Use a framework when the workflow branches, loops or pauses for long periods. Use plain code when it is a short, fixed sequence with one approval step.&lt;/p&gt;

&lt;p&gt;A three-step pipeline with one approval can run on a job queue, a database row for state and a small approval service. That's less to learn and less to upgrade. Frameworks earn their keep when you have many branches, retries, long waits and several agents, because then you would end up rebuilding checkpointing and resuming yourself.&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Flanggraph-crewai-autogen-production-comparison-diagram-3.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Flanggraph-crewai-autogen-production-comparison-diagram-3.svg" alt="Deciding between an agent framework and custom orchestration for one workflow" width="514" height="1296"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Deciding between an agent framework and custom orchestration for one workflow&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;No framework wins in general. Write down the six criteria, build a task set from your real workflow, and run LangGraph, CrewAI and Microsoft Agent Framework through it with the model and tools held fixed. Choose based on zero approval bypasses, correct resumes and complete traces. Then keep your tools, logic and audit log outside the framework so you can change your mind later.&lt;/p&gt;

&lt;p&gt;Calidad runs this kind of comparison as a paid pilot: one pod, one outcome, with success criteria agreed up front. &lt;a href="https://calidadinfotech.com/contact-us" rel="noopener noreferrer"&gt;Talk to an engineering lead →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is AutoGen still safe to use in production?
&lt;/h3&gt;

&lt;p&gt;Existing AutoGen systems can keep running, but Microsoft is no longer adding features, and new users are directed to Microsoft Agent Framework. For new production work, test Agent Framework instead. If you already run AutoGen, plan a migration and use your task set to prove the new version behaves the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can we combine frameworks, for example LangGraph for control and CrewAI for agents?
&lt;/h3&gt;

&lt;p&gt;Yes, but every extra framework adds upgrades to track and another place where state can live. If you combine them, have one of them own the saved state and approvals, and keep tools behind a shared interface so neither framework controls access directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long should a framework comparison take?
&lt;/h3&gt;

&lt;p&gt;Long enough to run every task in your set, including crash and delayed-approval cases, on each framework. Keep the scope to one real workflow, not a platform-wide review. A narrow comparison with agreed pass/fail criteria tells you more than a broad one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the framework handle agent security for us?
&lt;/h3&gt;

&lt;p&gt;No. Frameworks give you building blocks such as approval pauses and checkpoints. Permissions, approval checks tied to exact actions and audit records are your design decisions. Enforce them in the tool layer and test them with injected instructions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which LLM should we use when comparing frameworks?
&lt;/h3&gt;

&lt;p&gt;Use the model you expect to run in production, and pin its version so it is the same across all frameworks. If you haven't chosen a model yet, run a separate model evaluation first. Otherwise you can't tell whether a difference in results comes from the framework or the model.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article first appeared on &lt;a href="https://calidadinfotech.com/blog/langgraph-crewai-autogen-production-comparison" rel="noopener noreferrer"&gt;Calidad Infotech&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>langgraph</category>
      <category>crewai</category>
      <category>autogen</category>
      <category>microsoftagentframework</category>
    </item>
    <item>
      <title>CI/CD Security Gates for AI-Written Code</title>
      <dc:creator>Samay Thakkar</dc:creator>
      <pubDate>Thu, 12 Nov 2026 08:26:22 +0000</pubDate>
      <link>https://dev.to/samaythakkar/cicd-security-gates-for-ai-written-code-441i</link>
      <guid>https://dev.to/samaythakkar/cicd-security-gates-for-ai-written-code-441i</guid>
      <description>&lt;p&gt;AI-written code needs four security gates before it merges: secrets scanning, static analysis (SAST) on the changed code, dependency scanning for new packages and a required senior review. Run all four on every pull request. Block the merge only when a finding is both high-confidence and high-severity, warn on everything else, and keep every result as release evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What security gates does AI-written code need before merge?
&lt;/h2&gt;

&lt;p&gt;It needs the same gates as code a person wrote, but they have to be enforced, not left optional. AI coding assistants write code that compiles and looks clean, yet &lt;a href="https://www.veracode.com/blog/2026-genai-code-security-report-ai-risk/" rel="noopener noreferrer"&gt;Veracode's 2026 GenAI Code Security Report&lt;/a&gt; found that about 44% of AI code generation tasks introduced a risky vulnerability. The average security pass rate across models was 56%, almost unchanged from the first report. A &lt;a href="https://www.securityinformed.com/news/veracode-ai-generated-code-security-improves-co-4941-ga.1793348306.html" rel="noopener noreferrer"&gt;later update covered in the trade press&lt;/a&gt; still found vulnerabilities in 38% of tasks.&lt;/p&gt;

&lt;p&gt;The risk is not the same in every language. In the same Veracode report, Java code passed security tests far less often than Python, JavaScript or C#.&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Fsecurity-gates-cicd-ai-written-code-diagram-1.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Fsecurity-gates-cicd-ai-written-code-diagram-1.svg" alt="Security pass rate of AI-generated code by language, Veracode 2026 GenAI Code Security Report" width="100" height="71.42857142857143"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Security pass rate of AI-generated code by language, Veracode 2026 GenAI Code Security Report&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Secrets are the second problem. In a GitGuardian sample of about 20,000 repositories where Copilot was active, &lt;a href="https://blog.gitguardian.com/yes-github-copilot-can-leak-secrets/" rel="noopener noreferrer"&gt;6.4% leaked at least one secret&lt;/a&gt;. The minimum gate set is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Secrets scanning&lt;/strong&gt;, before the code reaches the remote and again in CI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SAST&lt;/strong&gt; on the diff, so injection, weak crypto and unsafe deserialisation are caught in the lines the assistant wrote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency scanning (SCA)&lt;/strong&gt; for every package added or upgraded, including a check that the package exists in your approved registry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Required human review&lt;/strong&gt; from a code owner who understands the module.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Our &lt;a href="https://calidadinfotech.com/services/quality-engineering" rel="noopener noreferrer"&gt;Quality Engineering&lt;/a&gt; work follows the same rule: tests, security checks and senior review on every change, whether a person or an AI wrote it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which checks belong on every pull request and which only on release?
&lt;/h2&gt;

&lt;p&gt;Run fast, diff-scoped checks on every pull request. Save the slow checks that need the whole system for the release pipeline or a nightly run.&lt;/p&gt;

&lt;p&gt;A pull request gate should finish while the author still has the context. A release gate can take longer, because it looks at the built artefact and the running system.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Pull request&lt;/th&gt;
&lt;th&gt;Release&lt;/th&gt;
&lt;th&gt;Default action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Secrets scan (pre-commit + CI)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Full history scan&lt;/td&gt;
&lt;td&gt;Block on verified secret&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SAST on changed files&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Full repo scan&lt;/td&gt;
&lt;td&gt;Block new critical/high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency scan (new/changed packages)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Full SBOM scan&lt;/td&gt;
&lt;td&gt;Block critical CVE with a fix available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure-as-code scan&lt;/td&gt;
&lt;td&gt;Yes, if IaC changed&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Block policy violations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Required code owner review&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Block until approved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container image scan&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Block critical with a fix available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DAST against staging&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Warn, triage before release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Licence compliance&lt;/td&gt;
&lt;td&gt;Warn&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Route to owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SBOM generation&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Store as evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your pipeline also deploys infrastructure, our guide to &lt;a href="https://calidadinfotech.com/blog/infrastructure-as-code-security-ci-cd" rel="noopener noreferrer"&gt;infrastructure as code security in CI/CD&lt;/a&gt; covers scanning plans on each pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you configure SAST, dependency and secrets scanning in CI/CD?
&lt;/h2&gt;

&lt;p&gt;Run each scanner as its own named CI job. Each one scans only what changed, writes results in a standard format and reports a pass or fail status that the branch rules can check.&lt;/p&gt;

&lt;p&gt;The pull request flow, from the engineer's commit to the merge:&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Fsecurity-gates-cicd-ai-written-code-diagram-2.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Fsecurity-gates-cicd-ai-written-code-diagram-2.svg" alt="How a change written with an AI assistant passes the hook, CI scanners and code owner before merge" width="1118" height="501"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How a change written with an AI assistant passes the hook, CI scanners and code owner before merge&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SAST setup&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the scanner in diff-aware mode on pull requests and report only new findings. Pre-existing findings go into a baseline and a backlog, so authors aren't blocked for code they didn't touch.&lt;/li&gt;
&lt;li&gt;Output SARIF so findings appear inline on the pull request.&lt;/li&gt;
&lt;li&gt;Add rules for the patterns assistants tend to repeat in your codebase, such as string-built SQL queries or disabled TLS checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dependency setup&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scan the lockfile diff, not just the manifest.&lt;/li&gt;
&lt;li&gt;Fail a new dependency that isn't on your internal registry or allow-list. Assistants can suggest packages that don't exist or that nobody has vetted.&lt;/li&gt;
&lt;li&gt;Pin versions and let an update bot open the upgrade pull requests, so each upgrade goes through the same gates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Secrets setup&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a pre-commit hook on developer machines. Then turn on server-side protection: GitHub's &lt;a href="https://docs.github.com/en/code-security/how-tos/secure-your-secrets/prevent-future-leaks/enable-push-protection" rel="noopener noreferrer"&gt;push protection&lt;/a&gt; blocks pushes that contain secrets and raises an alert whenever someone bypasses the block.&lt;/li&gt;
&lt;li&gt;Scan the full history again in CI on release branches.&lt;/li&gt;
&lt;li&gt;When a secret is found, rotate it first. Removing the line doesn't make a leaked key safe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Name every job uniquely. GitHub warns that &lt;a href="https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches" rel="noopener noreferrer"&gt;reusing job names across workflows&lt;/a&gt; can produce ambiguous status results and block merges.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you enforce policy so a failing scan blocks the merge?
&lt;/h2&gt;

&lt;p&gt;Make the scanner jobs required status checks on the protected branch, so that the platform blocks the merge, not the author.&lt;/p&gt;

&lt;p&gt;On GitHub, &lt;a href="https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/available-rules-for-rulesets" rel="noopener noreferrer"&gt;rulesets&lt;/a&gt; can require status checks to pass before merging. A code scanning rule can also block a pull request when a required tool finds an alert at or above a severity you set. The same page lists a rule that requires secret scanning alerts to be resolved, which is currently in public preview. Other platforms have equivalent merge checks. Turn on "require a pull request", "require code owner review" and "require branches to be up to date" alongside them.&lt;/p&gt;

&lt;p&gt;Then decide, for each finding, whether to block or warn:&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Fsecurity-gates-cicd-ai-written-code-diagram-3.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Fsecurity-gates-cicd-ai-written-code-diagram-3.svg" alt="Decision path that turns a scan finding on a pull request into block, warn or a logged exception" width="625" height="1200"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Decision path that turns a scan finding on a pull request into block, warn or a logged exception&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Three rules keep the gate credible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Block on high confidence only.&lt;/strong&gt; A gate that fails on noise teaches engineers to bypass it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody bypasses alone.&lt;/strong&gt; Admin overrides should need a second person, and every override is recorded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat AI reviewers as advisory.&lt;/strong&gt; An AI review bot is useful as an extra pair of eyes, but it shouldn't count as the required approval. We explain why in &lt;a href="https://calidadinfotech.com/blog/ai-code-review-security-catches-misses" rel="noopener noreferrer"&gt;what AI code review catches and misses&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who owns exceptions and how are they logged as release evidence?
&lt;/h2&gt;

&lt;p&gt;The code owner of the affected module and a named security lead own each exception together. Every exception is time-boxed and recorded in the same place as the scan results.&lt;/p&gt;

&lt;p&gt;An exception record should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the finding ID and severity&lt;/li&gt;
&lt;li&gt;why it can't be fixed now&lt;/li&gt;
&lt;li&gt;the compensating control, such as a WAF rule or a feature flag that's turned off&lt;/li&gt;
&lt;li&gt;the two approvers&lt;/li&gt;
&lt;li&gt;an expiry date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store it as a file in the repository or as a ticket linked from the pull request, not in a chat thread.&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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Fsecurity-gates-cicd-ai-written-code-diagram-4.svg" 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%2Fcalidadinfotech.com%2Fblog%2Fimg%2Fsecurity-gates-cicd-ai-written-code-diagram-4.svg" alt="Lifecycle of one security exception from request to fix, rejection or renewal" width="514" height="510"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Lifecycle of one security exception from request to fix, rejection or renewal&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For each release, put together one evidence bundle tied to the commit SHA:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SAST, dependency and secrets results (SARIF or JSON)&lt;/li&gt;
&lt;li&gt;the SBOM&lt;/li&gt;
&lt;li&gt;container and DAST results&lt;/li&gt;
&lt;li&gt;review approvals&lt;/li&gt;
&lt;li&gt;open exceptions with their expiry dates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This maps cleanly to NIST's &lt;a href="https://csrc.nist.gov/projects/ssdf" rel="noopener noreferrer"&gt;Secure Software Development Framework (SP 800-218)&lt;/a&gt;. NIST has also finalised SP 800-218A, which adds practices specific to generative AI. When an auditor or customer asks how a release was checked, you hand over the bundle instead of rebuilding the story.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you tell whether the gates are slowing delivery too much?
&lt;/h2&gt;

&lt;p&gt;Track gate time, false positives and bypasses alongside delivery and stability metrics. The gates are too slow when lead time rises and change failure rate doesn't fall.&lt;/p&gt;

&lt;p&gt;This matters because AI speed alone doesn't make delivery better. The &lt;a href="https://dora.dev/research/2024/dora-report/" rel="noopener noreferrer"&gt;2024 DORA report&lt;/a&gt; found that AI adoption raises individual productivity but hurts delivery stability and throughput. It concludes that fundamentals like small batches and robust testing still matter. &lt;a href="https://redmonk.com/rstephens/2024/11/26/dora2024/" rel="noopener noreferrer"&gt;RedMonk's summary&lt;/a&gt; of the report puts the estimate at a 7.2% drop in stability for every 25% increase in AI adoption.&lt;/p&gt;

&lt;p&gt;Watch five signals each month:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;PR gate duration (p50 and p90).&lt;/strong&gt; Set a time budget and treat going over it as a defect in the pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;False positive rate per rule.&lt;/strong&gt; Tune or remove rules that are mostly dismissed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bypass and exception count.&lt;/strong&gt; A rising count means a gate is too strict or the code is getting worse. Find out which.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lead time for changes.&lt;/strong&gt; If it rises after a gate goes live, find the slowest job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change failure rate and escaped vulnerabilities.&lt;/strong&gt; These show whether the gates are catching anything.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If gates are slow, the usual fixes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scan only the diff&lt;/li&gt;
&lt;li&gt;run scanner jobs in parallel&lt;/li&gt;
&lt;li&gt;cache dependency databases&lt;/li&gt;
&lt;li&gt;move full scans to nightly or release runs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't make the block threshold looser to save time. Our guide to &lt;a href="https://calidadinfotech.com/blog/dora-metrics-when-ai-writes-code" rel="noopener noreferrer"&gt;DORA metrics when AI writes your code&lt;/a&gt; shows how to read these numbers together.&lt;/p&gt;

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

&lt;p&gt;Start with the four pull request gates: secrets, diff-scoped SAST, dependency checks and code owner review. Make them required status checks. Block only on verified secrets and new high-severity findings, record every exception with an owner and an expiry date, and bundle the results as evidence for each release. Then measure gate time next to stability, so security stays a check on speed rather than a brake.&lt;/p&gt;

&lt;p&gt;Our &lt;a href="https://calidadinfotech.com/consulting/security-devsecops" rel="noopener noreferrer"&gt;Security &amp;amp; DevSecOps&lt;/a&gt; practice finds the gaps in your pipeline, ranks them by risk and builds these checks into it, starting with a paid pilot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want these gates in your pipeline?&lt;/strong&gt; &lt;a href="https://calidadinfotech.com/contact-us" rel="noopener noreferrer"&gt;Talk to an engineering lead →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should AI-written code have stricter gates than code a person wrote?
&lt;/h3&gt;

&lt;p&gt;Use the same gates and thresholds for all code, and enforce them without exceptions for AI output. Separate rules for AI code are hard to apply, because most changes mix human and assistant edits. What changes is volume: more code per engineer means the automated gates and the required review carry more of the load.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can an AI code reviewer replace the human approval gate?
&lt;/h3&gt;

&lt;p&gt;No. Treat AI review as an extra advisory check that comments on the pull request. The required approval should come from a code owner who understands the module and can answer for the change.&lt;/p&gt;

&lt;h3&gt;
  
  
  What should we do with the thousands of findings already in our codebase?
&lt;/h3&gt;

&lt;p&gt;Baseline them so pull request gates report only new findings in changed code. Then rank the existing backlog by severity and exposure, and fix it in small, gated changes. Blocking every pull request on old findings mostly teaches people to bypass the gate.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long should a pull request security gate take?
&lt;/h3&gt;

&lt;p&gt;Set an explicit time budget for your team and track p50 and p90 gate duration against it. If the gate goes over budget, fix the pipeline: scan only the diff, run jobs in parallel, cache scanner databases, and move full scans to nightly or release runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  What counts as release evidence for a security audit?
&lt;/h3&gt;

&lt;p&gt;A bundle tied to the release commit: SAST, dependency and secrets results, the SBOM, container and DAST results, review approvals, and any open exceptions with owners and expiry dates. Keeping it per release lets you show exactly how a given version was checked.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article first appeared on &lt;a href="https://calidadinfotech.com/blog/security-gates-cicd-ai-written-code" rel="noopener noreferrer"&gt;Calidad Infotech&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devsecops</category>
      <category>cicd</category>
      <category>aiwrittencode</category>
      <category>sast</category>
    </item>
  </channel>
</rss>
