<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[DevSecOps &amp; AI - Medium]]></title>
        <description><![CDATA[The place where DevSecOps &amp; AI unite. - Medium]]></description>
        <link>https://medium.com/devsecops-ai?source=rss----e726ed424e13---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>DevSecOps &amp;amp; AI - Medium</title>
            <link>https://medium.com/devsecops-ai?source=rss----e726ed424e13---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 08:59:44 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/devsecops-ai" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Agents Read, Humans Press the Button: What a Year of Agentic DevOps Actually Proved]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/devsecops-ai/agents-read-humans-press-the-button-what-a-year-of-agentic-devops-actually-proved-b36f2c657ae0?source=rss----e726ed424e13---4"><img src="https://cdn-images-1.medium.com/max/2600/1*hW4Nba-_OwqjQ4bmTuxMXA.jpeg" width="2816"></a></p><p class="medium-feed-snippet">Why AI-generated Terraform keeps failing, why AI changelogs keep winning, and what the difference teaches us about unit economics.</p><p class="medium-feed-link"><a href="https://medium.com/devsecops-ai/agents-read-humans-press-the-button-what-a-year-of-agentic-devops-actually-proved-b36f2c657ae0?source=rss----e726ed424e13---4">Continue reading on DevSecOps &amp; AI »</a></p></div>]]></description>
            <link>https://medium.com/devsecops-ai/agents-read-humans-press-the-button-what-a-year-of-agentic-devops-actually-proved-b36f2c657ae0?source=rss----e726ed424e13---4</link>
            <guid isPermaLink="false">https://medium.com/p/b36f2c657ae0</guid>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <dc:creator><![CDATA[Tim Urista | Senior Cloud Engineer]]></dc:creator>
            <pubDate>Mon, 31 Aug 2026 17:32:56 GMT</pubDate>
            <atom:updated>2026-08-31T17:32:54.924Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[One hundred sixty-five encounters, fifty-one years, one clean billable cycle]]></title>
            <link>https://medium.com/devsecops-ai/one-hundred-sixty-five-encounters-fifty-one-years-one-clean-billable-cycle-fd25b925da7c?source=rss----e726ed424e13---4</link>
            <guid isPermaLink="false">https://medium.com/p/fd25b925da7c</guid>
            <category><![CDATA[medical-coding]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[healthtech]]></category>
            <category><![CDATA[medtech]]></category>
            <dc:creator><![CDATA[Edan Harr]]></dc:creator>
            <pubDate>Mon, 17 Aug 2026 05:16:39 GMT</pubDate>
            <atom:updated>2026-08-17T05:16:37.769Z</atom:updated>
            <content:encoded><![CDATA[<h3>I wanted to see what happened when AICD-10 had to reconcile a patient history that was too long to think about as a normal chart.</h3><p>This record spanned 1975 to 2026 and included 165 billing encounters over 51 years.</p><p>With a chart this large, the challenge is whether it can maintain the relationships between conditions across decades of patient history, distinguish current clinical relevance from historical noise, and still produce something coherent enough to move through a single coding cycle.</p><p>For this test, we carried the record all the way through to submission. In a live patient environment, a longitudinal record like this would continue accumulating new encounters and documentation rather than truly reaching an end state.</p><p>This record comes from our working corpus of more than one million records, which includes de-identified Stanford Medicine data alongside longitudinal records generated by Synthea from MITRE. Every record was de-identified before entering our pipeline. No PHI is present, and no identifiers were retained. Every number in this case study came directly from the end-to-end production run; none of the results were estimated.</p><p>The patient record was for a 68-year-old female with 26 active diagnoses, 50 procedures, 15 immunizations, three active medications, seven source documents, and 165 billing encounters.</p><p>The first question was whether the system could keep relationships intact across decades of history. A chart with 165 encounters naturally contains repeated diagnoses, changing terminology, incomplete documentation, historical conditions, and information that may have been clinically relevant decades apart.</p><p>The clearest example involved diabetes and its downstream complications.</p><p>AICD-10 recommended E11.22, type 2 diabetes with diabetic chronic kidney disease, at 90% confidence, connected to N18.1, stage 1 chronic kidney disease, at 95%.</p><p>It also recommended E11.40, type 2 diabetes with diabetic neuropathy, at 95%, connected to G63.0, diabetic polyneuropathy, also at 95%.</p><p>The system then surfaced N08, glomerular disorders in diseases classified elsewhere, at 80% confidence. The system had to maintain enough context across the longitudinal record to determine that these conditions were related rather than simply separate diagnoses that happened to exist in the same chart.</p><p>Across the final recommendation set, the engine produced 100 evidence citations for 39 recommendations, or roughly 2.5 evidence references per recommendation. That was the densest evidence trail we had measured in the corpus.</p><p>This chart also gave us a useful example of information the system could derive rather than simply copy. The patient’s extracted vitals were 167 centimeters and 93.7 kilograms, producing a BMI of approximately 33.6.</p><p>From those measurements, the system recommended Z68.33, BMI 33.0–33.9, at 95% confidence, alongside E66.9 for obesity. Nobody manually entered the BMI category for the test. The system used information it had already extracted from the chart and carried that information forward into the coding workflow.</p><p>The record also contained years of behavioral and social context. AICD-10 surfaced F41.0 for panic disorder at 90% confidence, F43.9 for reaction to severe stress at 80%, Z60.2 for problems related to living alone at 95%, and Z56.89 for other employment problems at 80%.</p><p>On a record this large, filtering bad information was just as important as finding good information. In this case, four recommendations were rejected.</p><p>R73.03, prediabetes, came through at 60% confidence, but it conflicted with the stronger confirmed diabetes chain already established elsewhere in the record. I48.91, atrial fibrillation, came through at 30%. R09.1, pleurisy, came through at 20%. M25.70, osteophyte, came through at 10%. All four were rejected.</p><p>That was important for this particular test because the longer the chart becomes, the easier it is for old or weak signals to start accumulating. By the end of the coding review, 35 recommendations were accepted, and four were rejected.</p><p>The documentation side of the workflow was substantially larger than in our earlier tests. The record started with 22 open documentation gaps, including three high-severity and two medium-severity gaps. For this test, all 22 were carried through resolution.</p><p>Each gap ultimately resulted in a provider-signed note, growing the document set from seven source documents to twenty-nine. The final record contained 27 notes, one lab, and one EHR export.</p><p>In a live longitudinal workflow, this would likely happen over multiple patient interactions rather than in one closed testing cycle.</p><p>The final state was 100% documentation completeness, 98% coding confidence, low audit risk, zero open gaps, zero open alerts, and submitted status.</p><p>Overall, this case gave us a much clearer benchmark for how AICD-10 handles long-term patient history and whether its reconciliation logic remains consistent as the amount of underlying documentation increases.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fd25b925da7c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/devsecops-ai/one-hundred-sixty-five-encounters-fifty-one-years-one-clean-billable-cycle-fd25b925da7c">One hundred sixty-five encounters, fifty-one years, one clean billable cycle</a> was originally published in <a href="https://medium.com/devsecops-ai">DevSecOps &amp; AI</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Twenty-nine active diagnoses, seven open gaps, and a chart that closed at 98% coding confidence]]></title>
            <link>https://medium.com/devsecops-ai/twenty-nine-active-diagnoses-seven-open-gaps-and-a-chart-that-closed-at-98-coding-confidence-5e62571c87c3?source=rss----e726ed424e13---4</link>
            <guid isPermaLink="false">https://medium.com/p/5e62571c87c3</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[medtech]]></category>
            <category><![CDATA[healthtech]]></category>
            <category><![CDATA[medical-coding]]></category>
            <dc:creator><![CDATA[Edan Harr]]></dc:creator>
            <pubDate>Fri, 14 Aug 2026 07:26:32 GMT</pubDate>
            <atom:updated>2026-08-17T04:55:55.600Z</atom:updated>
            <content:encoded><![CDATA[<h3>I wanted to understand what AICD-10 actually looked like in practice when you put a complex chart through the entire workflow end-to-end. In this case, a complex chart is defined as a multi-page, multi-source patient record.</h3><p>With clean demo records and hand-picked examples with one obvious diagnosis and one obvious code, AICD-10 has been on track 1:1 with the timelines of the real in-field process. I wanted something with multiple touchpoints that could show whether the system was really doing any sort of a marginal improvement when contract-matched against the status quo.</p><p>For the purpose of this test, we mark the patient journey as coming fully to a close. In a real-world example, it would likely remain open in a paused state for future patient interactions.</p><p>This record comes from our working corpus of more than one million records, which includes de-identified Stanford Medicine data alongside longitudinal records generated by Synthea from MITRE. Every record was de-identified before entering our pipeline. No PHI is present, and no identifiers were retained. Every number in this case study was measured from the actual end-to-end run. None of the results were estimated.</p><p>The record used was a 57-year-old patient with 29 active diagnoses, 50 procedures, 15 immunizations, five active medications, and six source documents containing different pieces of the patient history.</p><p>The chart started at 0% documentation completeness, with seven open documentation gaps, and eventually closed at 100% documentation completeness and 98% coding confidence.</p><p>In total, the system generated 31 code recommendations with 44 evidence citations.</p><p>As you can surmise, the chart came in with a lot of information, but that did not mean it was complete.</p><p>The first thing AICD-10 did was import the CCDA and structure what was already available in the record. Demographics, vitals, medications, smoking status, language, height, weight, BMI, diagnoses, procedures, and the rest of the available chart information were brought into the workflow automatically.</p><p>This is something we had previously run into with imported records, where information could technically exist in the source document but not make it far enough into the derived workflow to count toward documentation completeness or downstream scoring.</p><p>Once the chart was structured, there was plenty of clinical information available, but the chart still started at 0% documentation completeness.</p><p>One of the clearest examples in this chart was type 2 diabetes.</p><p>A basic coding pass could have stopped at E11.9, type 2 diabetes without complications. The patient clearly had diabetes, so the generic code would have been easy to justify if you were simply looking for the first supported answer.</p><p>In reality, the complication evidence was spread across different parts of the record. AICD-10 pulled those pieces together and recommended E11.22 for type 2 diabetes with diabetic chronic kidney disease and E11.40 for type 2 diabetes with diabetic neuropathy. Both came through at 100% confidence.</p><p>The record also supported N18.1 for stage 1 chronic kidney disease and E88.81 for metabolic syndrome.</p><p>A human coder can obviously reconcile information across a patient record and use those relationships to determine how specific the coding can actually be. The question we are trying to answer is whether software can make that reconciliation consistent across every chart, especially when supporting information is spread across multiple documents and multiple points in the patient’s history. In this case, it did.</p><p>It also surfaced information that would be easy to pass over when working through a large queue.</p><p>The chart had several social and contextual factors supported in the record. The system surfaced education and literacy problems, unemployment, other employment problems, social exclusion and rejection, the death of a family member, and confirmed adult physical abuse.</p><p>Some came through at very high confidence, while others were more borderline. Every recommendation also had evidence tied back to the underlying chart.</p><p>Importantly, it did not try to force every recommendation through. This is something I have been watching closely as we test AICD-10. If an AI coding system gets rewarded simply because it finds more codes, you can very quickly create the wrong incentive.</p><p>In this chart, four recommendations were ultimately rejected because the evidence was not strong enough to support them.</p><p>Z55.1, schooling unavailable and unattainable, came through at 60% confidence. Z62.822, parent-foster child conflict, was also at 60%. R53.81, other malaise, came through at 50%, and CPT 99173, visual acuity screening, came through at 60%. All four were rejected.</p><p>There was also a recommendation for F41.0, panic disorder, that stayed proposed rather than being moved forward.</p><p>There was evidence in the record pointing toward it, but the evidence density was not strong enough for the system to treat it the same way it treated the higher-confidence recommendations.</p><p>The chart started with seven open documentation gaps, including two considered high severity.</p><p>In this workflow, those seven gaps remained attached to the patient journey until they were resolved. Each one eventually resulted in a provider-signed note, and as the documentation cycle continued, the number of source documents grew from six to thirteen. For this test, we closed all seven.</p><p>In a real patient journey, that process would not necessarily happen all at once. The chart may remain paused while the practice waits for a provider response, follow-up appointment, additional documentation, or the next patient interaction.</p><p>We also did not want the reviewer to be able to click past unfinished work. The final submission process has six gates, all enforced server-side.</p><p>Documentation completeness has to be at 100%. The documentation cycle has to be closed. Coding confidence has to meet the required threshold. Audit risk cannot be high. There cannot be any open documentation gaps, and there cannot be any open alerts. The reviewer cannot override those conditions from the review screen.</p><p>You can tell someone a chart is 72% complete or that there are two unresolved high-severity gaps, but if there is still a button underneath that allows the chart to be submitted anyway, the system is not really enforcing anything. In this case, the chart stayed open until all of those conditions were met.</p><p>The chart started with six source documents and finished with thirteen. It started at 0% documentation completeness and finished at 100%. The coding workflow generated 31 recommendations. Twenty-six were accepted, four were rejected, and one remained proposed. The final coding confidence was 98%.</p><p>To accomplish this, the system had to structure the source record correctly, reconcile information across multiple documents, recognize when the chart supported more specific combination coding, surface less obvious information that could have been missed, identify where documentation was incomplete, keep those gaps open until they were resolved, reject recommendations that were not supported strongly enough, and prevent the chart from closing until the remaining work was actually finished.</p><p>Overall, this case gave us a much clearer view of how AICD-10 behaves across a complete patient journey and how the workflow holds up under more complex, longitudinal documentation.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5e62571c87c3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/devsecops-ai/twenty-nine-active-diagnoses-seven-open-gaps-and-a-chart-that-closed-at-98-coding-confidence-5e62571c87c3">Twenty-nine active diagnoses, seven open gaps, and a chart that closed at 98% coding confidence</a> was originally published in <a href="https://medium.com/devsecops-ai">DevSecOps &amp; AI</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Agent That Spent Its Way Out of the Sandbox]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/devsecops-ai/the-agent-that-spent-its-way-out-of-the-sandbox-83a5e05fcb94?source=rss----e726ed424e13---4"><img src="https://cdn-images-1.medium.com/max/1600/1*_L3hanxq0tFngz8sIbhv9g.png" width="1600"></a></p><p class="medium-feed-snippet">Reward hacking showed up on an invoice before it showed up in a security alert. That&#x2019;s the part worth building for.</p><p class="medium-feed-link"><a href="https://medium.com/devsecops-ai/the-agent-that-spent-its-way-out-of-the-sandbox-83a5e05fcb94?source=rss----e726ed424e13---4">Continue reading on DevSecOps &amp; AI »</a></p></div>]]></description>
            <link>https://medium.com/devsecops-ai/the-agent-that-spent-its-way-out-of-the-sandbox-83a5e05fcb94?source=rss----e726ed424e13---4</link>
            <guid isPermaLink="false">https://medium.com/p/83a5e05fcb94</guid>
            <category><![CDATA[openai]]></category>
            <category><![CDATA[infrastructure]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[finops]]></category>
            <dc:creator><![CDATA[Tim Urista | Senior Cloud Engineer]]></dc:creator>
            <pubDate>Sun, 09 Aug 2026 04:51:37 GMT</pubDate>
            <atom:updated>2026-08-09T04:51:35.826Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Chagu Common Protocol: Uniting Security Tools Under One Reasoning Layer]]></title>
            <link>https://medium.com/devsecops-ai/chagu-common-protocol-uniting-security-tools-under-one-reasoning-layer-b5afe8e84dc3?source=rss----e726ed424e13---4</link>
            <guid isPermaLink="false">https://medium.com/p/b5afe8e84dc3</guid>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[devsecops]]></category>
            <category><![CDATA[software-architecture]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[security-engineering]]></category>
            <dc:creator><![CDATA[Talex Maxim (taimax13) - #barracuda]]></dc:creator>
            <pubDate>Sun, 19 Jul 2026 13:21:21 GMT</pubDate>
            <atom:updated>2026-07-19T13:58:00.150Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_JOSyvib8L3WvfknOjjtgA.png" /></figure><p>Security tooling has a strange problem.</p><p>We have more scanners than ever, but less unified understanding.</p><p>One tool scans containers. Another scans infrastructure-as-code. Another searches repositories for secrets. Another walks HTTP endpoints. Another checks Kubernetes manifests.</p><p>One produces SARIF. Another produces JSON. Another produces XML. Another invents its own severity model.</p><p>Each tool is useful. Together, they often create noise instead of clarity.</p><p>This is where the idea behind Chagu becomes interesting.</p><h3>The Problem Is Not a Lack of Tools</h3><p>Modern engineering teams already have tools: Trivy for containers and dependencies, Opengrep for code patterns, Gitleaks for secrets, Checkov for infrastructure-as-code, Nuclei for vulnerability templates, CodeQL for semantic analysis, ZAP for dynamic testing, plus Kubernetes scanners, CI/CD signals, observability data, and internal detectors.</p><p>The problem is not that we need one more scanner.</p><p>The problem is that every scanner speaks a different language. Each has different inputs, outputs, severity labels, evidence formats, confidence models, and remediation styles.</p><p>So teams build glue code again and again. Then the AI layer receives messy evidence and is expected to magically reason over it.</p><p>That is the wrong abstraction.</p><h3>The Chagu Common Protocol</h3><p>Chagu should not try to replace security tools. Chagu should unite them.</p><p>The idea is simple:</p><pre>Third-party tool<br>      ↓<br>Chagu adapter<br>      ↓<br>Normalized finding<br>      ↓<br>Reasoning and correlation<br>      ↓<br>Policy<br>      ↓<br>Action</pre><p>Instead of asking an LLM to understand every scanner, CLI, and output format directly, Chagu defines a common protocol. Every tool gets an adapter. Every adapter emits the same normalized structure.</p><p>The reasoning layer does not need to know whether a finding came from Trivy, Nuclei, Opengrep, Gitleaks, CodeQL, or an internal scanner. It only needs to understand the Chagu finding contract.</p><p>Today, the ecosystem often looks like this:</p><pre>Nuclei   → JSON A<br>Trivy    → JSON B<br>Opengrep  → JSON C<br>Gitleaks → JSON D<br>CodeQL   → SARIF<br>ZAP      → XML</pre><p>Chagu turns that into:</p><pre>Nuclei   → Chagu Finding<br>Trivy    → Chagu Finding<br>Opengrep  → Chagu Finding<br>Gitleaks → Chagu Finding<br>CodeQL   → Chagu Finding<br>ZAP      → Chagu Finding</pre><p>The important part is not the scanner. The important part is the contract.</p><p>A normalized finding could look like this:</p><pre>{<br>  &quot;finding_id&quot;: &quot;finding-123&quot;,<br>  &quot;asset&quot;: &quot;payments-api&quot;,<br>  &quot;asset_type&quot;: &quot;repository&quot;,<br>  &quot;category&quot;: &quot;secret_exposure&quot;,<br>  &quot;severity&quot;: &quot;critical&quot;,<br>  &quot;confidence&quot;: 0.97,<br>  &quot;evidence&quot;: {<br>    &quot;file&quot;: &quot;src/config.py&quot;,<br>    &quot;line&quot;: 42<br>  },<br>  &quot;source&quot;: {<br>    &quot;tool&quot;: &quot;gitleaks&quot;,<br>    &quot;rule_id&quot;: &quot;generic-api-key&quot;,<br>    &quot;raw_evidence_ref&quot;: &quot;evidence://scan-991/result-17&quot;<br>  },<br>  &quot;remediation&quot;: {<br>    &quot;type&quot;: &quot;code_change&quot;,<br>    &quot;suggested_action&quot;: &quot;Remove the hardcoded secret and rotate the credential&quot;<br>  }<br>}</pre><p>The normalized fields provide consistency. The source reference preserves the original scanner output.</p><p>That matters. Normalization should remove format chaos without destroying provenance.</p><h3>The Real Value Is Correlation</h3><p>Converting six formats into one is useful, but it is not enough to justify a new system.</p><p>The stronger reason is that normalized findings can be correlated across tools.</p><p>Imagine that Gitleaks reports an exposed AWS key. Checkov reports publicly accessible storage. Cloud telemetry shows an unusual access pattern. The service catalog says the affected asset belongs to the Payments team and runs in production.</p><p>No individual tool can see the complete situation.</p><p>Chagu can:</p><blockquote><em>A production payment service contains an exposed cloud credential associated with public storage and anomalous runtime access. Rotate the credential immediately, review access, and notify the owning team.</em></blockquote><p>That is not a fifth scanner result. It is a conclusion created by connecting four pieces of evidence.</p><p>This is where Chagu becomes more than a translation layer. It becomes a shared reasoning surface above the security ecosystem.</p><h3>LLMs Should Reason, Not Crawl</h3><p>This is the part worth being precise about, because it is easy to get backwards.</p><p>The temptation is to hand an LLM everything — raw scanner output, log dumps, inconsistent JSON, half-parsed YAML — and ask it to “figure out what matters.”</p><p>That is not reasoning. It is asking a language model to do the work of a parser, badly, with no guarantee of consistency between two runs.</p><p>An LLM crawling heterogeneous output has to rediscover structure every time. What is the severity field called here? Does “critical” from Nuclei mean the same thing as “critical” from Checkov? Is this a duplicate of something another scanner reported differently?</p><p>None of that is reasoning about risk. It is ad hoc parsing wearing a reasoning costume.</p><p>Worse, it can fail silently. The result may sound like a credible triage decision while actually reflecting how the input happened to be formatted that day.</p><p>The Chagu Common Protocol draws a hard line above that layer. Adapters absorb the format chaos once, at the edge. The reasoning layer receives the same shape, the same semantics, and the same provenance model every time.</p><p>Now the LLM can reason about the questions that matter: Is this real? Is it exploitable? Is it a duplicate? What other evidence supports it? Who owns it? What should happen next?</p><h3>The Protocol Solves Format. The Log Solves Memory.</h3><p>Normalization alone is not sufficient.</p><p>A finding contract tells the reasoning layer what a piece of evidence means. It does not tell the system what Chagu concluded, which context produced that conclusion, whether the risk was accepted, or what happened after an action was requested.</p><p>Without durable history, the system re-litigates the same finding on every scan. “Is this a duplicate?” and “Did we already accept this risk?” become new guesses instead of lookups.</p><p>That is the job of the Semantic Write-Ahead Log.</p><p>The log is not one hop between normalization and reasoning. It is a parallel backbone to which every stage appends:</p><pre>Normalized finding ───────→ FINDING_RECEIVED<br>Reasoning verdict ────────→ VERDICT_RECORDED<br>Policy decision ──────────→ ACTION_DECIDED<br>Execution result ─────────→ ACTION_COMPLETED<br>Human correction ─────────→ VERDICT_OVERRIDDEN</pre><p>This gives Chagu durability and meaning. But what about truth?</p><p>An append-only log cannot guarantee that every recorded claim is true. A scanner can be wrong. A model can be wrong. Two verdicts can conflict. What the log guarantees is that the system never loses what was claimed, why it was claimed, or what happened next.</p><p>Current truth is resolved above the log as an authoritative projection. Verified evidence can outrank inference. A successful action can supersede a planned one. A human decision can override a model verdict. Newer evidence can invalidate an older conclusion without erasing it.</p><p>So Truth does not mean pretending the latest event is infallible. It means having an explicit, reproducible way to determine what the system currently accepts as true — and being able to trace that state back through every supporting or conflicting event.</p><p>The protocol gives evidence structure. The Semantic WAL gives the system memory. The truth projection tells the reasoning layer which version of reality is currently authoritative.</p><h3>Reasoning Recommends. Policy Authorizes.</h3><p>The reasoning layer may conclude that an exposed production credential should be rotated immediately.</p><p>It should not independently decide whether it is allowed to rotate that credential.</p><p>That belongs to a deterministic policy layer.</p><p>Policy can consider the environment, asset criticality, confidence, supporting evidence, organizational rules, maintenance windows, and whether human approval is required.</p><p>The LLM recommends what should happen. Policy determines what may happen. The action layer executes the permitted decision and records the result.</p><p>That boundary is what makes reasoning near production systems useful without making it reckless.</p><h3>One Reasoning Layer, Many Specialized Tools</h3><p>Chagu does not need to compete with Trivy, Semgrep, Nuclei, Gitleaks, CodeQL, or whatever scanner appears next.</p><p>Specialized tools should remain specialized. Their job is to produce reliable evidence.</p><p>Chagu’s job is to give that evidence a shared language, connect it across domains, remember what the system concluded, resolve what it currently accepts as true, and turn judgment into controlled engineering action.</p><p>The future of security automation is not one scanner that does everything.</p><p>It is many specialized tools operating through one coherent reasoning system.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b5afe8e84dc3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/devsecops-ai/chagu-common-protocol-uniting-security-tools-under-one-reasoning-layer-b5afe8e84dc3">Chagu Common Protocol: Uniting Security Tools Under One Reasoning Layer</a> was originally published in <a href="https://medium.com/devsecops-ai">DevSecOps &amp; AI</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Unexpected Costs of Fragmented AI Governance]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/devsecops-ai/unexpected-costs-of-fragmented-ai-governance-d7ce2a5a5834?source=rss----e726ed424e13---4"><img src="https://cdn-images-1.medium.com/max/1280/1*FJPKEABkUC5yOFFw6TAKiw.png" width="1280"></a></p><p class="medium-feed-snippet">As part of my ongoing &#x201C;FinOps for Production AI&#x201D; series, I&#x2019;ve been writing about the costs of AI systems that never show up in the compute&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/devsecops-ai/unexpected-costs-of-fragmented-ai-governance-d7ce2a5a5834?source=rss----e726ed424e13---4">Continue reading on DevSecOps &amp; AI »</a></p></div>]]></description>
            <link>https://medium.com/devsecops-ai/unexpected-costs-of-fragmented-ai-governance-d7ce2a5a5834?source=rss----e726ed424e13---4</link>
            <guid isPermaLink="false">https://medium.com/p/d7ce2a5a5834</guid>
            <category><![CDATA[finops]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[ai-governance]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Tim Urista | Senior Cloud Engineer]]></dc:creator>
            <pubDate>Sun, 12 Jul 2026 16:48:29 GMT</pubDate>
            <atom:updated>2026-07-13T18:58:10.253Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[The FinOps Tax on AI Engineer Salary Premiums]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/devsecops-ai/the-finops-tax-on-ai-engineer-salary-premiums-093b8bc26ceb?source=rss----e726ed424e13---4"><img src="https://cdn-images-1.medium.com/max/1352/1*vu_hL4nZPAnDYD5M0ppAGg.png" width="1352"></a></p><p class="medium-feed-snippet">Part of the ongoing &#x201C;FinOps for Production AI&#x201D; series &#x2014; this one responding to Anubhav&#x2019;s &#x201C;AI Engineers Will OWN 2026&#x2013;2030&#x201D;</p><p class="medium-feed-link"><a href="https://medium.com/devsecops-ai/the-finops-tax-on-ai-engineer-salary-premiums-093b8bc26ceb?source=rss----e726ed424e13---4">Continue reading on DevSecOps &amp; AI »</a></p></div>]]></description>
            <link>https://medium.com/devsecops-ai/the-finops-tax-on-ai-engineer-salary-premiums-093b8bc26ceb?source=rss----e726ed424e13---4</link>
            <guid isPermaLink="false">https://medium.com/p/093b8bc26ceb</guid>
            <category><![CDATA[finops]]></category>
            <category><![CDATA[ai-finops]]></category>
            <category><![CDATA[genai]]></category>
            <category><![CDATA[cloud-finops]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Tim Urista | Senior Cloud Engineer]]></dc:creator>
            <pubDate>Fri, 10 Jul 2026 16:58:51 GMT</pubDate>
            <atom:updated>2026-07-10T16:58:51.730Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Your Gateway Filter Stops the Honest User and Annoys the Attacker — A Threat-Model Read on AI…]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/devsecops-ai/your-gateway-filter-stops-the-honest-user-and-annoys-the-attacker-a-threat-model-read-on-ai-695c22a4ff10?source=rss----e726ed424e13---4"><img src="https://cdn-images-1.medium.com/max/1672/1*XSbrFlwDY0j4pNa4K4GXrg.png" width="1672"></a></p><p class="medium-feed-snippet">Part of the ongoing &#x201C;FinOps for Production AI&#x201D; series &#x2014; though this one is about who you&#x2019;re actually defending against.</p><p class="medium-feed-link"><a href="https://medium.com/devsecops-ai/your-gateway-filter-stops-the-honest-user-and-annoys-the-attacker-a-threat-model-read-on-ai-695c22a4ff10?source=rss----e726ed424e13---4">Continue reading on DevSecOps &amp; AI »</a></p></div>]]></description>
            <link>https://medium.com/devsecops-ai/your-gateway-filter-stops-the-honest-user-and-annoys-the-attacker-a-threat-model-read-on-ai-695c22a4ff10?source=rss----e726ed424e13---4</link>
            <guid isPermaLink="false">https://medium.com/p/695c22a4ff10</guid>
            <category><![CDATA[security]]></category>
            <category><![CDATA[genai]]></category>
            <category><![CDATA[ai-security]]></category>
            <category><![CDATA[azure]]></category>
            <category><![CDATA[generative-ai-security]]></category>
            <dc:creator><![CDATA[Tim Urista | Senior Cloud Engineer]]></dc:creator>
            <pubDate>Thu, 18 Jun 2026 20:08:17 GMT</pubDate>
            <atom:updated>2026-06-18T20:08:15.862Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How Better Snippets Help QA Teams Write Stable Tests Faster]]></title>
            <link>https://medium.com/devsecops-ai/how-better-snippets-help-qa-teams-write-stable-tests-faster-f18e150298c0?source=rss----e726ed424e13---4</link>
            <guid isPermaLink="false">https://medium.com/p/f18e150298c0</guid>
            <category><![CDATA[vscode]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[playwright-test]]></category>
            <category><![CDATA[test-automation]]></category>
            <category><![CDATA[coding]]></category>
            <dc:creator><![CDATA[Abhishek Sahu]]></dc:creator>
            <pubDate>Thu, 14 May 2026 18:34:49 GMT</pubDate>
            <atom:updated>2026-05-14T18:34:47.406Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/893/1*gabMmfZyKuVPstStiJj_kw.png" /></figure><p><strong>Writing Playwright tests is not hard.<br>Writing good Playwright tests consistently is.</strong></p><p>Most teams don’t struggle with syntax — they struggle with <strong>how to write stable tests quickly</strong>.</p><h3>The common problem</h3><p>You’ll often see code like this:</p><pre>await page.click(&#39;Login&#39;);</pre><p>It works, but it’s not reliable.</p><p>Selectors like this are:</p><ul><li>unclear</li><li>fragile</li><li>easy to break</li></ul><p>Now multiply this across hundreds of tests.</p><h3>Why this slows teams down</h3><p>Every time someone writes a test, they have to think:</p><ul><li>Which selector should I use?</li><li>Is this stable?</li><li>Will this break later?</li></ul><p>This decision-making takes time.<br> And different people write tests differently.</p><p>So you end up with:</p><ul><li>inconsistent code</li><li>unstable tests</li><li>more maintenance later</li></ul><h3>What better snippets change</h3><p>Now imagine instead you write:</p><pre>await page.getByRole(&#39;button&#39;, { name: &#39;Login&#39; }).click();</pre><p>This is:</p><ul><li>clearer</li><li>more stable</li><li>aligned with Playwright best practices</li></ul><p>Good snippets remove the thinking part.</p><p>You don’t have to figure out the best approach every time — it’s already there.</p><h3>Real impact in teams</h3><p>With better snippets:</p><ul><li>new testers ramp up faster</li><li>code becomes consistent</li><li>fewer flaky selectors</li><li>less debugging later</li></ul><p>Over time, this saves a lot of effort.</p><h3>Why I built Smart Test Snippet Generator</h3><p>While working on automation, I noticed the same issue:<br> people were writing tests differently, and often not using the best patterns.</p><p>So I built <strong>Smart Test Snippet Generator</strong>.</p><p>It helps generate:</p><ul><li>clean Playwright actions</li><li>better selectors (like role-based ones)</li><li>ready-to-use test code</li></ul><p>Instead of starting from scratch, you get a solid base instantly.</p><h3>Small change, big effect</h3><p>Snippets might feel like a small thing, but they directly affect:</p><ul><li>code quality</li><li>test stability</li><li>team productivity</li></ul><p>When everyone follows better patterns by default, the overall quality improves automatically.</p><h3>Final thought</h3><p>Good automation is not just about writing tests — it’s about writing them the right way, consistently.</p><p>Better snippets make that easier.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f18e150298c0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/devsecops-ai/how-better-snippets-help-qa-teams-write-stable-tests-faster-f18e150298c0">How Better Snippets Help QA Teams Write Stable Tests Faster</a> was originally published in <a href="https://medium.com/devsecops-ai">DevSecOps &amp; AI</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I stopped writing code and started managing AI agents]]></title>
            <link>https://medium.com/devsecops-ai/how-i-stopped-writing-code-and-started-managing-ai-agents-910b78f239de?source=rss----e726ed424e13---4</link>
            <guid isPermaLink="false">https://medium.com/p/910b78f239de</guid>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[vibe-coding]]></category>
            <category><![CDATA[design-thinking]]></category>
            <dc:creator><![CDATA[Sachin Sharma | Cloud & Business Transformation]]></dc:creator>
            <pubDate>Thu, 14 May 2026 06:12:09 GMT</pubDate>
            <atom:updated>2026-05-14T06:12:08.169Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TNMql7wrg4C4jg6s2BijUA.png" /></figure><p><em>Six months of running a multi-agent stack taught me more about engineering judgment than six years of writing code ever did.</em></p><p>I used to measure a good day by lines of code shipped.</p><p>Now I measure it by how well I directed the agents who wrote those lines.</p><p>That shift happened slowly, then all at once. And it changed something fundamental about what I think “being an engineer” actually means.</p><h3>The moment I noticed something had changed</h3><p>It was a Wednesday in November. I was building an IAM (Identity and Access Management) module for a cloud ops platform. A task that, six months earlier, would have meant me: open terminal, write boilerplate, test, push, repeat.</p><p>Instead, I spent about 40 minutes writing a prompt. Describing the context. The constraints. The edge cases I already knew about. The output format I needed.</p><p>Then I handed it to Claude Code and went to make tea.</p><p>When I came back, 80% of the module was done. Solid, readable, mostly correct. The remaining 20% took me another hour of back-and-forth, not writing, but directing. Asking for a different approach here, catching a security assumption there, nudging the agent toward what I actually wanted.</p><p>Total time: under two hours. The same task used to take me a full day.</p><p>I sat back and thought: when exactly did I stop being a coder?</p><h3>What “managing agents” actually looks like in practice</h3><p>This isn’t a theoretical shift. Let me show you what my actual stack looks like on a Tuesday.</p><p>I use six tools in a typical session. Each one has a job:</p><p><strong>Claude Code</strong> handles the heavy reasoning. Architecture decisions, complex refactors, anything where I need the model to hold a lot of context and think carefully. This is the expensive seat at the table, so I protect it.</p><p><strong>Gemini Flash</strong> (via Google AI Pro, which in India came bundled almost free) gets the bulk reads. Long files, large context reviews, any task where I need a model to scan 10,000 lines and tell me what’s relevant. Gemini’s context window here is the point, not its reasoning depth.</p><p><strong>Codex</strong> does the review and testing work. It’s genuinely good at edge cases, catching what breaks, suggesting test coverage I wouldn’t have thought of. Also free for a year in India (longer than I expected, honestly, because I kept waiting for the catch).</p><p><strong>Excalidraw MCP</strong> (Model Context Protocol, the open standard that lets AI tools connect to external services, think of it like USB-C for AI integrations) handles all my diagrams. I describe a system architecture in plain English. The diagram appears. I stopped hand-drawing flows entirely.</p><p><strong>Google Stitch</strong> takes the UI components. Anything visual, any frontend scaffold, that goes to Stitch, not Claude. Stitch MCP integrates directly inside Claude Code, so I don’t even context-switch.</p><p><strong>Slack MCP and ClickUp MCP</strong> close the loop. When a session ends, Slack gets a summary. ClickUp gets the tasks. Nothing falls through the gaps.</p><p>The whole stack cost me roughly the price of my Claude Pro subscription. Everything else was either free or came with plans I already had.</p><h3>The thing nobody tells you about running agents</h3><p>You don’t get better at coding. You get better at thinking.</p><p>Here’s what I mean. When I was writing code myself, I could be vague with myself. I’d start typing and figure it out as I went. The code would evolve. The thinking would happen in the doing.</p><p>Agents don’t work like that.</p><p>If your prompt is vague, the output is vague. If you haven’t thought through the edge cases before you ask, you’ll get something that looks right but breaks in the third scenario. If you don’t specify the constraints upfront, the agent will make assumptions, and those assumptions will be invisible until they cause a problem.</p><p>I’ve shipped broken things because I was lazy with my instructions. Three times in the last four months (which I only know because I keep a log of what broke and why).</p><p>What that forced on me: I now think harder before I type anything. What am I actually trying to build? What are the non-obvious constraints? What would success look like, specifically? What do I not want it to do?</p><p>That’s not a prompting skill. That’s an engineering judgment skill. The agents just made it visible.</p><h3>The routing problem nobody talks about</h3><p>Once you have multiple agents, you have a new problem: which agent gets which task?</p><p>This is genuinely harder than it sounds. I spent about three weeks figuring out my routing logic, and I still adjust it. The rough mental model I use now:</p><p>If the task needs deep reasoning or will have downstream consequences: Claude. If the task is mostly reading, scanning, or summarising large inputs: Gemini. If the task is code review, testing, or edge case thinking: Codex. If the task is visual: Stitch or Excalidraw. If the task is communication or follow-up: Slack and ClickUp MCPs.</p><p>The key word is “mostly.” Real tasks bleed across categories. A refactor needs reasoning (Claude) but also test coverage (Codex). A new feature needs architecture (Claude) but also a UI component (Stitch). Learning to decompose a task into its sub-tasks, then route each sub-task correctly, that’s the new engineering skill.</p><p>I think of it the same way a senior engineering manager thinks about their team. You don’t give your best architect grunt work. You don’t ask your junior to make the hardest call. You match the task to the capability. The only difference is your team is now partly made of AI agents.</p><h3>What this means for anyone building today</h3><p>I want to be direct here, because I see a lot of vague takes on this topic.</p><p>The engineers who will matter in the next three years aren’t the ones who can write the most code. They’re the ones who can:</p><ul><li>Define problems precisely enough for an agent to act on them</li><li>Catch when an agent’s reasoning has gone sideways</li><li>Route the right task to the right tool without wasting compute</li><li>Know which 20% of an agent’s output needs a human eye</li></ul><p>None of those skills come from learning a new framework. They come from building real things with agents, making mistakes, and paying attention.</p><p>I’ve been at this for about six months. I’m still learning the edges of it.</p><p>But the shape of what good engineering looks like has changed for me. Permanently.</p><h3>A note for the leaders reading this</h3><p>If you manage a team, this matters to you too.</p><p>The gap Dario Amodei mentioned last week about SaaS companies potentially going bankrupt if they don’t adopt AI, it’s not a software adoption problem. It’s a mental model problem. Most teams are using AI to do old tasks faster. The ones moving ahead are using AI to do tasks that weren’t possible before, and redesigning their workflows from scratch around what agents can actually do.</p><p>There’s a difference between plugging a faster engine into an old car and building a new vehicle entirely.</p><p>Your team’s job description is changing. The question is whether you’re ahead of that change or catching up to it.</p><h3>The honest version of where I am</h3><p>I’m not going to pretend this transition is smooth. Some days, the agents save me four hours. Some days, I spend two hours debugging a prompt that a half-hour of manual coding would have solved.</p><p>The calculus still clearly favours the agents. But the romanticized version, where AI just handles everything, and you focus purely on strategy, that’s not where we are yet.</p><p>What we have is a messy, powerful middle ground. Agents that are genuinely good at specific things, that break in specific ways, that reward clear thinking and punish lazy instructions.</p><p>I find it more interesting than writing code, honestly.</p><p>And some days, I miss just having a problem and a terminal and nothing in between.</p><p><em>If you’re building with a multi-agent stack and want to compare notes, I’m usually in the comments. What’s in your routing logic?</em></p><p><em>I am Sachin Sharma, building AI-powered cloud operations platforms and writing about agentic AI, DevSecOps, and leadership at the intersection of technology and people. Follow me on Medium and DevSecOps &amp; AI Today. You can find me on LinkedIn at linkedin.com/in/rksachin5.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=910b78f239de" width="1" height="1" alt=""><hr><p><a href="https://medium.com/devsecops-ai/how-i-stopped-writing-code-and-started-managing-ai-agents-910b78f239de">How I stopped writing code and started managing AI agents</a> was originally published in <a href="https://medium.com/devsecops-ai">DevSecOps &amp; AI</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>